社区讨论

TLE on #19

CF240FTorCoder参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lo2kvuo7
此快照首次捕获于
2023/10/23 15:30
2 年前
此快照最后确认于
2023/10/23 15:30
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int n,q;
string s;
int sum[30];
const int N=1e5+5;

struct node{
	int sum,lt;
}tr[N*26*4];
int rt[30],cnt,lc[N*26*4],rc[N*26*4];
void build(int &p,int l,int r,int k){
	p=++cnt;
	tr[p].lt=-1;
	if(l==r){
		if(s[l]==char('a'+k)){
			tr[p].sum=1;
		}
		return ;
	}
	int m=l+r>>1;
	build(lc[p],l,m,k);
	build(rc[p],m+1,r,k);
	tr[p].sum=tr[lc[p]].sum+tr[rc[p]].sum;
}

inline void pushdown(int p,int l,int r){
	if(tr[p].lt==-1) return ;
	int m=l+r>>1;
	tr[lc[p]].sum=(m-l+1)*tr[p].lt;
	tr[rc[p]].sum=(r-m)*tr[p].lt;
	tr[lc[p]].lt=tr[p].lt;
	tr[rc[p]].lt=tr[p].lt;
	tr[p].lt=-1;
}
void upd(int p,int l,int r,int ul,int ur,int k){
	if(ul<=l&&r<=ur){
		tr[p].sum=(r-l+1)*k;
		tr[p].lt=k;
		return ;
	}
	pushdown(p,l,r);
	int m=l+r>>1;
	if(m>=ul) upd(lc[p],l,m,ul,ur,k);
	if(m+1<=ur) upd(rc[p],m+1,r,ul,ur,k);
	tr[p].sum=tr[lc[p]].sum+tr[rc[p]].sum;
}
int query(int p,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return tr[p].sum;
	pushdown(p,l,r);
	int m=l+r>>1,ans=0;
	if(m>=ql) ans=query(lc[p],l,m,ql,qr);
	if(m+1<=qr) ans+=query(rc[p],m+1,r,ql,qr);
	return ans;
}

int main(){
	#ifdef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
	cin>>n>>q;
	cin>>s;
	s=' '+s;
	for(int i=0;i<26;i++){
		build(rt[i],1,n,i);
	}
	int l,r,cnt1; 
		int odd;
	while(q--){
		scanf("%d%d",&l,&r);
		cnt1=0;
		for(int i=0;i<26;i++){
			sum[i]=query(rt[i],1,n,l,r);
			if(sum[i]%2==1) cnt1++,odd=i;
		}
		if(cnt1>=2) continue;
		if(cnt1==1){
			if((r-l+1)%2==0) continue;
		}
		for(int i=0;i<26;i++){
			upd(rt[i],1,n,l,r,0);
		}
		if(cnt1==1){
			upd(rt[odd],1,n,(r+l)/2,(r+l)/2,1);
			sum[odd]--;
		}
		
		int L=l,R=r;
		for(int i=0;i<26;i++){
			if(sum[i]){
				//cout<<i<<' '<<L<<' '<<L+sum[i]/2-1<<endl;
				//cout<<i<<' '<<R-sum[i]/2+1<<' '<<R<<endl; 
				upd(rt[i],1,n,L,L+sum[i]/2-1,1);
				upd(rt[i],1,n,R-sum[i]/2+1,R,1);
				L+=sum[i]/2;
				R-=sum[i]/2;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<26;j++){
			if(query(rt[j],1,n,i,i)==1){
			    printf("%c",char('a'+j));
				break;
			}
		}
	}
	return 0;
} 

回复

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

正在加载回复...