cf A Simple Task---线段树
Examples
10 5
abacdabcda
7 10 0
5 8 1
1 4 0
3 6 0
7 10 1
cbcaaaabdd
10 1
agjucbvdfk
1 10 1
abcdfgjkuv
题意:给定一个字符串,长度为n,q次操作,对于每次操作,但flag为1时,l——r为非减序列,当flag为0时,l——r为非增序列。
输出q次操作后的字符串。
思路:考虑记数排序,这样时间复杂度为26nlogn。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define M 100000+10 int bj[M],k[M],sum[*M],lazy[*M];
char s[M];
char z[M];
struct node
{
int l,r,flag;
} b[M];
void build(int i,int l,int r)//建树
{
lazy[i]=-;
if(l==r)
{
sum[i]=k[l];
return ;
}
int mid=(l+r)>>;
build(i*,l,mid);
build(+i*,mid+,r);
sum[i]=sum[i*]+sum[+i*];
}
void pushdown(int i,int l,int r)//lazy下推
{
if(lazy[i]==-)
return ;
int mid=(l+r)>>;
lazy[i*]=lazy[+i*]=lazy[i];
sum[i*]=(mid-l+)*lazy[i];
sum[+i*]=(r-mid)*lazy[i];
lazy[i]=-;
return ;
} int query1(int i,int l,int r,int x,int y)//查询区间和
{
if(l>=x&&r<=y)
{
return sum[i];
}
pushdown(i,l,r);
int mid=(l+r)>>;
int ans=;
if(mid>=x)ans+=query1(i*,l,mid,x,y);
if(mid<y)ans+=query1(i*+,mid+,r,x,y);
sum[i]=sum[i*]+sum[+i*];
return ans;
}
void add(int i,int l,int r,int x,int y,int num)//修改区间
{
if(l>=x&&r<=y)
{
lazy[i]=num;
sum[i]=(r-l+)*num;
return;
}
int mid=(l+r)>>;
pushdown(i,l,r);
if(mid>=x)add(i*,l,mid,x,y,num);
if(mid<y)add(+i*,mid+,r,x,y,num);
sum[i]=sum[i*]+sum[i*+];
} int main()
{ int n,q;
cin>>n>>q;
for(int i=; i<=n; i++)
z[i]='/';
scanf("%s",s+);
for(int i=; i<q; i++)
cin>>b[i].l>>b[i].r>>b[i].flag;
for(int i=; i<; i++) //分别对a,b,c,....z排序
{
char x='a'+i;
for(int j=; j<=n; j++)
if(x==s[j])
bj[j]=;
for(int j=; j<=n; j++)
k[j]=bj[j];
memset(sum,,sizeof(sum));
build(,,n);
for(int j=; j<q; j++)
{
int num=query1(,,n,b[j].l,b[j].r);
if(b[j].flag==)
{
if(num!=)
add(,,n,b[j].l,b[j].l+num-,);
if(b[j].r-b[j].l+!=num)
add(,,n,b[j].l+num,b[j].r,);
}
else
{
if(num!=)
add(,,n,b[j].r-num+,b[j].r,);
if(b[j].r-b[j].l+!=num)
add(,,n,b[j].l,b[j].r-num,);
}
}
for(int j=; j<=n; j++)
{
int x1=query1(,,n,j,j);
if(x1==)
if(z[j]=='/')
z[j]='a'+i;
}
}
for(int i=; i<=n; i++)
printf("%c",z[i]);
puts("");
return ;
}
cf A Simple Task---线段树的更多相关文章
- CF #312 E. A Simple Task 线段树
题目链接:http://codeforces.com/problemset/problem/558/E 给一个字符串,每次对一个区间内的子串进行升序或者降序的排列,问最后字符串什么样子. 对于字符串排 ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树
E. A Simple Task 题目连接: http://www.codeforces.com/contest/558/problem/E Description This task is very ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树+计数排序
题目链接: http://codeforces.com/problemset/problem/558/E E. A Simple Task time limit per test5 secondsme ...
- CodeForces 588E A Simple Task(线段树)
This task is very simple. Given a string S of length n and q queries each query is on the format i j ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记
E. A Simple Task time limit per test5 seconds memory limit per test512 megabytes inputstandard input ...
- Codeforces 588E. A Simple Task (线段树+计数排序思想)
题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵 ...
- CF558E A simple task 线段树
这道题好猥琐啊啊啊啊啊啊 写了一个上午啊啊啊啊 没有在update里写pushup啊啊啊啊 题目大意: 给你一个字符串s,有q个操作 l r 1 :把sl..rsl..r按升序排序 l r 0 :把s ...
- codeforces 558E A Simple Task 线段树
题目链接 题意较为简单. 思路: 由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy. #include <iostream> #include <string> ...
- [Codeforces558E]A Simple Task 线段树
链接 题意:给定一个长度不超过 \(10^5\) 的字符串(小写英文字母),和不超过5000个操作. 每个操作 L R K 表示给区间[L,R]的字符串排序,K=1为升序,K=0为降序. 最后输出最终 ...
- CF 1023D Array Restoration - 线段树
题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...
随机推荐
- linux文件 特殊权限的使用
http://www.iqiyi.com/a_19rrh3tui5.html 1.说明 i属性不能修改 a只能追加在6以后 [root@xuegod63 ~]# chattr +i a.txt [ro ...
- 【转】HDMI之TMDS信号
转自:https://blog.csdn.net/wangdapao12138/article/details/79935821 HDMI传输原理和DVI相同,由Silicon Image公司发明的T ...
- @mentions for Users with ActionText; 使用Tribute.js库
git clone从https://github.com/chentianwei411/at-mentions-with-action-text 先fork下来,然后拷贝https连接,最后在term ...
- windows 下 修改jmeter ServerAgent端口
from:https://blog.csdn.net/wanglha/article/details/51281462 如果想修改UDP和TCP的端口该如何做呢,可以采用如下的方式: CMD命令进入S ...
- 嵌套if-esle语句
C语言自学之嵌套if-esle语句 Dome : 获奖条件为年销售业绩100万以上,并且入职满两年的员工.小明进入公司1年,销售业绩为120万. 在代码编辑器中使用嵌套if-else语句判断小明是否有 ...
- ImageWatch 无法安装在VS2017环境下的解决方案
Download: https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.ImageWatch#qna For Visua ...
- HIT2019春软件构造->Git&Github学习笔记
由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作 1.基本信息设置(设置签名) 命令 项目级别/仓库级别:仅在当前本地库范围内有效 git ...
- git pull更新错误解决办法
Your local changes to the following files would be overwritten by mergeerror: Your local changes to ...
- Google Analytics电子商务篇(Universal版)
Google Analytics是一款用于统计分析网站流量.浏览行为,可用于衡量用户与您网站的互动情况的全新方式.最近刚接触不久,发现其功能真的十分强大,记录下电子商务配置方法.(新手,老鸟勿喷) G ...
- nginx日志相关运维操作记录
在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计. 1)Nginx日志的标准格式(可参考: ...
