萌新求助,RE爆零
查看原帖
萌新求助,RE爆零
292029
幽理家的男人楼主2021/5/3 09:03

不知道什么原因,全都RE了,数组开的够大了而且也测试了好多组数据也都有输出,可交上去就是0分QAQ。

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
int n,m,s,si[maxn],ctt[maxn],tq,tc,curl,curr,temp,now,ans[maxn];//ctt记录颜色数量,si记录颜色,tq/tc分别是询问数和修改数
typedef struct a{
	int l,r,id,pre;//id是原标号,pre是他前面有几次修改操作
	bool operator < (const a& o) const{
	    return l/s<o.l/s||(l/s==o.l/s&&r<o.r);
	}
}per; 
per ask[maxn];//询问
typedef struct b{
	int pos,cou;
}node;
node change[maxn];//修改
int del(int num){
	ctt[si[num]]--;
	if(!ctt[si[num]]) temp--;
}
int add(int num){
	ctt[si[num]]++;
	if(ctt[si[num]]==1) temp++;
}
int work(int now,int i){
	if(change[now].pos>=ask[i].l&&change[now].pos<=ask[i].r){
		if(--ctt[si[change[now].pos]]==0) temp--;
		if(++ctt[change[now].cou]==1) temp++;
	}
	swap(change[now].cou,si[change[now].pos]);
}//上面都是带修莫队板子
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>si[i];
	char sign;
	s=sqrt(n);//求块长
	int l,r;
	for(int i=1;i<=m;++i){
		cin>>sign;
		if(sign=='Q'){
			++tq;
			cin>>ask[tq].l>>ask[tq].r;
			if(ask[tq].l>ask[tq].r) swap(ask[tq].l,ask[tq].r);
			ask[tq].id=tq;
			ask[tq].pre=tc;
		}
		else{
			tc++;
		    cin>>change[tc].pos>>change[tc].cou;
		}
	}
	sort(ask+1,ask+1+tq);
	curl=1;
	for(int i=1;i<=tq;++i){
		int l=ask[i].l,r=ask[i].r;
		while(curr<r) add(++curr);
		while(curr>r) del(curr--);
		while(curl<l) del(curl++);
		while(curl>l) add(--curl);
		while(now<ask[i].pre) work(++now,i);
		while(now>ask[i].pre) work(--now,i);
		ans[ask[i].id]=temp;//莫队板子
	}
	for(int i=1;i<=tq;++i) printf("%d\n",ans[i]);
	return 0;
}
2021/5/3 09:03
加载中...