【CF558E】 A Simple Task (权值线段树)
题目链接
用权值线段树维护每个字母在\([l,r]\)出现的次数,每次修改把每个字母在区间的出现次数记下来,然后清空这段区间,再按顺序插进去就好了。
时间复杂度\(O(n\log n*26)\)
(好久没写正常的维护和的线段树了,这次还要打清零的标记,能一遍写过,好开森)
#include <cstdio>
#include <cstring>
int o; char ch;
inline int read(){
o = 0; ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9'){ o = o * 10 + ch - '0'; ch = getchar(); }
return o;
}
const int MAXN = 100010;
struct SegTree{
#define left (now << 1)
#define right (now << 1 | 1)
int sum[MAXN << 2], s[MAXN << 2], c[MAXN << 2];
inline void pushup(int now){
sum[now] = sum[left] + sum[right];
}
inline void pushdown(int now, int k){
if(c[now]){
sum[left] = sum[right] = s[left] = s[right] = 0;
c[left] = c[right] = 1;
c[now] = 0;
}
if(s[now]){
int len = k >> 1;
sum[left] += (k - len) * s[now];
sum[right] += len * s[now];
s[left] = s[right] = s[now];
s[now] = 0;
}
}
void update(int now, int l, int r, int wl, int wr){
if(l > wr || r < wl) return;
if(l >= wl && r <= wr){ sum[now] += (r - l + 1); ++s[now]; return; }
pushdown(now, r - l + 1);
int mid = (l + r) >> 1;
update(left, l, mid, wl, wr);
update(right, mid + 1, r, wl, wr);
pushup(now);
}
void clear(int now, int l, int r, int wl, int wr){
if(l > wr || r < wl) return;
if(l >= wl && r <= wr){ sum[now] = 0; s[now] = 0; c[now] = 1; return; }
pushdown(now, r - l + 1);
int mid = (l + r) >> 1;
clear(left, l, mid, wl, wr);
clear(right, mid + 1, r, wl, wr);
pushup(now);
}
int query(int now, int l, int r, int wl, int wr){
if(l > wr || r < wl) return 0;
if(l >= wl && r <= wr) return sum[now];
pushdown(now, r - l + 1);
int mid = (l + r) >> 1, ans = 0;
ans += query(left, l, mid, wl, wr);
ans += query(right, mid + 1, r, wl, wr);
return ans;
}
}s[27];
int n, m, A, B, C, tmp[27];
char a[MAXN];
int main(){
n = read(); m = read();
scanf("%s", a);
int len = strlen(a);
for(int i = 0; i < len; ++i)
s[a[i] - 'a'].update(1, 1, n, i + 1, i + 1);
for(int i = 1; i <= m; ++i){
A = read(); B = read(); C = read();
if(C){
for(int j = 0; j < 26; ++j)
tmp[j] = s[j].query(1, 1, n, A, B), s[j].clear(1, 1, n, A, B);
int cur = A;
for(int j = 0; j < 26; ++j)
if(tmp[j])
s[j].update(1, 1, n, cur, (cur + tmp[j]) - 1), cur += tmp[j];
}
else{
for(int j = 0; j < 26; ++j)
tmp[j] = s[j].query(1, 1, n, A, B), s[j].clear(1, 1, n, A, B);
int cur = B;
for(int j = 0; j < 26; ++j)
if(tmp[j])
s[j].update(1, 1, n, (cur - tmp[j]) + 1, cur), cur -= tmp[j];
}
}
for(int i = 1; i <= n; ++i)
for(int j = 0; j < 26; ++j)
if(s[j].query(1, 1, n, i, i)){
printf("%c", j + 'a');
break;
}
return 0;
}
【CF558E】 A Simple Task (权值线段树)的更多相关文章
- Codeforces 558E A Simple Task(权值线段树)
题目链接 A Simple Task 题意 给出一个小写字母序列和若干操作.每个操作为对给定区间进行升序排序或降序排序. 考虑权值线段树. 建立26棵权值线段树.每次操作的时候先把26棵线段树上的 ...
- D. Restore Permutation(权值线段树)
D. Restore Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
- 动态求区间K大值(权值线段树)
我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树
原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
- BZOJ_2161_布娃娃_权值线段树
BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...
- BZOJ_3685_普通van Emde Boas树_权值线段树
BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x 若x不存在,插入x 2 x 若x存在,删除x 3 输出当前最小值,若不存 ...
随机推荐
- 一个项目的Makefile编写及调试
父Makefile 在src目录下包含很多文件夹,那么需要遍历所有的目录执行Makefile,那么给一个在src目录下的Makefile. # 需要排除的目录 exclude_dirs := incl ...
- jstat查看jvm的GC
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...
- Spring Boot中使用@Transactional注解配置事务管理
事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...
- JavaScript 语句标识符,变量周期,常见的HTML事件
语句 描述 break 用于跳出循环. catch 语句块,在 try 语句块执行出错时执行 catch 语句块. continue 跳过循环中的一个迭代. do ... while 执行一个语句块, ...
- 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组
题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...
- hdu 3339 In Action (最短路径+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Socket_SSH-1
服务器端: import socket,os server=socket.socket() server.bind(('localhost',9999)) server.listen() while ...
- Mysql 基本语句练习
一.怎样查看数据库信息? desc 数据库名; 二.怎样查看数据表信息? desc 表名: //查看表的属性和属性值 或者用select语句: //查看表的行记录信息 select ...
- [NOI2009]管道取珠 DP + 递推
---题面--- 思路: 主要难点在思路的转化, 不能看见要求$\sum{a[i]^2}$就想着求a[i], 我们可以对其进行某种意义上的拆分,即a[i]实际上可以代表什么? 假设我们现在有两种取出某 ...
- BZOJ3894:文理分科——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3894 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理 ...