题解

这道题给你两个操作,一个升序,一个降序

我们可以观察到这个字符串都是由小写字母组成的,只有26个字符,所以我们开一个26个字符的线段树

每次查询的时候找到这个区间内‘a'到'z'的数量,再判断一下要升序还是降序就可以喽

 #include<bits/stdc++.h>
#define L 100005
using namespace std;
int n,m,l,r,x;
int mark[*L][],tree[*L][];
char s[L];
void build(int v,int l,int r){
if (l==r){
tree[v][s[l]-'a']=;
return;
}
int mid=(l+r)>>;
build(v<<,l,mid);
build(v<<|,mid+,r);
for (int i=;i<;i++)
tree[v][i]=tree[v<<][i]+tree[v<<|][i];
}
void pushdown(int v,int k,int l,int r){
int mid=(l+r)>>;
if (mark[v][k]){
mark[v<<][k]=mark[v][k];
mark[v<<|][k]=mark[v][k];
if (mark[v][k]&)
tree[v<<][k]=tree[v<<|][k]=;
else{
tree[v<<][k]=mid-l+;
tree[v<<|][k]=r-mid;
}
mark[v][k]=;
}
}
void change(int v,int l,int r,int x,int y,int k,int key){
if (mark[v][k]==key+) return;
if (x<=l&&y>=r){
mark[v][k]=key+;
if (!key) tree[v][k]=;
else tree[v][k]=r-l+;
return;
}
pushdown(v,k,l,r);
int mid=(l+r)>>;
if (y<=mid) change(v<<,l,mid,x,y,k,key); else
if (x>mid) change(v<<|,mid+,r,x,y,k,key);
else{
change(v<<,l,mid,x,mid,k,key);
change(v<<|,mid+,r,mid+,y,k,key);
}
tree[v][k]=tree[v<<][k]+tree[v<<|][k];
}
int query(int v,int l,int r,int x,int y,int k){
if (!tree[v][k]) return ;
if (x<=l&&y>=r) return tree[v][k];
pushdown(v,k,l,r);
int mid=(l+r)>>;
if (y<=mid) return query(v<<,l,mid,x,y,k); else
if (x>mid) return query(v<<|,mid+,r,x,y,k); else
return query(v<<,l,mid,x,mid,k)+query(v<<|,mid+,r,mid+,y,k);
}
int main(){
scanf("%d%d",&n,&m);
scanf("%s",s+);
build(,,n);
for (int i=;i<=m;i++){
scanf("%d%d%d",&l,&r,&x);
int now=l;
if (x){
for (int j=;j<;j++){
int t=query(,,n,l,r,j);
if (!t) continue;
change(,,n,l,r,j,);
change(,,n,now,now+t-,j,);
now+=t;
}
} else{
for (int j=;j>=;j--){
int t=query(,,n,l,r,j);
if (!t) continue;
change(,,n,l,r,j,);
change(,,n,now,now+t-,j,);
now+=t;
}
}
}
for (int i=;i<=n;i++)
for (int j=;j<;j++)
if (query(,,n,i,i,j)){
printf("%c",j+'a');
break;
}
return ;
}

YYHS-string(线段树)的更多相关文章

  1. 考试题string——线段树。

    string[题目描述]给定一个由小写字母组成的字符串 s.有 m 次操作,每次操作给定 3 个参数 l,r,x.如果 x=1,将 s[l]~s[r]升序排序;如果 x=0,将 s[l]~s[r]降序 ...

  2. JZOJ P5829 HZOI 20190801 A string 线段树

    JZOJ P5829 A. string 题面:https://www.cnblogs.com/Juve/articles/11286476.html 考场上想起了排序这道题:https://www. ...

  3. string [线段树优化桶排]

    题意大概是给你一个字符串,1e5次修改,每次给一个区间升序排列或降序排列,最后输出这个字符串; 其实是个挺裸的线段树优化题;但是我没有意识去结合桶排,扑该..... 首先 1.40分算法 O(NMlo ...

  4. hdu3973 AC's String 线段树+字符串hash

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3973/ 题意是:给出一个模式串,再给出一些串组成一个集合,操作分为两种,一种是替换模式串中的一个字符,还有一种是 ...

  5. 【模拟8.01】string(线段树)

    因为题中只有a-z,所以区间中大量字母都是重复的,我们不妨利用桶的性质. 开一棵树,里面维护当前区间内的相同元素,若区间内元素不同,则为零 每次升序操作就先查询一遍区间,用桶将每个区间的a-z元素统计 ...

  6. HDU5008 Boring String Problem(后缀数组 + 二分 + 线段树)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5008 Description In this problem, you are given ...

  7. HDU 6096 String 排序 + 线段树 + 扫描线

    String Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem De ...

  8. HDU - 3973 AC's String(Hash+线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=3973 题意 给一个词典和一个主串.有两种操作,查询主串某个区间,问这主串区间中包含多少词典中的词语.修改主串某一 ...

  9. [CF1063F]String Journey[后缀数组+线段树]

    题意 在 \(S\) 中找出 \(t\) 个子串满足 \(t_{i+1}\) 是 \(t_{i}\) 的子串,要让 \(t\) 最大. \(|S| \leq 5\times 10^5\). 分析 定义 ...

  10. CF1063F. String Journey(后缀数组+线段树)

    题目链接 https://codeforces.com/contest/1063/problem/F 题解 虽然本题有时间复杂度较高但非常好写的做法...... 首先,若答案为 \(k\),则一定存在 ...

随机推荐

  1. java第七次作业

    1. 本周学习总结 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Ob ...

  2. 201521123059 《Java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1:常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...

  3. 201521123051《Java程序设计》第十一周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. Java多线程同步的方法: (1)同步方法:即有synchronized关键字修饰的方法. 由于java的每个对象 ...

  4. 201521123057 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 常用异常 1.题目5-1 1.1 截图你的提交结果(出现学号) 答: 1.2 自己以前编写的代码中经 ...

  5. 201521123049 《JAVA程序设计》 第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  6. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】

    什么是Serlvet? Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们编写java程序想要在网上实现 ...

  7. Spring MVC 的文件下载

    在看Spring MVC文件下载之前请先看Spring MVC文件上传 地址:http://www.cnblogs.com/dj-blog/p/7535101.html 文件下载比较简单,在超链接中指 ...

  8. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因

    转自:彬彬有礼. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因 http://blog.csdn.net/jbb0523/article/details/40268943 题目: ...

  9. Java 编程思想 Chapter_14 类型信息

    本章内容绕不开一个名词:RTTI(Run-time Type Identification) 运行时期的类型识别 知乎上有人推断作者是从C++中引入这个概念的,反正也无所谓,理解并能串联本章知识才是最 ...

  10. 理解ios 11中webview的视口

    iOS 11在状态栏区域带来了一些新的,也许是不直观的行为,这对使用Apache Cordova或Ionic等工具的开发人员尤为重要.特别是,这种行为变化会影响任何基于Web的应用程序,这些应用程序在 ...