求调带修莫队 过样例但是0分WA+TLE
查看原帖
求调带修莫队 过样例但是0分WA+TLE
927858
__Legends__楼主2024/4/2 13:32
#include<bits/stdc++.h>
using namespace std;
const int N=133334;
const int V=1e6+5;
int n,m,a[N],cnt[V],tim=0,q1=0,b[N],temp=0,ans[N];
struct Query{
    int l,r,t,id;
    Query(){}
    Query(int _l,int _r,int _t,int _id):l(_l),r(_r),t(_t),id(_id){}
    bool operator < (const Query &p)const{
        return b[l]==b[p.l]?(b[r]==b[p.r]?t<p.t:b[r]<b[p.r]):b[l]<b[p.l];
    }  
}q[N];
struct Modi{
	int p,f;
	Modi(){}
	Modi(int _p,int _f):p(_p),f(_f){}
}modi[N];
void add(int x){
    cnt[x]++;
    if(cnt[x]==1) ++temp;
}
void del(int x){
   	cnt[x]--;
   	if(!cnt[x]) --temp;
}
void modify(int k,int i){
	if(modi[k].p>=q[i].l&&modi[k].p<=q[i].r){
		add(modi[k].f);
		del(a[modi[k].p]); 
	}
	swap(a[modi[k].p],modi[k].f);
}
int main(){
    scanf("%d%d",&n,&m);
  	int Size=cbrt(n*n);
    for(int i=1;i<=n;i++){
    	scanf("%d",&a[i]);
    	b[i]=(i-1)/Size+1;
    }
    for(int i=1;i<=m;i++){
    	char command[3];
    	int x,y;
    	scanf("%s",command);
    	scanf("%d%d",&x,&y); 
    	if(command[0]=='Q') ++q1,q[q1]=Query(x,y,tim,q1);
    	else ++tim,modi[tim]=Modi(x,y);
    }
    sort(q+1,q+q1+1);
    int l=1,r=0,t=0;
    for(int i=1;i<=q1;i++){
        while(r<q[i].r) add(a[++r]);
		while(r>q[i].r) del(a[r--]);
		while(l>q[i].l) add(a[--l]);
		while(l<q[i].l) del(a[l++]);
        while(t<q[i].t) modify(++t,i);
        while(t>q[i].t) modify(t--,i);
        ans[q[i].id]=temp;
    }
    for(int i=1;i<=q1;i++) printf("%d\n",ans[i]);
    return 0;
}
2024/4/2 13:32
加载中...