题意:
给一个字符串和m个操作,每次给出l,r,c,把字符串中l-r这段区间的字符为c的字符删掉,求最后的字符串。(n,m<=2e5)
线段树。注意这个区间修改和普通区间修改的区别。

他们都是用树状数组做的哎,可是我对树状数组一直是一脸懵逼

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=+;
const int maxnode=;
int n,m;
char s[maxn];
int a[maxn];
int get(char c){
if(c>='A'&&c<='Z')return c-'A';
if(c>='a'&&c<='z')return c-'a'+;
if(c>=''&&c<='')return c-''+;
}
char res(int x){
if(x>=&&x<)return x+'A';
if(x>=&&x<)return x-+'a';
if(x>=&&x<)return x-+'';
}
int sumv[*maxn],num[*maxn][maxnode];
void build(int o,int L,int R){
if(L==R){
sumv[o]=;
num[o][a[L]]=;
return ;
}
int M=L+(R-L)/;
build(*o,L,M);
build(*o+,M+,R);
sumv[o]=sumv[*o]+sumv[*o+];
for(int i=;i<;i++)
num[o][i]=num[*o][i]+num[*o+][i];
}
int ql,qr,c;
void update(int o,int L,int R){
if(num[o][c]==)return ;
if(ql>R||qr<L)
return ;
if(L==R){
if(num[o][c]){
sumv[o]=;
num[o][c]=;
}
return ;
}
int M=L+(R-L)/;
update(*o,L,M);
update(*o+,M+,R);
sumv[o]=sumv[*o]+sumv[*o+];
num[o][c]=num[*o][c]+num[*o+][c];
}
int find(int o,int L,int R ,int k){
int M=L+(R-L)/;
if(L==R)return L;
if(sumv[*o]>=k)return find(*o,L,M,k);
else return find(*o+,M+,R,k-sumv[*o]);
}
void tra(int o,int L,int R){
if(sumv[o]==)return ;
if(L==R){
for(int i=;i<;i++)
if(num[o][i]){
int c=res(i);
printf("%c",c);
}
return ;
}
int M=L+(R-L)/;
tra(*o,L,M);
tra(*o+,M+,R);
}
int main(){
scanf("%d%d",&n,&m);
scanf("%s",s+);
for(int i=;i<=n;i++)a[i]=get(s[i]);
build(,,n);
int L,R;
char cc;
for(int i=;i<=m;i++){
scanf("%d%d %c",&L,&R,&cc);
L=find(,,n,L),R=find(,,n,R);
ql=L,qr=R,c=get(cc);
update(,,n);
}
tra(,,n);
return ;
}

codeforce452DIV2——F. Letters Removing的更多相关文章

  1. 【CodeForces】899 F. Letters Removing

    [题目]F. Letters Removing [题意]给定只含小写字母.大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串.n&l ...

  2. Codeforces 899 F. Letters Removing (二分、树状数组)

    题目链接:Letters Removing 题意: 给你一个长度为n的字符串,给出m次操作.每次操作给出一个l,r和一个字符c,要求删除字符串l到r之间所有的c. 题解: 看样例可以看出,这题最大的难 ...

  3. Codeforces Round #452 F. Letters Removing

    Description Petya has a string of length n consisting of small and large English letters and digits. ...

  4. codeforces 899F Letters Removing set+树状数组

    F. Letters Removing time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. 899F - Letters Removing

    Codeforces 899F - Letters Removing 思路:考虑一下怎么找到输入的l和r在原来串中的位置,我们想到用前缀和来找,一开始所有位置都为1,删掉后为0,那么前缀和为l的位置就 ...

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

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

  7. Letters Removing CodeForces - 899F (线段树维护序列)

    大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...

  8. CF899F. Letters Removing

    给一个字符串支持以下操作:区间删除某个特定字符.最后输出字符串.n,m<=200000. 这题我居然不会可以回家了.. 首先,单点删除,选个平衡树比如set. 然后,他给的下标是会随删除操作变化 ...

  9. Codeforces 899F Letters Removing 线段树/树状数组

    虽然每次给一个区间,但是可以看作在区间内进行数个点操作,同样数列下标是动态变化的,如果我们将每个字符出现看作1,被删除看作0,则通过统计前缀和就能轻松计算出两个端点的位置了!这正是经典的树状数组操作 ...

随机推荐

  1. Unity3D开发之Matrix4x4矩阵变换

    在Unity开发中时常会用到Matrix4x4矩阵来变换场景中对象的位置.旋转和缩放.但是很多人都不太理解这儿Matrix4x4变换矩阵.通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么 ...

  2. 启动mysql 失败,“Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' ”

    一.Mac OS X的升级或其他原因可能会导致MySQL启动或开机自动运行时 在MySQL操作面板上会提示“Warning:The /usr/local/mysql/data directory is ...

  3. POJ1251 Jungle Roads

    解题思路:看懂题意是关键,Kruskal算法,最小生成树模板. 上代码: #include<cstdio> #include<cstring> #include<algo ...

  4. ul li 水平居中

    li的float:left方法显然有一个问题,就是无法居中(水平),只能使用padding-left或margin-right的方法方法来固定其居中.但这样可能在宽屏与窄屏的显示不一致.使用这种方法主 ...

  5. Spring中类型自动装配--byType

    在Spring中,“类型自动装配”的意思是如果一个bean的数据类型与其它bean属性的数据类型相同,将自动兼容装配它. 例如,一个“persion” bean 公开以“ability”类数据类型作为 ...

  6. HTML <meta> http-equiv Attribute 说明

      1. 说明 Value Description content-type Specifies the character encoding for the document. Example: & ...

  7. matlab_移动文件和复制文件

    clear clc cd('C:\Users\xx\Desktop\learning'); % 设置当前目录 % 此时learning文件夹中有:文件夹x, 文件夹y, 文件a.png, 文件b.pn ...

  8. 上一步是硬件描述语言,下一步是FPGA

    上一步是硬件描述语言,下一步是FPGA. 学习了硬件描述语言(Verilog或者VHDL)之后,FPGA该如何继续. 世上没有捷径,每一步都得踏踏实实的走.学习FPGA也是这样,在有了硬件描述语言的基 ...

  9. 字符串转换为字典的函数eval(字符串)

    首先把多行的字符串,变成一个字符串,用'''和'''扩起来: 然后把这个字符串,赋值给b 这个时候,b根本调不出来,也用不起来: 用eval(b),来格式化字符串变成字典: 然后b就变成了一个字典:

  10. mybatis 控制器注解介绍(一)

    @RequestMapping("LoginController")public class LoginController { // 路径参数{name}填入用户名,{pass} ...