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\),则一定存在 ...
随机推荐
- 个人附加作业XD --这门课终于结束了~~
你认为每次项目的评分标准存在哪些问题,你认为的合理评分准则是怎样的(个人/结对/团队算三个) 评分的话我个人觉得是存在一些问题的. 第一,分数差异 问题:一个就是各班的成绩评分有高有低,有的班整体分数 ...
- 团队作业八—第二次团队冲刺(Beta版本) 第 2 天
一.每个人的工作 (1) 昨天已完成的工作 昨天的工作主要是一些界面的设计,我们顺利完成了复杂模式题目数目界面.复杂模式做题界面.结果统计界面的具体代码编写,和一些细节的完善.还有日常冲刺博客的编辑. ...
- 【Alpha阶段】第七次scrum meeting
一.会议照片 二.会议内容 姓名 学号 负责模块 昨日任务 今日任务 杨爱清 099 界面设计和交互功能 [完成]设计界面 交互功能连接并优化 杨立鑫 100 数据库搭建和其他 [完成]将数据库与其他 ...
- 【Alpha】——Second Scrum Meeting
一.今日站立式会议照片 二.每个人的工作 成员 昨天已完成的工作 今天计划完成的工作 李永豪 完成登录按钮代码 完成添加功能 郑靖涛 完成登录按钮代码 完成删除功能 杨海亮 完成注册按钮代码 完成查找 ...
- Java课程设计 - 学生基本信息管理
团队名称.团队成员介绍(需要有照片) 团队名称:此艺兴非彼艺兴 团队成员: 王兴:女,积极上进 曾艺佳:女,积极上进 项目git地址 StudentManage项目 项目git提交记录截图(要体现出每 ...
- Maven常见错误以及解决方案【转载】
常见的Maven错误 当遇到401错误的时候,看看自己当前使用的Maven是集成的还是自己下载的,然后去配置setting.xml文件
- JSP第七篇【简单标签、应用、DynamicAttribute接口】
为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并且还要知道SKIP_ ...
- TCP/IP(五)传输层(TCP的三次握手和四次挥手)
前言 这一篇我将介绍的是大家面试经常被会问到的,三次握手四次挥手的过程.以前我听到这个是什么意思呀?听的我一脸蒙逼,但是学习之后就原来就那么回事! 一.运输层概述 1.1.运输层简介 这一层的功能也挺 ...
- ch340是什么芯片
CH340 是一个USB 总线的转接芯片,实现USB 转串口.USB 转IrDA 红外或者USB 转打印口. 在串口方式下,CH340 提供常用的MODEM联络信号,用于为计算机扩展异步串口, ...
- netty4.x 传输文件
一:简介 netty传输文件的例子并不多,当前的项目刚才需要使用netty,所以就记录一下使用方法,使用netty传输文件,首先需要启动一个服务端,等待服务端请求监听,然后传输文件的时候,启动一个客户 ...