博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CodeForces】899 F. Letters Removing
阅读量:5978 次
发布时间:2019-06-20

本文共 1115 字,大约阅读时间需要 3 分钟。

【题目】

【题意】给定只含小写字母、大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串。n<=2*10^5。

【算法】树状数组+平衡树(set)

【题解】因为坐标是序列变动后的,动态坐标可以转化为找到第l个存在的数字到第r个存在的数字之间的范围。

将序列中存在记为1,删除记为0,转化为找前缀和恰好为l和r的位置,这是树状数组的经典操作,详见介绍的方法(简单的排名功能)

找到l和r在原数组的位置后,接下来需要删除。因为字符个数不多,对每个字符开一个set记录位置,然后lower_bound后逐个删除即可。

复杂度O(n log n)。

#include
#include
#include
#include
#include
using namespace std;const int maxn=200010,M=62;int n,m,a[maxn],c[maxn];char S[maxn],SS[10];set
s[63];set
::iterator it,itt;int read(){ char c;int s=0,t=1; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s*t;}#define lowbit(x) (x&-x)void modify(int x){ for(int i=x;i<=n;i+=lowbit(i))c[i]--;}int ask(int x){ int as=0;for(int i=x;i>=1;i-=lowbit(i))as+=c[i];return as;}int find(int x){ int num=0,p=0; for(int i=20;i>=0;i--)if(p+(1<
<=n&&num+c[p+(1<
<
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8059095.html

你可能感兴趣的文章
windows 杀服务
查看>>
去掉a标签的感应虚线
查看>>
Mac 设置java_home
查看>>
Spring的JdbcTemplate类中的RowCallbackHandler类
查看>>
增加和删除用户组
查看>>
PHP连接MYSQL实现简单的无限极分类
查看>>
linux开机到登陆的启动过程
查看>>
Redhat配置网卡阵列
查看>>
改写HPUX的SHELL
查看>>
我的友情链接
查看>>
项目成本管理重点
查看>>
iptables\layer7\编译内核——安装配置指南
查看>>
Android ADT下载安装
查看>>
抛却内心那一份浮躁,静下来做一些有意义的事情!
查看>>
RAID6缺两块盘数据恢复成功--戴尔(DELL ) T710服务器故障恢复
查看>>
十七周一次课
查看>>
NAS在PAT下的AAA
查看>>
《神探tcpdump第六招》-linux命令五分钟系列之四十
查看>>
netstat、ss对比使用
查看>>
我的友情链接
查看>>