求条带修莫队,样例没过,玄关

P1903 [国家集训队] 数颜色 / 维护队列

@[apiad](/user/1251532) 你为什么有三个 add 一个 del/yun
by Pt_crN @ 2024-03-06 21:22:54


@[Pt_crN](/user/740322) 谢谢,有点唐氏了。已关
by apiad @ 2024-03-06 21:32:20


@[Pt_crN](/user/740322) ```cpp // Author: gsczl71 // Copyright (c) 2024 gsczl71 All rights reserved. #include<bits/stdc++.h> #define ll long long #define i128 __int128 #define ull unsigned long long #define pii pair<int,int> #define pll pair<long long, long long> #define fs first #define sc second #define endl '\n' #define debug puts("AK IOI") #define re register #define pb push_back #define mem(a,x) memset((a),(x),sizeof(a)) #define vi vector<int> #define pq priority_queue using namespace std; #define int long long const int mod = 1e9+7; //const int mod = 998244353; const int inf = 0x3f3f3f3f,N = 133333+5,M = 1e6+5,K = 3000+5; const long long linf = 0x3f3f3f3f3f3f3f3f; int n,m; int len ;//块长 int a[N]; struct query{ int id,delid,l,r; }q[N]; struct del{ int id,x; }d[N]; int qn,dn; int id[N]; bool cmp(query a,query b){ if(id[a.l] != id[b.l]) return id[a.l] < id[b.l];//左端点排序 if(id[a.r] != id[b.r]) return id[a.r] < id[b.r];//右端点排序 return a.delid < b.delid;//按照时间戳排序 }int cnt[N],now; int ans[N]; void add(int x){if(!(cnt[x]++)) now++;} void dl(int x){if(!(--cnt[x])) now--;} void md(){ for(int i = 1;i <= n;i++) id[i] = (i-1)/len + 1; sort(q+1,q+1+qn,cmp); int l=1,r=0,tim=0; for(int i = 1;i <= n;i++){ while(r>q[i].r) dl(a[r--]); while(r<q[i].r) add(a[++r]); while(l>q[i].l) add(a[--l]); while(l<q[i].l) dl(a[l++]); while(tim<q[i].delid){ tim++; if(d[tim].id >= l && d[tim].id <= r){ add(d[tim].x); dl(a[d[tim].id]); }swap(a[d[tim].id],d[tim].x);//取反,以后还要改直接改就行 } while(tim>q[i].delid){ if(d[tim].id >= l && d[tim].id <= r){ add(d[tim].x); dl(a[d[tim].id]); }swap(a[d[tim].id],d[tim].x);//取反,以后还要改直接改就行 tim--; } ans[q[i].id] = now; } } void solve(){ cin>>n>>m; len = pow(n,2.0/3.0); for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=m;i++){ char c; int x,y; cin >> c >> x >> y; if(c=='Q'){ q[++qn]={qn,dn,x,y}; }else{ d[++dn]={x,y}; } } md(); for(int i = 1;i <= qn;i++){ cout<<ans[i]<<endl; } } signed main(){ ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int T=1; // cin >> T; while(T--) solve(); return 0; } ``` 但是他依然WA0了。
by apiad @ 2024-03-06 21:33:42


@[apiad](/user/1251532) cnt[N]改cnt[M]吧。
by Oier_szc @ 2024-03-06 21:54:02


@[Oier_szc](/user/368204) 过了,谢谢
by apiad @ 2024-03-06 22:28:30


@[apiad](/user/1251532) 好的,主要是调的时候也犯了这个错误,顺便警示一下后人.
by Oier_szc @ 2024-03-06 22:36:07


@[Oier_szc](/user/368204) 嗯。。
by apiad @ 2024-03-06 22:43:25


|