码迷,mamicode.com
首页 > 编程语言 > 详细

51nod1485 字母排序

时间:2018-05-25 21:12:17      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:for   排序   i++   #define   AC   else   次数   UI   hid   

技术分享图片

【题解】

  开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 }
View Code

 

法。

51nod1485 字母排序

标签:for   排序   i++   #define   AC   else   次数   UI   hid   

原文地址:https://www.cnblogs.com/DriverLao/p/9090232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!