题目链接  A Simple Task

题意  给出一个小写字母序列和若干操作。每个操作为对给定区间进行升序排序或降序排序。

考虑权值线段树。

建立26棵权值线段树。每次操作的时候先把26棵线段树上的所有在该区间内的信息清空。

然后再通过类似计数排序的方式从左往右(或从右往左)依次塞进去。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define ls i << 1
#define rs i << 1 | 1
#define lson ls, L, mid
#define rson rs, mid + 1, R typedef long long LL; const int N = 1e5 + 10; struct node{
int sum[2];
int len;
} s[27][N * 3]; int n, q;
int a[N];
char st[N];
int dc[27][N * 3];
int f[27]; inline node update(const node &x, const node &y){
node ret;
ret.len = x.len + y.len;
rep(i, 0, 1) ret.sum[i] = x.sum[i] + y.sum[i];
return ret;
} void build(int cnt, int i, int L, int R){
if (L == R){
int z = a[L] == cnt;
s[cnt][i].len = 1;
s[cnt][i].sum[z] = 1;
s[cnt][i].sum[z ^ 1] = 0;
dc[cnt][i] = -1;
return;
} int mid = (L + R) >> 1;
build(cnt, lson);
build(cnt, rson);
s[cnt][i] = update(s[cnt][ls], s[cnt][rs]);
dc[cnt][i] = -1;
} inline void paintcover(int cnt, int i, int z){
dc[cnt][i] = z;
s[cnt][i].sum[z] = s[cnt][i].len;
s[cnt][i].sum[z ^ 1] = 0;
} inline void pushdown(int cnt, int i){
if (~dc[cnt][i]){
paintcover(cnt, ls, dc[cnt][i]);
paintcover(cnt, rs, dc[cnt][i]);
dc[cnt][i] = -1;
}
} void cover(int cnt, int i, int L, int R, int l, int r, int z){
if (l <= L && R <= r){
paintcover(cnt, i, z);
return;
} pushdown(cnt, i);
int mid = (L + R) >> 1;
if (l <= mid) cover(cnt, lson, l, r, z);
if (r > mid) cover(cnt, rson, l, r, z);
s[cnt][i] = update(s[cnt][ls], s[cnt][rs]);
} int query(int cnt, int i, int L, int R, int l, int r){
int ret = 0;
if (l <= L && R <= r) return s[cnt][i].sum[1];
int mid = (L + R) >> 1;
pushdown(cnt, i);
if (l <= mid) ret += query(cnt, lson, l, r);
if (r > mid) ret += query(cnt, rson, l, r);
return ret;
} int main(){ scanf("%d%d", &n, &q);
scanf("%s", st + 1);
rep(i, 1, n) a[i] = (int)st[i] - 96;
rep(i, 1, 26) build(i, 1, 1, n); while (q--){
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
rep(i, 1, 26) f[i] = query(i, 1, 1, n, x, y);
rep(i, 1, 26) cover(i, 1, 1, n, x, y, 0);
if (z){
int pos = x;
rep(i, 1, 26) if (f[i]){
cover(i, 1, 1, n, pos, pos + f[i] - 1, 1);
pos += f[i];
}
} else{
int pos = x;
dec(i, 26, 1) if (f[i]){
cover(i, 1, 1, n, pos, pos + f[i] - 1, 1);
pos += f[i];
}
}
} rep(i, 1, n){
rep(j, 1, 26) if (query(j, 1, 1, n, i, i)){
putchar(j + 96);
break;
}
} putchar(10);
return 0;
}

  

Codeforces 558E A Simple Task(权值线段树)的更多相关文章

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

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

  2. Codeforces 666E Forensic Examination SAM+权值线段树

    第一次做这种$SAM$带权值线段树合并的题 然而$zjq$神犇看完题一顿狂码就做出来了 $Orz$ 首先把所有串当成一个串建$SAM$ 我们对$SAM$上每个点 建一棵权值线段树 每个叶子节点表示一个 ...

  3. D. Restore Permutation(权值线段树)

    D. Restore Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  5. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  6. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  7. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  8. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  9. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

随机推荐

  1. vue 项目白屏解决方案

    在做的项目是使用 vue-cli 脚手架为基础的,只能使用微信浏览器打开的.在某次更新功能代码后,被反馈在一些手机上会出现白屏.经过一番探索,多管齐下解决了问题 白屏可能的原因: es6 代码没有被编 ...

  2. 【结构型模式】《大话设计模式》——读后感 (12)在NBA我需要翻译?——适配器模式

    适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能在一起工作的 那些类可以在一起工作了[DP] UML类图: 简单模拟一下代码: //已存在的.具有 ...

  3. day 37 MySQL行(记录)的详细操作

    MySQL行(记录)的详细操作   阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操 ...

  4. 模拟ajax请求爬取微博

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/9/26 10:26 # @Author : Sa.Song # @Desc ...

  5. 搜索引擎elasticsearch常用指令演示

    目录 交互方式 常用操作示例 添加文档 删除文档 修改文档 查询 简单查询 高级多条件查询 交互方式 操作ES有3种方式: kibana控制台(Dev Tools) Http + json api接口 ...

  6. VS重置开发环境的方法

    经常由于各种插件的原因,导致VS有使用过程中出现断点进不去等各种情况的时候,这个方法可以让你的VS回到最初安装的状态,当然,这时候,各种配置也没有了,不到万不得已就勿使用. 下面以Vs2015来说明: ...

  7. JAVA-基础(一)

    1.一个变量可以声明为final,这样做的目的是阻止它的内容被修改.这意味着在声明final 变量的时候,你必须初始化它(在这种用法上,final类似于C/C++中的const). 例如: final ...

  8. mongo以及mysql常用语句

    db.user.find({']}}).pretty(); db.user.find({primaryPhone:).forEach(function(user){print('my phonenum ...

  9. 51nod1832 先序遍历与后序遍历

    对于给定的一个二叉树的先序遍历和后序遍历,输出有多少种满足条件的二叉树.两棵二叉树不同当且仅当对于某个x,x的左儿子编号不同或x的右儿子编号不同. Input 第一行一个正整数n(3<=n< ...

  10. isinstance 和 type 的区别

    class A: pass class B(A): pass isinstance(A(), A) # returns True type(A()) == A # returns True isins ...