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

    法。

  • 相关阅读:
    2.1 maven配置多镜像地址
    6.4 SpringData JPA的使用
    4.3 thymeleaf模板引擎的使用
    java面试题整理
    eclipse配置运行时变量
    postman上传文件
    Python定义字符串、循环
    Charles抓包
    jmeter压测
    JMeter,postman
  • 原文地址:https://www.cnblogs.com/DriverLao/p/9090232.html
Copyright © 2020-2023  润新知