RE求助
查看原帖
RE求助
100091
GaryH楼主2021/8/10 16:02

#5 RE ,不知道哪错了,求助QAQ

#include<bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define cclose ios::sync_with_stdio(false),cin.tie(0)
#define edg(i,v,u) for(int i=head[u],v=e[i].to;i;i=e[i].nxt,v=e[i].to)

using namespace std;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9')f=ch=='-'?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
	return x*f;
}

template < class T >
void ckmax(T &x,T y){x=max(x,y);}

template < class T >
void ckmin(T &x,T y){x=min(x,y);}

typedef pair < int , int > pii ;

const int N(1e5+1e4);

int n,q;

int a[N];
char s[N];
char res[N];

struct Tree{int l,r,lzy,val;};

struct SGT{
	Tree t[31][N<<2];
	
	#define mid ((l+r)>>1)
	#define lsn p<<1,l,mid
	#define rsn p<<1|1,mid+1,r
	
	inline void build(int p,int l,int r){
		rep(c,1,26)t[c][p].l=l,t[c][p].r=r;
		if(l==r)return (void)(t[s[l]-'a'+1][p].val=1);
		build(lsn),build(rsn);
		rep(c,1,26)t[c][p].val=t[c][p<<1].val+t[c][p<<1|1].val;
	}
	
	inline void cover(int p,int c,int v){
		if(v==-1)t[c][p].val=0;
		else t[c][p].val+=t[c][p].r-t[c][p].l+1;
		t[c][p].lzy=v;
	}
	
	inline void push_down(int p,int c){
		if(!t[c][p].lzy)return;
		rep(P,p<<1,p<<1|1)cover(P,c,t[c][p].lzy);
		t[c][p].lzy=0;
	}
	
	inline void upd(int p,int l,int r,int ql,int qr,int c,int v){
		if(ql>qr)return;
		if(ql<=l&&qr>=r)return cover(p,c,v);
		push_down(p,c);
		if(ql<=mid)upd(lsn,ql,qr,c,v);
		if(qr>mid) upd(rsn,ql,qr,c,v);
		t[c][p].val=t[c][p<<1].val+t[c][p<<1|1].val;
	}
	
	inline int qry(int p,int l,int r,int ql,int qr,int c){
		if(ql<=l&&qr>=r)return t[c][p].val;
		push_down(p,c); int ret=0;
		if(ql<=mid)ret+=qry(lsn,ql,qr,c);
		if(qr>mid) ret+=qry(rsn,ql,qr,c);
		return ret;
	}
	
	inline void print(int p,int l,int r){
		if(l==r){
			rep(c,1,26)if(t[c][p].val){
				res[l]='a'+c-1; break;
			} return;
		}
		rep(c,1,26)push_down(p,c);
		print(lsn),print(rsn);
	}
	
}T;

int main(){
	cclose,cin>>n>>q>>(s+1);
	T.build(1,1,n);
	rep(i,1,q){
		int l,r,op;
		cin>>l>>r>>op;
		int now=l;
		for(int c=(op?1:26);(op?(c<=26):(c>=1));(op?c++:c--)){
			int cnt=T.qry(1,1,n,l,r,c);
			if(!cnt)continue;
			T.upd(1,1,n,l,r,c,-1);
			T.upd(1,1,n,now,now+cnt-1,c,1);
			now+=cnt;
		}
	} T.print(1,1,n);
	rep(i,1,n)putchar(res[i]);
	return 0;
}
2021/8/10 16:02
加载中...