WA后三个点求助
查看原帖
WA后三个点求助
371848
吴思诚楼主2023/8/2 10:06
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
namespace fstIO{
	const char _fg='\n';
	int _len=0;
	char ibuf[(1<<20)+1],*iS,*iT,_out[(1<<25)+1],_ar[50];
	#define _gh()\
	(iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),\
	(iS==iT?EOF:*iS++):*iS++)
	#define putc(ch) _out[_len++]=ch
	void read(){}
	template<typename Type,typename...Types>
	void read(Type&x,Types&...xs){
		x=0;
		char ch=_gh();
		char t=0;
		while(ch<'0'||ch>'9')t|=ch=='-',ch=_gh();
		while(ch>='0'&&ch<='9')x=x*10+(ch^48),ch=_gh();
		x=t?-x:x;
		read(xs...);
	}
	template<typename Type>
	void write(Type x){
		int tot=0;
		if(!x)putc('0');
		if(x<0)putc('-'),x=-x;
		while(x)_ar[++tot]=x%10+'0',x/=10;
		for(int i=tot;i;--i)putc(_ar[i]);
		putc(_fg);
	}
	void flush(){
		fwrite(_out,1,_len,stdout);
		_len=0;
	}
}
using namespace fstIO;
const int N=133343,M=1000010;
int n,m,a[N],len,qt,ct,b[N],res,ans[N],cnt[M];
struct query{
	int id,l,r,t;
}q[N];
struct modify{
	int p,c;
}c[N];
bool cmp(const query &A,const query &B){
	int al=b[A.l],bl=b[B.l];
	int ar=b[A.r],br=b[B.r];
	if(al^bl)return al<bl;
	if(ar^br)return ar<br;
	return A.t<B.t;
}
#define add(x) (cnt[x]++)||(++res)
#define del(x) (--cnt[x])||(--res)
int main(){
	#ifndef ONLINE_JUDGE
	freopen("1.in","r",stdin);
	#endif
	read(n,m);
	E(i, n)read(a[i]);
	E(i, m){
		char op=_gh();
		int l,r;
		read(l,r);
		if(op=='Q')q[++qt]={qt,l,r,ct};
		else c[++ct]={l,r};
		// printf("%c %d %d\n",op,l,r);
	}
	len=cbrt((double)n*ct);
	!len&&(len=1);
	E(i, n)b[i]=i/len;
	int i=0,j=1,t=0;
	sort(q+1,q+1+qt,cmp);
	E(k, qt){
		int id=q[k].id,l=q[k].l,r=q[k].r,tm=q[k].t;
		while(i<r)add(a[++i]);
		while(i>r)del(a[i--]);
		while(j<l)del(a[j++]);
		while(j>l)add(a[--j]);
		while(t<tm){
			++t;
			if(l<=c[t].p&&c[t].p<=r){
				del(a[c[t].p]);
				add(c[t].c);
			}
			swap(a[c[t].p],c[t].c);
		}
		while(t>tm){
			if(l<=c[t].p&&c[t].p<=r){
				del(a[c[t].p]);
				add(c[t].c);
			}
			swap(a[c[t].p],c[t].c);
			t--;
		}
		ans[id]=res;
	}
	E(i, qt)write(ans[i]);
	flush();
	return 0;
}
2023/8/2 10:06
加载中...