51nod1485 字母排序
【题解】
开26棵线段数,记录区间内每种字母的出现次数,修改的时候就用区间设置为一个数操作即可。同时也有平衡树做
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long long 5 #define rg register 6 #define N 200010 7 #define ls (u<<1) 8 #define rs (u<<1|1) 9 #define mid ((a[u].l+a[u].r)>>1) 10 using namespace std; 11 int n,m,opt,l,r,q[26]; 12 struct tree{ 13 int l,r,cnt[26],set; 14 }a[N<<2]; 15 inline int read(){ 16 int k=0,f=1; char c=getchar(); 17 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 18 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 19 return k*f; 20 } 21 void build(int u,int l,int r){ 22 a[u].l=l; a[u].r=r; a[u].set=-1; 23 if(l<r){ 24 build(ls,l,mid); build(rs,mid+1,r); 25 for(rg int i=0;i<26;i++) a[u].cnt[i]=a[ls].cnt[i]+a[rs].cnt[i]; 26 } 27 else a[u].cnt[getchar()-'a']++; 28 } 29 inline void pushdown(int u){ 30 if(a[u].set==-1) return; int set=a[u].set; 31 for(rg int i=0;i<26;i++) a[ls].cnt[i]=a[rs].cnt[i]=0; 32 a[ls].cnt[a[ls].set=set]=(a[ls].r-a[ls].l+1); 33 a[rs].cnt[a[rs].set=set]=(a[rs].r-a[rs].l+1); 34 a[u].set=-1; 35 } 36 void update(int u,int l,int r,int set){ 37 if(l<=a[u].l&&a[u].r<=r){ 38 for(rg int i=0;i<26;i++) a[u].cnt[i]=0; 39 a[u].cnt[a[u].set=set]=(a[u].r-a[u].l+1); 40 return; 41 } 42 pushdown(u); 43 if(l<=mid) update(ls,l,r,set); 44 if(r>mid) update(rs,l,r,set); 45 for(rg int i=0;i<26;i++) a[u].cnt[i]=a[ls].cnt[i]+a[rs].cnt[i]; 46 } 47 void query(int u,int l,int r){ 48 if(l<=a[u].l&&a[u].r<=r){ 49 for(rg int i=0;i<26;i++) q[i]+=a[u].cnt[i]; 50 return; 51 } 52 pushdown(u); 53 if(l<=mid) query(ls,l,r); 54 if(r>mid) query(rs,l,r); 55 } 56 void out(int u,int pos){ 57 if(a[u].l==a[u].r) for(rg int i=0;i<26;i++)if(a[u].cnt[i]){putchar(i+'a'); return;} 58 pushdown(u); 59 if(pos<=mid) out(ls,pos); else out(rs,pos); 60 } 61 int main(){ 62 n=read(); m=read(); build(1,1,n); 63 while(m--){ 64 memset(q,0,sizeof(q)); 65 l=read(); r=read(); opt=read(); 66 query(1,l,r); int now=l; 67 if(opt==1){ 68 for(rg int i=0;i<26;i++)if(q[i]) update(1,now,now+q[i]-1,i),now+=q[i]; 69 } 70 else{ 71 for(rg int i=25;i>=0;i--)if(q[i]) update(1,now,now+q[i]-1,i),now+=q[i]; 72 } 73 memset(q,0,sizeof(q)); 74 } 75 for(rg int i=1;i<=n;i++) out(1,i); 76 return 0; 77 }
法。