YYHS-string(线段树)

题解
这道题给你两个操作,一个升序,一个降序
我们可以观察到这个字符串都是由小写字母组成的,只有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(线段树)的更多相关文章
- 考试题string——线段树。
string[题目描述]给定一个由小写字母组成的字符串 s.有 m 次操作,每次操作给定 3 个参数 l,r,x.如果 x=1,将 s[l]~s[r]升序排序;如果 x=0,将 s[l]~s[r]降序 ...
- JZOJ P5829 HZOI 20190801 A string 线段树
JZOJ P5829 A. string 题面:https://www.cnblogs.com/Juve/articles/11286476.html 考场上想起了排序这道题:https://www. ...
- string [线段树优化桶排]
题意大概是给你一个字符串,1e5次修改,每次给一个区间升序排列或降序排列,最后输出这个字符串; 其实是个挺裸的线段树优化题;但是我没有意识去结合桶排,扑该..... 首先 1.40分算法 O(NMlo ...
- hdu3973 AC's String 线段树+字符串hash
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3973/ 题意是:给出一个模式串,再给出一些串组成一个集合,操作分为两种,一种是替换模式串中的一个字符,还有一种是 ...
- 【模拟8.01】string(线段树)
因为题中只有a-z,所以区间中大量字母都是重复的,我们不妨利用桶的性质. 开一棵树,里面维护当前区间内的相同元素,若区间内元素不同,则为零 每次升序操作就先查询一遍区间,用桶将每个区间的a-z元素统计 ...
- HDU5008 Boring String Problem(后缀数组 + 二分 + 线段树)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5008 Description In this problem, you are given ...
- HDU 6096 String 排序 + 线段树 + 扫描线
String Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem De ...
- HDU - 3973 AC's String(Hash+线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=3973 题意 给一个词典和一个主串.有两种操作,查询主串某个区间,问这主串区间中包含多少词典中的词语.修改主串某一 ...
- [CF1063F]String Journey[后缀数组+线段树]
题意 在 \(S\) 中找出 \(t\) 个子串满足 \(t_{i+1}\) 是 \(t_{i}\) 的子串,要让 \(t\) 最大. \(|S| \leq 5\times 10^5\). 分析 定义 ...
- CF1063F. String Journey(后缀数组+线段树)
题目链接 https://codeforces.com/contest/1063/problem/F 题解 虽然本题有时间复杂度较高但非常好写的做法...... 首先,若答案为 \(k\),则一定存在 ...
随机推荐
- 英语词典Alpha版本发布说明
Alpha版本发布说明 功能: ·简洁的应用界面,不被无良的广告弹窗影响 ·功能直接,在需要查词时及时出现,没有每日一句精选文章等杀了你的流量,在学习过程中更加专注! ·采用金山词霸API,提供发音 ...
- 联想G50-70安装SSD及WIN10教程
借着双11的东风,果断入手SSD120G和4G内存条1枚.经过近一周的安装与试运行,笔者实现了SSD+HDD双硬盘+WIN10系统.目前运行体验非常好,开机时间9秒,软件运行也非常流畅.在折腾的过程中 ...
- Python[小甲鱼008了不起的分支和循环2]
案例:对所给的分数进行评级,以下有三种方案: score = int(input('请输入一份分数')) #第一种方案 if 100 >= score >= 90: print('A') ...
- 2017JAVA课程设计
1.团队课程设计博客链接 http://www.cnblogs.com/ltykm/p/7063663.html 2.个人负责模块或任务说明 本人任务:定时器具体功能的实现 3.自己的代码提交记录截图 ...
- 201521123101 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.2 te ...
- java乱码问题处理
java乱码问题处理 java乱码出现的问题有很多,这里主要解释tomcat,jsp,html,http(get,post请求乱码处理).常见的问题可能是tomcat,http请求乱码问题,对于jsp ...
- Unity GameObject Class
GameObject Note : gameObject 指的是当前挂着的对象. class in UnityEngine / Inherits from:Object Descriptio ...
- 【京东详情页】——原生js爬坑之放大镜
一.引言 在商城的详情页中,放大镜的功能是很常见的.这里京东详情页就要做一个仿放大镜的效果,预览如下: 二.实现原理 实际上,放大镜的实现是单纯用几个div,鼠标移入其中一个小图div,触发事件显示另 ...
- 微服务~Eureka实现的服务注册与发现及服务之间的调用
微服务里一个重要的概念就是服务注册与发现技术,当你有一个新的服务运行后,我们的服务中心可以感知你,然后把加添加到服务列表里,然后当你死掉后,会从服务中心把你移除,而你作为一个服务,对其它服务公开的只是 ...
- C#的"?"修饰符和"??"运算符
一. ? 可空类型修饰符 “?”用来修饰为空的值类型,在加上“?”修饰符后,值类型也可以为空了,如: public int? CommandTimeout { get; }: var prop = ...