899F - Letters Removing
Codeforces 899F - Letters Removing
思路:考虑一下怎么找到输入的l和r在原来串中的位置,我们想到用前缀和来找,一开始所有位置都为1,删掉后为0,那么前缀和为l的位置就是l的位置,前缀和为r的位置就是r的位置。
那么用树状数组来维护一下前缀和,再用二分查找来找到位置就可以了。然后找到的区间可能很大,然而我们要删的只有一种字符,把每种字符的位置分开来保存来操作,可以用set也可以用vector。
代码1(set版,187ms):
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a)) const int N=2e5+;
int bit[N];
bool vis[N];
int n;
set<int>pos[];
void add(int x,int a)
{
while(x<=n)
{
bit[x]+=a;
x+=x&(-x);
}
}
int sum(int x)
{
int ans=;
while(x)
{
ans+=bit[x];
x-=x&(-x);
}
return ans;
}
int search(int x)
{
int l=,r=n,m=(l+r)>>;
while(l<r)
{
if(sum(m)>=x)r=m;
else l=m+;
m=(l+r)>>;
}
return m;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int m,l,r;
string s;
char c;
cin>>n>>m>>s;
for(int i=;i<=n;i++)add(i,),pos[s[i-]].insert(i);
while(m--)
{
cin>>l>>r>>c;
l=search(l);
r=search(r);
set<int>::iterator it=pos[c].lower_bound(l);
while(it!=pos[c].end())
{
if(*it>r)break;
add(*it,-);
pos[c].erase(it++);
}
}
for(int i=;i<;i++)
{
for(auto x:pos[i])vis[x]=true;
}
for(int i=;i<=n;i++)if(vis[i])putchar(s[i-]);
puts("");
return ;
}
代码2(vector版,155ms):
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a)) const int N=2e5+;
int bit[N];
bool vis[N];
int n;
vector<int>pos[];
void add(int x,int a)
{
while(x<=n)
{
bit[x]+=a;
x+=x&(-x);
}
}
int sum(int x)
{
int ans=;
while(x)
{
ans+=bit[x];
x-=x&(-x);
}
return ans;
}
int search(int x)
{
int l=,r=n,m=(l+r)>>;
while(l<r)
{
if(sum(m)>=x)r=m;
else l=m+;
m=(l+r)>>;
}
return m;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int m,l,r;
string s;
char c;
cin>>n>>m>>s;
for(int i=;i<=n;i++)add(i,),pos[s[i-]].pb(i);
while(m--)
{
cin>>l>>r>>c;
l=search(l);
r=search(r);
int it=lower_bound(pos[c].begin(),pos[c].end(),l)-pos[c].begin();
for(int i=it;i<pos[c].size();i++)
{
if(pos[c][i]>r)break;
if(!vis[pos[c][i]])add(pos[c][i],-),vis[pos[c][i]]=true;
}
}
for(int i=;i<=n;i++)if(!vis[i])putchar(s[i-]);
puts("");
return ;
}
899F - Letters Removing的更多相关文章
- codeforces 899F Letters Removing set+树状数组
F. Letters Removing time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 899F Letters Removing 线段树/树状数组
虽然每次给一个区间,但是可以看作在区间内进行数个点操作,同样数列下标是动态变化的,如果我们将每个字符出现看作1,被删除看作0,则通过统计前缀和就能轻松计算出两个端点的位置了!这正是经典的树状数组操作 ...
- Codeforces 899 F. Letters Removing (二分、树状数组)
题目链接:Letters Removing 题意: 给你一个长度为n的字符串,给出m次操作.每次操作给出一个l,r和一个字符c,要求删除字符串l到r之间所有的c. 题解: 看样例可以看出,这题最大的难 ...
- 【CodeForces】899 F. Letters Removing
[题目]F. Letters Removing [题意]给定只含小写字母.大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串.n&l ...
- Codeforces 889F Letters Removing(二分 + 线段树 || 树状数组)
Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set ...
- Letters Removing CodeForces - 899F (线段树维护序列)
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...
- Codeforces Round #452 F. Letters Removing
Description Petya has a string of length n consisting of small and large English letters and digits. ...
- codeforce452DIV2——F. Letters Removing
题意:给一个字符串和m个操作,每次给出l,r,c,把字符串中l-r这段区间的字符为c的字符删掉,求最后的字符串.(n,m<=2e5)线段树.注意这个区间修改和普通区间修改的区别. 他们都是用树状 ...
- CF899F. Letters Removing
给一个字符串支持以下操作:区间删除某个特定字符.最后输出字符串.n,m<=200000. 这题我居然不会可以回家了.. 首先,单点删除,选个平衡树比如set. 然后,他给的下标是会随删除操作变化 ...
随机推荐
- Qt实现 QQ好友列表QToolBox
简述 QToolBox类提供了一个列(选项卡式的)部件条目. QToolBox可以在一个tab列上显示另外一个,并且当前的item显示在当前的tab下面.每个tab都在tab列中有一个索引位置.tab ...
- bootstrap 带有确定取消按钮的modal
</div><div class="modal fade" id="confirmModal" tabindex="-1" ...
- String源码详解
一.基本概念. 1.继承实现关系.因为被final修饰,因此是不可继承的String类,避免被他人继承后修改.实现了三个接口.可序列.可比较,有序.几个String兄弟类 2.本质就是字符数组,同时, ...
- LibSVM源码剖析(java版)
之前学习了SVM的原理(见http://www.cnblogs.com/bentuwuying/p/6444249.html),以及SMO算法的理论基础(见http://www.cnblogs.com ...
- UVA 103
/* 这题说的的是 N 维的坐标, 每个盒子的N维坐标 可以进行 随意方式的调换 然后求出 A全部的坐标小于B的 则 A 可以嵌套在B中 然后 计算出最多的 盒子嵌套个数 简单的状态转移 我为何如此的 ...
- git参考文档
==================================================================================================== ...
- Zookeeper学习记录(二):使用以及配置
zookeeper已经介绍了它的原理设计以及实现方式,我们接下来介绍zookeeper的使用方法以及简单配置. 下载 获取Zookeeper的发布包,从Apache下载映像中下载一个最新稳定版本. 单 ...
- 左连接LEFT JOIN 连接自己时的查询结果测试
#左连接LEFT JOIN 连接自己时的查询结果测试 #左连接LEFT JOIN 连接自己时的查询结果(都会出现两个重复字段),两个表都有as后只能查询相等条件merchant_shop_id非nul ...
- EasyUI+bootsrtap混合前端框架
EasyUI+bootsrtap混合前端框架 http://www.jeasyui.com/download/index.php用户没有登录前浏览的页面用bootsrtap框架用户登录进去后的商家管理 ...
- jar与war 包解压
JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有区别的,JAR包中有一个META-INF\MANIFEST.MF文件,当你找成JAR包时,它会自动生成.JAR包是 ...