题意:一个长度为n的字符串(只包含26个小字母)有q次操作 对于每次操作 给一个区间 和k k为1把该区间的字符不降序排序 k为0把该区间的字符不升序排序 求q次操作后所得字符串

思路:

该题数据规模很大 排序是关键想到计数排序,根据计数排序原理,由只有26个小写字母,需要统计区间字母的个数,还需要更新区间,想到用线段树优化,对于每个字母建一个线段树维护各字母在区间的个数。

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<1|1
#define All 1,N,1
#define N 100010
#define read freopen("in.txt", "r", stdin)
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod = 1000000007;
struct tree{
int num,l,r,lazy;
}t[30][N<<2];
int qnum[N],n,q;
char ch[N];
void pushup(int i,int rt){
t[i][rt].num=t[i][rt<<1].num+t[i][rt<<1|1].num;
}
void pushdown(int i,int rt){
if(t[i][rt].lazy!=-1){
t[i][rt<<1].num=(t[i][rt<<1].r-t[i][rt<<1].l+1)*t[i][rt].lazy;
t[i][rt<<1].lazy=t[i][rt].lazy;
t[i][rt<<1|1].num=(t[i][rt<<1|1].r-t[i][rt<<1|1].l+1)*t[i][rt].lazy;
t[i][rt<<1|1].lazy=t[i][rt].lazy;
t[i][rt].lazy=-1;
}
}
void build(int i,int l,int r,int rt){
t[i][rt].l=l;
t[i][rt].r=r;
t[i][rt].lazy=-1;
int m=(l+r)>>1;
if(l==r){
t[i][rt].num=(ch[l-1]=='a'+i);
return;
}
build(i,lson);
build(i,rson);
pushup(i,rt);
}
void update(int i,int v,int l,int r,int rt){
if(t[i][rt].l>=l&&t[i][rt].r<=r){
t[i][rt].num=(t[i][rt].r-t[i][rt].l+1)*v;
t[i][rt].lazy=v;
return;
}
pushdown(i,rt);
int m=(t[i][rt].l+t[i][rt].r)>>1;
if(l<=m)update(i,v,l,r,rt<<1);
if(r>m)update(i,v,l,r,rt<<1|1);
pushup(i,rt);
}
int query(int i,int l,int r,int rt){
if(t[i][rt].l>=l&&t[i][rt].r<=r)
return t[i][rt].num;
pushdown(i,rt);
int total=0;
int mid=(t[i][rt].l+t[i][rt].r)>>1;
if(l<=mid)total+=query(i,l,r,rt<<1);
if(r>mid)total+=query(i,l,r,rt<<1|1);
pushup(i,rt);
return total;
}
void solve(){
int l,r,w;
for(int i=0;i<26;++i)
build(i,1,n,1);
while(q--){
scanf("%d%d%d",&l,&r,&w);
for(int i=0;i<26;++i){
qnum[i]=query(i,l,r,1);
update(i,0,l,r,1);
}
if(w==1){
int pos=l;
for(int i=0;i<26;++i)
{
if(qnum[i]>0){
update(i,1,pos,pos+qnum[i]-1,1);
pos+=qnum[i];
}
}
}
else{
int pos=l;
for(int i=25;i>=0;--i)
{
if(qnum[i]>0){
update(i,1,pos,pos+qnum[i]-1,1);
pos+=qnum[i];
}
}
}
}
for(int i=0;i<n;++i)
for(int j=0;j<26;++j)
{
if(query(j,i+1,i+1,1)){
ch[i]='a'+j;
break;
}
}
printf("%s\n",ch);
}
int main()
{
scanf("%d%d",&n,&q);
scanf("%s",ch);
solve();
return 0;
}

  

CodeForces 558E(计数排序+线段树优化)的更多相关文章

  1. Codeforces 558E A Simple Task (计数排序&&线段树优化)

    题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...

  2. 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task

    E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...

  3. Codeforces 558E A Simple Task(计数排序+线段树优化)

    http://codeforces.com/problemset/problem/558/E Examples input 1 abacdabcda output 1 cbcaaaabdd input ...

  4. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  5. Nowcoder Hash Function ( 拓扑排序 && 线段树优化建图 )

    题目链接 题意 : 给出一个哈希表.其避免冲突的方法是线性探测再散列.现在问你给出的哈希表是否合法.如果合法则输出所有元素插入的顺序.如果有多解则输出字典序最小的那一个.如果不合法则输出 -1 分析 ...

  6. CodeForces 834D The Bakery(线段树优化DP)

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  7. CodeForces 786B Legacy(线段树优化建图+最短路)

    [题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...

  8. Codeforces 786B Legacy(线段树优化建图)

    题目链接  Legacy 首先对于输入的$n$,建立一棵线段树. 显然线段树有大概$2n$个结点,每个节点对应一段区间 我们把这$2n$个结点加入我们的无向图中,一起跑最短路. 具体连边方案: 我们把 ...

  9. Educational Codeforces Round 69 E - Culture Code (最短路计数+线段树优化建图)

    题意:有n个空心物品,每个物品有外部体积outi和内部体积ini,如果ini>outj,那么j就可以套在i里面.现在我们要选出n个物品的一个子集,这个子集内的k个物品全部套在一起,且剩下的物品都 ...

随机推荐

  1. HDU 1227 Fast Food (DP)

    题目链接 题意 : 有n个饭店,要求建k个供应点,要求每个供应点一定要建造在某个饭店的位置上,然后饭店都到最近的供应点拿货,求出所有饭店到最近的供应点的最短距离. 思路 : 一开始没看出来是DP,后来 ...

  2. Ubuntu 取消sudo密码

    需求:在Ubuntu下装了FQ代理goagent之后,为了goagent能够开机启动.因为goagent需要sudo权限,所以要去掉sudo密码. 要修改的文件位于/etc/sudoers,先备份: ...

  3. 欧拉工程第61题:Cyclical figurate numbers

    ---恢复内容开始--- 题目链接 从三角数开始,循环到八角数,再到三角数,求这6个数的和 这个比较复杂,代码在网上找的 Java: package project61; import java.ut ...

  4. 【mysql的设计与优化专题(6)】mysql索引攻略

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找,而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

  5. 如何配置JAVA的环境变量、Tomcat环境变量

    配置JAVA环境变量 1.右击[我的电脑]---[属性]-----[高级]---[环境变量],如图: 2.选择[新建系统变量]--弹出“新建系统变量”对话框,在“变量名”文本框输入“JAVA_HOME ...

  6. PCB板的价格是怎么算出来的?

    Part 1 :影响一块PCB板价格的各种因素 PCB的价格是很多采购者一直很困惑的事情,很多人在线下单时也会疑问这些价格是怎么算出来的,下面我们就一起谈论一下PCB价格的组成因素. 1.PCB所用材 ...

  7. wxpython ItemContainer

    ItemContainer 是 很多可以添加string item的部件的父类,封装很多有用的方法,可以用来获取部件的被选中item 的string 如wx.ListBox ,wx.CheckList ...

  8. Android 在Intent中传递接口

    总结:在Activity中不能用intent传递匿名接口,原因如下:Activity A中生成了匿名接口M, 这个接口的引用就在组Activity A中,Activity A会禁止接口M 序列化.因为 ...

  9. 修改linux命令行提示符路径显示

    命令显示行太长,影响观感,这样需要修改,具体方法: 1. 修改 ~/.bashrc,在最后一行添加: export PS1='[\u@\h\W]$' 其中\u是当前用户名,\h是当前主机名,\w显示当 ...

  10. SqlServer 如何以脚本形式导出数据

    你是否遇到这样的情况,在公司导出一个数据库,回到家里导入自己的电脑里,然后发现数据库版本不匹配,这真是一个悲剧. 那么以下这个方法就可以避免这个悲剧,将数据以脚本的形式导出,这样灵活性更好. 1.选择 ...