数颜色 / 维护队列(带修莫队板子)
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数颜色 / 维护队列(带修莫队板子)相关的知识,希望对你有一定的参考价值。
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=8e18;
const int maxn=1e6+100;
int a[maxn],pos[maxn],cnt[maxn],ans,l,r;
int res[maxn];
int sz;
struct node
{
int l,r;
int id,ti;
} t[maxn];
struct node2
{
int x,col;
} t2[maxn];
bool cmp(node a,node b)
{
if(pos[a.l]!=pos[b.l])return pos[a.l]<pos[b.l];
if(pos[a.r]!=pos[b.r])return pos[a.r]<pos[b.r];
return a.ti<b.ti;
}
void add(int x)
{
cnt[a[x]]++;
if(cnt[a[x]]==1)ans++;
}
void del(int x)
{
cnt[a[x]]--;
if(cnt[a[x]]==0)ans--;
}
void change(int ti)
{
if(l<=t2[ti].x&&t2[ti].x<=r)
{
cnt[a[t2[ti].x]]--;
if(cnt[a[t2[ti].x]]==0)ans--;
cnt[t2[ti].col]++;
if(cnt[t2[ti].col]==1)ans++;
}
swap(t2[ti].col,a[t2[ti].x]);
}
signed main()
{
int n,q;
cin>>n>>q;
sz=pow(n,2.0/3.0);
for(int i=1; i<=n; i++)
{
cin>>a[i];
pos[i]=i/sz+1;
}
int cnt1=0,cnt2=0;
for(int i=1; i<=q; i++)
{
char op;
int l,r;
cin>>op>>l>>r;
if(op=='Q')
{
cnt1++;
t[cnt1]= {l,r,cnt1,cnt2};
}
else
{
t2[++cnt2]= {l,r};
}
}
sort(t+1,t+cnt1+1,cmp);
l=0,r=0;
int ti=0;
for(int i=1; i<=cnt1; i++)
{
while(l>t[i].l) add(--l);
while(r<t[i].r) add(++r);
while(l<t[i].l) del(l++);
while(r>t[i].r) del(r--);
while(ti<t[i].ti) change(++ti);
while(ti>t[i].ti) change(ti--);
res[t[i].id]=ans;
}
for(int i=1; i<=cnt1; i++)
{
cout<<res[i]<<"\\n";
}
}
以上是关于数颜色 / 维护队列(带修莫队板子)的主要内容,如果未能解决你的问题,请参考以下文章