社区讨论

TLE求卡常

P1903【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo25zia8
此快照首次捕获于
2023/10/23 08:33
2 年前
此快照最后确认于
2023/11/03 08:49
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=2e5+10;
int n,a[N],pos[N],m,tot,b[1000010],cnt,x,y;
char opt;
struct query{int l,r,t,ans,id;}q[N];
struct cg{int t,pos,x;}g[N];
inline bool cmp(query& a,query& b){
    if(pos[a.l]==pos[b.l]){
        if(pos[a.l]&1)return a.r<b.r;
        else return a.r>b.r;
    }
    return pos[a.l]<pos[b.l];
}
inline bool cmp1(query& a,query& b){return a.id<b.id;}
inline void sub(int x){
	if(--b[x]==0)cnt--;
}
inline void add(int x){
	if(b[x]++==0)cnt++;
}
inline void turn(int l,int r,int i){
	if(g[i].pos<=r&&g[i].pos>=l)sub(a[g[i].pos]),add(g[i].x);
	swap(g[i].x,a[g[i].pos]);
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;   
    for(register int i(1);i<=n;++i)cin>>a[i];
    int t=1;
    for(register int i(1);i<=m;++i){
    	cin>>opt>>x>>y;
    	if(opt=='R')g[++t]=(cg){t,x,y};
		else q[++tot]=(query){x,y,t,0,i};
	}
	int block=ceil(exp((log(n)+log(t))/3));
	for(register int i(1);i<=n;++i)pos[i]=(i-1)/block+1;
	sort(q+1,q+tot+1,cmp);
	int l=1,r=0;
	t=1;
	for(register int i(1);i<=tot;++i){
		while(l<q[i].l)sub(a[l++]);
		while(l>q[i].l)add(a[--l]);
		while(r<q[i].r)add(a[++r]);
		while(r>q[i].r)sub(a[r--]);
		while(t>q[i].t)turn(l,r,t--);
		while(t<q[i].t)turn(l,r,++t);
		q[i].ans=cnt;
	}
	sort(q+1,q+tot+1,cmp1);
	for(register int i(1);i<=tot;++i)cout<<q[i].ans<<endl;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...