题目链接

用权值线段树维护每个字母在\([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 (权值线段树)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. BZOJ_2161_布娃娃_权值线段树

    BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...

  10. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

随机推荐

  1. “小葵日记”API接口文档

    "小葵日记"项目API接口文档 时间:2017/10/31 (1)用户登录[待完成] POST:127.0.0.1/index/user/login data 数据别称 数据名 数 ...

  2. ACM 第十八天

    数学基础(卷积,FFT,FWT,FMT,鸽巢原理,群论,哈里亚余数,哈里亚计数定理,组合数学,LVG定理,期望DP,期望点贡献问题) 练习题: A - Necklace of Beads Beads ...

  3. C# 正则表达式 最全的验证类

    ///<summary> ///验证输入的数据是不是正整数 ///</summary> ///<param name="str">传入字符串&l ...

  4. windows批处理学习(call与start)---02

    参考:https://www.cnblogs.com/Braveliu/p/5078283.html 一.call命令总结 (1)call命令简介 语法: call [ [Drive:] [Path] ...

  5. centos7编译安装redis遇坑

    编译redis时:make cc Command not found 原因分析:没有安装gcc,执行: yum install gcc 编译redis时:error: jemalloc/jemallo ...

  6. 2011 Multi-University Training Contest 7 - Host by ECNU

    AC: F I. rank 40/88. 开场看了F发现是个简单的DP,随便写了一下WA,,,发现把样例倒着输就过不了了...原来是忘了最后的时候开始上课的话可能上不了多久... 想到一个简洁的状态方 ...

  7. 【bzoj1579】[Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路

    题目描述 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 < ...

  8. linux文件服务器:samba服务器

    windows上,需要和linux虚拟机进行方便的文件交互,总结一下遇到的问题. 1.samba简介 windows和windows之间共享文件可以用“网上邻居”,linux和linux间共享文件用 ...

  9. wsgiref 源码解析

    Web Server Gateway Interface(wsgi),即Web服务器网关接口,是Web服务器软件和用Python编写的Web应用程序之间的标准接口. 想了解更多关于WSGI请前往: h ...

  10. Socket_SSH-3(粘包)

    粘包:两次数据粘到一起了.在Windows中基本看不出来效果. 服务器端的配置: import socket,os,time server=socket.socket() server.bind((' ...