P1903 求助卡常
  • 板块学术版
  • 楼主OneLeft
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/4/5 23:34
  • 上次更新2024/4/6 09:58:40
查看原帖
P1903 求助卡常
574215
OneLeft楼主2024/4/5 23:34

rt,测评记录

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct data1
{
	int l,r,tim,id;
}x[N];
struct data2
{
	int id,col;
}y[N];
char op;
int n,m,a[N],u,v,tot1,tot2,siz,num[N],ans[N],l,r,t,tmp,cnt[N];
inline bool cmp(data1 x,data1 y)
{
	if(num[x.l]!=num[y.l])
		return num[x.l]<num[y.l];
	if(num[x.l]%2==1)
        return x.r<y.r;
    return x.r>y.r; 
}
inline void add(int col)
{
	if(cnt[col]==0)
		tmp++;
	cnt[col]++;
}
inline void del(int col)
{
	cnt[col]--;
	if(cnt[col]==0)
		tmp--;
}
inline void updata(int id,int i)
{
	if(x[i].l<=y[id].id&&y[id].id<=x[i].r)
	{
		add(y[id].col);
		del(a[y[id].id]);
	}
	swap(y[id].col,a[y[id].id]);
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
	cin>>n>>m;
	siz=pow(n,0.667);
	for(register int i=1;i<=n;i++)
	{
		cin>>a[i];
		num[i]=(i-1)/siz+1;
	}
	for(register int i=1;i<=m;i++)
	{
		cin>>op>>u>>v;
		if(op=='Q')
			x[++tot1]=(data1){u,v,tot2,tot1};
		else y[++tot2]=(data2){u,v}; 
	}
	sort(x+1,x+tot1+1,cmp);
	l=1;
	for(register int i=1;i<=tot1;i++)
	{
		while(l>x[i].l)add(a[--l]);
		while(r<x[i].r)add(a[++r]);
		while(l<x[i].l)del(a[l++]);
		while(r>x[i].r)del(a[r--]);
		while(t<x[i].tim)updata(++t,i);
		while(t>x[i].tim)updata(t--,i);
		ans[x[i].id]=tmp;
	}
	for(register int i=1;i<=tot1;i++)
		cout<<ans[i]<<'\n';
	return 0;
}
2024/4/5 23:34
加载中...