Letters Removing CodeForces - 899F (线段树维护序列)
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列.
类似于splay维护序列. 每次删除都会影响到后面字符的位置
可以通过转化为查询前缀和=k来查找下标.
#include <iostream>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
using namespace std; const int N = 2e5+10;
int n, m;
char s[N];
int tr[63][N<<2];
bool vis[63][N<<2];
inline void pu(int o) {
REP(i,1,62) tr[i][o]=tr[i][lc]+tr[i][rc];
}
inline void pd(int o) {
REP(i,1,62) if (vis[i][o]) {
tr[i][lc]=0,vis[i][lc]=1;
tr[i][rc]=0,vis[i][rc]=1;
vis[i][0]=0;
}
}
int get(char x) {
if ('0'<=x&&x<='9') return x-'0'+1;
if ('A'<=x&&x<='Z') return x-'A'+11;
return x-'a'+37;
}
void build(int o, int l, int r) {
if (l==r) ++tr[get(s[l])][o];
else build(ls),build(rs),pu(o);
}
int find(int o, int l, int r, int k) {
if (l==r) return l;
int s = 0;
REP(i,1,62) {
if (vis[i][o]) {
tr[i][lc]=0,vis[i][lc]=1;
tr[i][rc]=0,vis[i][rc]=1;
vis[i][o]=0;
}
else s+=tr[i][lc];
}
if (s>=k) return find(ls,k);
return find(rs,k-s);
}
void update(int o, int l, int r, int ql, int qr, int v) {
if (ql<=l&&r<=qr) return tr[v][o]=0,vis[v][o]=1,void();
pd(o);
if (mid>=ql) update(ls,ql,qr,v);
if (mid<qr) update(rs,ql,qr,v);
pu(o);
}
void dfs(int o, int l, int r) {
if (l==r) {
if (tr[get(s[l])][o]) printf("%c", s[l]);
}
else pd(o),dfs(ls),dfs(rs);
}
int main() {
scanf("%d%d%s", &n, &m, s+1);
build(1,1,n);
REP(i,1,m) {
int l, r;
char c;
scanf("%d%d %c", &l, &r, &c);
l=find(1,1,n,l),r=find(1,1,n,r);
update(1,1,n,l,r,get(c));
}
dfs(1,1,n);hr;
}
Letters Removing CodeForces - 899F (线段树维护序列)的更多相关文章
- CodeForces 343D 线段树维护dfs序
给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...
- Codeforces 889F Letters Removing(二分 + 线段树 || 树状数组)
Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set ...
- Tree Generator™ CodeForces - 1149C (线段树,括号序列)
大意: 给定括号序列, 每次询问交换两个括号, 求括号树的直径. 用[ZJOI2007]捉迷藏的方法维护即可. #include <iostream> #include <algor ...
- 【bzoj4712】洪水 树链剖分+线段树维护树形动态dp
题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含 ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...
- [Codeforces]817F. MEX Queries 离散化+线段树维护
[Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
随机推荐
- goldsun取经----python2与 python3的差异
python2与 python3的差异 1.编码方式 python2中有ASCII str()类型,unicode是单独的,不是byte类型,不支持中文 python3中有Unicode(utf-8) ...
- PHP安装APC扩展,亲测成功
1.在浏览器中输入https://pecl.php.net/package/APC选择安装包激进型下载.(可以选择Windows版本或者是Linux版本).注:以下是在Linux系统上进行操作!
- 《高性能Mysql》解读---Mysql的事务和多版本并发
1.base:ACID属性,并发控制 2.MySql事务的隔离级别有哪些,含义是什么? 3.锁知多少,读锁,写锁,排他锁,共享锁,间隙锁,乐观锁,悲观锁. 4.Mysql的事务与锁有什么关联?MySq ...
- 【数据结构】算法 Maximum Subarray
最大子数组:Maximum Subarray 参考来源:Maximum subarray problem Kadane算法扫描一次整个数列的所有数值,在每一个扫描点计算以该点数值为结束点的子数列的最大 ...
- Hibernate的工作原理及使用的原因
一.工作原理: 1.读取并解析配置 2.读取并解析映射信息,创建Session Factory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Sess ...
- c++算法实现(一) - 递归和初始化
递归 写递归函数经常出错,提醒自己两个规则: 1. 一般来说递归函数中不应该出现for.while之类的循环语句, 因为递归就是循环的另外一种实现: 2. 注意基线条件,具体参考<算法图解> ...
- Elastic-Job 配置介绍
作业配置 与Spring容器配合使用作业,可以将作业Bean配置为Spring Bean,可在作业中通过依赖注入使用Spring容器管理的数据源等对象.可用placeholder占位符从属性文件中取值 ...
- 使用Python的库qrcode生成二维码
现在有很多二维码的生成工具,在线的,或者安装的软件,都可以进行生成二维码.今天我用Python的qrcode库生成二维码.需要预先安装 Image 库 安装 用pip安装 # pip install ...
- 修改Vim内注释字体颜色
vim /etc/vimrc 然后按大写 G 到最后一行,插入 hi comment ctermfg=6 wq保存退出 PS:默认的注释颜色是4 然后有0,1,2,3,4,5 ...
- zabbix监控服务搭建
命令配置 浏览器配置: 检查必须全部ok(若有warning,检查是否漏装包,重启php-fpm服务) 数据库信息 主机名(zabbix server ip).端口号(默认).名字(随意) 配置摘要 ...