CF558E A Simple Task
Posted qyj060604
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF558E A Simple Task相关的知识,希望对你有一定的参考价值。
CF558E A Simple Task
WOC怎么又一个simple task?
操作就是区间排序+最终询问
第一反应是Splay(不对呀,我明明不会Splay的......??)
后来看了看,感觉Splay不可做(我连Splay都不会,怎么就觉得不能做了)
感觉线段树比较靠谱
观察题目发现小写字母只有26个(常识)
往元素上去做文章
将排序用另外一种方式呈现
用桶排序的思想
开一个桶记录区间1~26字母出现的个数
然后区间赋值,达到排序目的
输出只要遍历一下线段树的叶子节点即可
代码:
#include<bits/stdc++.h> using namespace std; const int N=100005; int n,m; int a[N]; int cal[30]; struct Sugment_Tree int LZT[N<<2]; int t[N<<2][30]; #define il inline #define mid (l+r)/2 Sugment_Tree()memset(t,0,sizeof(t));memset(LZT,0,sizeof(LZT)); il void push_up(int num) for(int i=1;i<=26;i++)t[num][i]=t[num<<1][i]+t[num<<1|1][i]; il void push_down(int l,int r,int num) if(!LZT[num]) return; LZT[num<<1]=LZT[num]; LZT[num<<1|1]=LZT[num]; memset(t[num<<1],0,sizeof(t[num<<1])); memset(t[num<<1|1],0,sizeof(t[num<<1|1])); t[num<<1][LZT[num]]=(mid-l+1); t[num<<1|1][LZT[num]]=(r-(mid+1)+1); LZT[num]=0; il void build(int l,int r,int num) if(l==r) t[num][a[l]]=1; return; build(l,mid,num<<1); build(mid+1,r,num<<1|1); push_up(num); il void upt(int l,int r,int num,int L,int R,int SUM) if(l>R||r<L) return; if(l>=L&&r<=R) LZT[num]=SUM; memset(t[num],0,sizeof(t[num])); t[num][SUM]=r-l+1; return; push_down(l,r,num); upt(l,mid,num<<1,L,R,SUM); upt(mid+1,r,num<<1|1,L,R,SUM); push_up(num); il int ask(int l,int r,int num,int L,int R,int SUM) if(l>R||r<L) return 0; if(l>=L&&r<=R) return t[num][SUM]; push_down(l,r,num); return ask(l,mid,num<<1,L,R,SUM)+ask(mid+1,r,num<<1|1,L,R,SUM); il void output(int l,int r,int num) if(l==r) for(int i=1;i<=26;i++) if(t[num][i]) printf("%c",‘a‘+i-1); return; push_down(l,r,num); output(l,mid,num<<1); output(mid+1,r,num<<1|1); T; int main() scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) char c; cin>>c; a[i]=c-‘a‘+1; T.build(1,n,1); //T.output(1,n,1); while(m--) int l,r,x; scanf("%d%d%d",&l,&r,&x); memset(cal,0,sizeof(cal)); for(int i=1;i<=26;i++) cal[i]=T.ask(1,n,1,l,r,i); int L=l; if(x==1) for(int i=1;i<=26;i++) T.upt(1,n,1,L,L+cal[i]-1,i); L+=cal[i]; else for(int i=26;i>=1;i--) T.upt(1,n,1,L,L+cal[i]-1,i); L+=cal[i]; T.output(1,n,1); return 0;
以上是关于CF558E A Simple Task的主要内容,如果未能解决你的问题,请参考以下文章