【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 输出当前最小值,若不存 ...
随机推荐
- <Android>spinner/AutoCompleteTextView绑定适配器
position = (Spinner)findViewById(R.id.position); String[] str = {"CEO","CFO",&qu ...
- C# Winform防止闪频和再次运行
其实想实现只允许运行一个实例很简单,就是从program的入口函数入手.有两种情况: 第一种,用户运行第二个的时候给一个提示: using System; using System.Collectio ...
- Unity3d学习日记(二)
跟着教程做让背景可以滚动起来并添加了背景的粒子特效,加入了敌机. ctrl攻击,↑↓←→移动,Game Over后按R重新开始游戏. Space Shooter游戏地址:http://ya ...
- Ansys Workbench热流固耦合仿真配置
1.Fluent-Thermal-Structural瞬态分析 此模块连接在fluent已实现流体和固体的热流耦合,传递至thermal实际上只是将流体表面温度作为热载荷施加在固体的液体通道表面,极大 ...
- Hibernate使用详解(一)
一.前言 这些天都在为公司框架重构做准备,浏览了一下代码,挑了几个不熟或者没接触过的知识点进行攻坚,hibernate是其中之一.其实接触hibernate是在大学期间,应该是在2012年,已经201 ...
- 如何取得dbgrid中未保存(post)的值(50分)
比如说处在编辑状态时,想取得当前记录值 Dataset.fields[0].Value 就是当前值:Dataset.fields[0].OldValue 就是原始值. 呵呵,我指得是在编辑时,就是按键 ...
- poj3074-Sodoku
解数独. 分析 考虑如何把数独解合法的条件转化为经典的01精确覆盖: 每个格子只能填一个数,1-9 每一列刚好填了1-9 每一行刚好填了1-9 每个九宫格刚好填了1-9 也就是说,每个格子,列,行,九 ...
- 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...
- web服务器压测工具siege、ab
web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...
- [USACO06NOV]玉米田Corn Fields 状压DP
题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...