大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列.

类似于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 (线段树维护序列)的更多相关文章

  1. CodeForces 343D 线段树维护dfs序

    给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...

  2. Codeforces 889F Letters Removing(二分 + 线段树 || 树状数组)

    Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set ...

  3. Tree Generator™ CodeForces - 1149C (线段树,括号序列)

    大意: 给定括号序列, 每次询问交换两个括号, 求括号树的直径. 用[ZJOI2007]捉迷藏的方法维护即可. #include <iostream> #include <algor ...

  4. 【bzoj4712】洪水 树链剖分+线段树维护树形动态dp

    题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含 ...

  5. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  6. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  7. 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 ...

  8. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

  9. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

随机推荐

  1. Aes CBC加密

    <?php namespace app\components; use yii; class Aes { /** * This was AES-128 / CBC / PKCS5Padding ...

  2. 煎蛋ooxx

    pipeline.py class Jiandanline(FilesPipeline): def get_media_requests(self, item, info): for file_url ...

  3. sql sugar

    事务 using (var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.xxx, DbType ...

  4. Makefile 编译时虽然加上了-g 选项 但是还是无法调试

    make 编译时默认的命令是all,不能写成其他的

  5. oracle 两张关联表执行更新update

    UPDATE T_ASN_DTL ad1 SET ad1.cf03=( SELECT ac.TH003 FROM "T_ASN_DTL_copy" ac WHERE ac.udf0 ...

  6. Why choose Nexiq USB-link 125032 Diesel Truck Diagnose

    Nexiq 125032 usb link is Diesel Truck diagnostic Interface. Nexiq truck scanner can compatible with ...

  7. leetcode 1——两数之和

    问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...

  8. 第十七节 Cookie基础与应用

    什么是cookie:其实就是页面用来保存信息:比如,自动登录.记住用户名 cookie的特性:(以域名为单位的) 同一个网站(同一个域名)中所有页面共享一套cookie 数量.大小有限,跟浏览器有关, ...

  9. LeetCode 整数反转

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...

  10. 利用python抓取页面数据

    1.首先是安装python(注意python3.X和python2.X是不兼容的,我们最好用python3.X) 安装方法:安装python 2.安装成功后,再进行我们需要的插件安装.(这里我们需要用 ...