https://vjudge.net/contest/446582#problem/B

这道题是一道不错的线段树练代码能力的题。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
char s[N];
int a[N];
struct segmentree {
int l,r,cnt[27],lazy[27];
}T[N];
void Push_up(int x) {
for(int i=0;i<26;i++)T[x].cnt[i]=T[x*2].cnt[i]+T[x*2+1].cnt[i];
}
void Build_tree(int x,int l,int r) {
T[x].l=l,T[x].r=r;
for(int i=0;i<26;i++) T[x].cnt[i]=0,T[x].lazy[i]=-1;
if(l==r) {T[x].cnt[a[l]]++;return;}
int mid=(T[x].l+T[x].r)>>1;
Build_tree(x*2,l,mid),Build_tree(x*2+1,mid+1,r);
Push_up(x);
}
void Push_down(int x) {
for(int i=0;i<26;i++) {
if(T[x].lazy[i]==0) T[x*2].cnt[i]=T[x*2+1].cnt[i]=T[x*2].lazy[i]=T[x*2+1].lazy[i]=0;
if(T[x].lazy[i]==1) {
T[x*2].cnt[i]=T[x*2].r-T[x*2].l+1,T[x*2].lazy[i]=1;
T[x*2+1].cnt[i]=T[x*2+1].r-T[x*2+1].l+1,T[x*2+1].lazy[i]=1;
}
}
for(int i=0;i<26;i++) T[x].lazy[i]=-1;
}
void Update(int x,int l,int r,int p) { //[l,r]->p
if(l<=T[x].l&&T[x].r<=r) {
for(int i=0;i<26;i++)T[x].cnt[i]=T[x].lazy[i]=0;
T[x].cnt[p]=T[x].r-T[x].l+1,T[x].lazy[p]=1;
return;
}
Push_down(x);
int mid=(T[x].l+T[x].r)>>1;
if(l<=mid)Update(x*2,l,r,p);
if(r>mid)Update(x*2+1,l,r,p);
Push_up(x);
}
int get_cnt(int x,int l,int r,int p) {
if(l<=T[x].l&&T[x].r<=r) return T[x].cnt[p];
Push_down(x);
int sum=0,mid=(T[x].l+T[x].r)>>1;
if(l<=mid)sum+=get_cnt(x*2,l,r,p);
if(r>mid)sum+=get_cnt(x*2+1,l,r,p);
return sum;
}
int Cnt[27];
int main() {
int n,q;
scanf("%d%d",&n,&q);
scanf("%s",s);
for(int i=1;i<=n;i++)a[i]=s[i-1]-'a';
Build_tree(1,1,n);
while(q--) {
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
if(!k) {
for(int i=0;i<26;i++) Cnt[i]=get_cnt(1,x,y,i);
int L=x,R;
for(int i=25;i>=0;i--) {
if(!Cnt[i])continue;
R=L+Cnt[i]-1;
Update(1,L,R,i);
L=R+1;
}
}
else {
for(int i=0;i<26;i++) Cnt[i]=get_cnt(1,x,y,i);
int L=x,R;
for(int i=0;i<26;i++) {
if(!Cnt[i])continue;
R=L+Cnt[i]-1;
Update(1,L,R,i);
L=R+1;
}
}
}
for(int i=1;i<=n;i++) {
for(int j=0;j<26;j++) {
if(get_cnt(1,i,i,j)) {
printf("%c",(char)('a'+j));break;
}
}
}
return 0;
}

B - A Simple Task的更多相关文章

  1. 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task

    E. A Simple Task Problem's Link: http://codeforces.com/problemset/problem/558/E Mean: 给定一个字符串,有q次操作, ...

  2. HDU-1339 A Simple Task

    http://acm.hdu.edu.cn/showproblem.php?pid=1339 正常做法超时,要有点小技巧存在. A Simple Task Time Limit: 2000/1000 ...

  3. A Simple Task

    A Simple Task Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. Codeforces 558E A Simple Task (计数排序&&线段树优化)

    题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...

  5. 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 ...

  6. 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 ...

  7. 【题解】 CF11D A Simple Task

    [题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...

  8. Codeforces 558E A Simple Task(权值线段树)

    题目链接  A Simple Task 题意  给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...

  9. A Simple Task CodeForces - 11D

    A Simple Task CodeForces - 11D 题意:输出一个无向图的简单环数量.简单环指无重复边的环.保证图无重边自环. ans[i][j]表示"包含i中的点,以i中第一个点 ...

  10. 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 ...

随机推荐

  1. 前端调试利器 - Charles

    Docs 开发之 Charles 配置指南 1.下载与安装 charles-proxy-4.1.4 .dmg56.12 MB已存到云盘下载 2.激活 使用公司正版license 激活 安装证书 点击证 ...

  2. mapreduce分区

    本次分区是采用项目垃圾分类的csv文件,按照小于4的分为一个文件,大于等于4的分为一个文件 源代码: PartitionMapper.java: package cn.idcast.partition ...

  3. js select 删除某一项下拉列表的值

    <script type="text/javascript"> //muqingwei modify 通过群组类别选择需要的的群组 var mySelect = doc ...

  4. 最小栈问题:题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

    MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.get ...

  5. DRF-认证权限频率

    目录 DRF-认证权限频率 认证 登录接口 认证 权限 作用 使用 频率 作用 使用 认证权限频率+五个接口 模型 视图 序列化器 认证权限频率类 配置文件 路由 DRF-认证权限频率 前后端混合开发 ...

  6. What are PCIe Slots

    https://www.hp.com/us-en/shop/tech-takes/what-are-pcie-slots-pc What are PCIe Slots and How Can I Us ...

  7. 开发中常用的Hook

    开发中常用的Hook 什么是Hook? Hook 是一些可以让你在函数组件里"钩入" React state 及生命周期等特性的函数,用来实现一些 class 组件的特性的. 1 ...

  8. toggleClass() 把本来的有的类名去掉 本来没有的 加上

    连续点击按钮可以交替颜色,就是改变class

  9. partOne代码修改

    学生毕业论文系统----代码修改   /* 基本类ScoreInformation类相较之前无变化*/public class ScoreInformation { private String st ...

  10. k8s入门之集群搭建(二)

    一.准备三台节点 从上篇文章 k8s入门之基础环境准备(一)安装的Ubuntu虚拟机克隆出三台虚拟机,如图所示 启动这三台虚拟机节点,分别做如下配置 虚拟机名称 IP HostName k8sMast ...