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\),则一定存在 ...
随机推荐
- 201521123107 《Java程序设计》第9周学习总结
第9周作业-异常 1.本周学习总结 2.书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什 ...
- JAVA基础第八组(5道题)
36. 37. 38.[程序38] 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. package com.niit.homework1; import java.u ...
- 团队作业4——第一次项目冲刺(Alpha版本)第六天and第七天
团队作业4--第一次项目冲刺(Alpha版本)第六天and第七天 第一次项目冲刺(Alpha版本)第六天 一.Daily Scrum Meeting照片 二.燃尽图 1.解释说明横纵坐标代表的含义 ...
- 201521123032 《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 在课堂上在老师 ...
- 201521123036 《Java程序设计》第13周学习总结
本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 书面作业 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分 ...
- 201521123062 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123078 《java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 创建线程:定义Thread的子类可以实现Runable接口 线程的控制:线程暂停Thread.sleep() ...
- JDBC操作数据库之查询数据
以数据库中查找图书信息,并将信息显示在jsp页面当中为例,下面贴上代码片段: (1)在index.jsp页面代码body中只要添加如下一段代码: <a href="FindServle ...
- php显示距当前多长时间
<?php header("Content-type: text/html; charset=utf-8");date_default_timezone_set('PRC') ...
- 用static声明的函数和变量小结
static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static ...