zoukankan      html  css  js  c++  java
  • [Codeforces558E]A Simple Task 线段树

    链接

    题意:给定一个长度不超过 (10^5) 的字符串(小写英文字母),和不超过5000个操作。

    每个操作 L R K 表示给区间[L,R]的字符串排序,K=1为升序,K=0为降序。

    最后输出最终的字符串。

    题解

    发现只有小写英文字母,26个,直接建26棵线段树,排序的时候,直接统计每个字母的个数暴力安排即可

    好像见过值域 (10^9) 的,不过不知道在哪了,先留个坑,等看到了或者记起来了再补

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i(a);i<=(b);++i)
    using namespace std;
    typedef long long ll;
    inline int read(){char c;int w;
    	while(!isdigit(c=getchar()));w=c&15;
    	while(isdigit(c=getchar()))w=w*10+(c&15);return w;
    }
    inline char smax(int&x,const int&y){return x<y?x=y,1:0;}
    inline char smin(int&x,const int&y){return x>y?x=y,1:0;}
    const int N=1e5+5;
    struct node{
    	int ls,rs,w,ch;
    }t[N*120];
    int rt[26],cnt;
    inline void add(int&o,int w,int len){if(!o)o=++cnt;t[o].ch=w,t[o].w=len*w;}
    inline void pushdown(int&o,int len){
    	if(~t[o].ch){
    		add(t[o].ls,t[o].ch,len-(len>>1));
    		add(t[o].rs,t[o].ch,len>>1);
    		t[o].ch=-1;
    	}
    }
    inline void pushup(int o){t[o].w=t[t[o].ls].w+t[t[o].rs].w;}
    inline void update(int&o,int l,int r,int x,int y){
    	pushdown(o,r-l+1);
    	if(x<=l&&r<=y)return add(o,1,r-l+1);
    	if(!o)t[o=++cnt].ch=-1;int mid=l+r>>1;
    	if(x<=mid)update(t[o].ls,l,mid,x,y);if(y>mid)update(t[o].rs,mid+1,r,x,y);
    	pushup(o);
    }
    inline void ins(int&o,int l,int r,int x){
    	if(!o)t[o=++cnt].ch=-1;++t[o].w;
    	if(l==r)return;int mid=l+r>>1;
    	x<=mid?ins(t[o].ls,l,mid,x):ins(t[o].rs,mid+1,r,x);
    }
    inline int query(int&o,int l,int r,int x,int y){
    	if(!o||x>r||y<l)return 0;pushdown(o,r-l+1);
    	if(x<=l&&r<=y){int ans=t[o].w;return t[o].w=t[o].ch=0,ans;}
    	int mid=l+r>>1,ans=query(t[o].ls,l,mid,x,y)+query(t[o].rs,mid+1,r,x,y);
    	return pushup(o),ans;
    }
    char s[N];
    int c[26];
    int main(){
    	int n=read(),q=read();		
    	scanf("%s",s+1);
    	REP(i,1,n)ins(rt[s[i]-'a'],1,n,i);
    	while(q--){
    		int l=read(),r=read(),op=read();
    		REP(i,0,25)c[i]=query(rt[i],1,n,l,r);
    		if(op){
    			int p=l;
    			REP(i,0,25)if(c[i])update(rt[i],1,n,p,p+c[i]-1),p+=c[i];
    		}
    		else{
    			int p=r;
    			REP(i,0,25)if(c[i])update(rt[i],1,n,p-c[i]+1,p),p-=c[i];
    		}
    	}
    	REP(i,1,n)REP(j,0,25)if(query(rt[j],1,n,i,i)){putchar(j+'a');break;}
    	
    	return 0;
    }
    
    
  • 相关阅读:
    ORACLE 查看进程数,已执行任务数, 剩余任务数,删除指定任务
    ORACLE 收集统计整个用户数据
    解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
    利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
    AES加解密
    JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案
    JAVA 文件的上传下载
    shell启停服务脚本模板
    JAVA 设计模式之 原型模式详解
    JAVA 设计模式之 工厂模式详解
  • 原文地址:https://www.cnblogs.com/HolyK/p/9884655.html
Copyright © 2011-2022 走看看