分块WA+TLE求助
查看原帖
分块WA+TLE求助
516468
_Give_up_楼主2022/9/10 18:36

分块求调,#1-#7WA,其他TLE\color{black}{\texttt{分块求调,\#1-\#7WA,其他TLE}}样例过了\color{black}{\texttt{样例过了}}

#include<bits/stdc++.h>
#define N 150000

using namespace std;

int read()
{
    int x = 0,f = 1;
    char c = getchar();
    while(c<'0' || c>'9')
    {
        if(c=='-') f = -1;
        c = getchar();
    }
    while(c>='0' && c<='9')
    {
        x = (x<<3)+(x<<1)+(c^48);
        c = getchar();
    }
    return x*f;
}

int a[N],id[N],len,n,m;
set <int> s[N];

int query(int l,int r)
{
	int start=id[l],end=id[r];
	if (start==end)
	{
		set <int> st;
		for (int i=l;i<=r;i++)
			st.insert(a[i]);
		return st.size();
	}
	int ans = 0;
	set <int> st;
	for (int i=l;id[i]==start;i++)
		st.insert(a[i]);
	ans += st.size();
	for (int i=start+1;i<end;i++)
		ans += s[i].size();
	set <int> st2;
	for (int i=r;id[i]==end;i--)
		st2.insert(a[i]);
	ans += st2.size();
	return ans;
}

int main()
{
	n=read(),m=read(),len=sqrt(n);
	for (int i=1;i<=n;i++)
	{
		a[i]=read();
		id[i]=(i-1)/len+1;
		s[id[i]].insert(a[i]);
	}
	while(m--)
	{
		char c;
		cin >> c;
		int x=read(),y=read();
		if (c=='Q') cout << query(x,y) << endl;
		else
		{
			s[id[x]].erase(a[x]);
			s[id[x]].insert(y);
			a[x] = y;
		}
	}
	return 0; 
}
2022/9/10 18:36
加载中...