【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 输出当前最小值,若不存 ...
随机推荐
- 【转】bind简单示例
bind简单示例代码 namespace { class placeholder_ {}; placeholder_ __1; } template <typename R, typename ...
- <Effective C++>读书摘要--Ctors、Dtors and Assignment Operators<二>
<Item 9> Never call virtual functions during construction or destruction 1.you shouldn't call ...
- 无法打开mfc120.lib
今天在用VS2013编译OSG的时候报错:无法打开mfc120.lib.仔细查了下资料. 我是这么解决的: 安装Multibyte MFC Library for Visual Studio 2013 ...
- Innodb 中 RR 隔离级别能否防止幻读?
问题引出 我之前的一篇博客 数据库并发不一致分析 有提到过事务隔离级别以及相应加锁方式.能够解决的并发问题. 标准情况下,在 RR(Repeatable Read) 隔离级别下能解决不可重复读(当行修 ...
- adb shell input keyevent值所对应的字符
转自:http://blog.csdn.net/chen825919148/article/details/18732041 0 --> "KEYCODE_UNKNOWN" ...
- MySQL event调度
基本命令 //查看事件调度是否开启 show variables like '%event_scheduler%'; //开启事件调度 SET GLOBAL event_scheduler = ON; ...
- [OS] CPU调度
调度准则 为了比较CPU调度算法,分析员提供了许多准则,用于比较的特征对确定最佳算法有很大影响.这些准则包括: ·CPU使用率:需要使CPU尽可能忙. ·吞吐量:一个时间单元内完成进程的数量. ·周转 ...
- html5 拖拽练习题
html5新的拖拽 只支持Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 来一个实例: <!DOCTYPE html& ...
- POJ2549:Sumsets——题解
http://poj.org/problem?id=2549 题目大意:从集合中找到四个不相同的数,满足a+b+c=d,输出最大的d. —————————————————————————— 该式子变为 ...
- bzoj4518: [Sdoi2016]征途(DP+决策单调性分治优化)
题目要求... 化简得... 显然m和sum^2是已知的,那么只要让sigma(si^2)最小,那就变成了求最小平方和的最小值,经典的决策单调性,用分治优化即可. 斜率优化忘得差不多就不写了 #inc ...