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. 然后,他给的下标是会随删除操作变化 ...
随机推荐
- ExtJs中XTemplate使用(转)
转自http://www.studyofnet.com/news/408.html 本文导读:XTemplate是Ext.Template扩展的新类,它支持高级功能的模板类,如自动数组输出.条件判断. ...
- MySQL从删库到跑路_高级(三)——视图
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.视图简介 1.视图简介 视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式.视图包含 ...
- 20155334 2016-2017-2 《Java程序设计》第八周学习总结
20155334 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章:NIO与NIO2 NIO的定义: InputStream.OutputStream ...
- EF Code First学习笔记 初识Code First(转)
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- ADO.NET知识学习总结
1. 概述 使用的命名空间: System.Data.SqlClient 连接字符串 服务器/数据库实例+数据库名称+安全信息+用户名+密码 可参考http://www.connectio ...
- Impala shell详解
不多说,直接上干货! 查看帮助文档 impala-shell -h 刷新整个云数据 impala-shell -ruse impala;show tables; 去格式化,查询大数据量时可以提高性能 ...
- Spring 自动扫描 不支持jar包 <component-scan>
问题描述: 本机windows myeclipse10.7 运行非maven java项目,其中部分类使用spring3 注解进行注入,使用配置文件component-scan进行扫描,在本机debu ...
- Linux命令: 编辑模式移动光标
敲命令按以下顺序 ①vim filename ②e ③i ④ESC 移动光标 0 (零):将光标移动到行的起始处. $:将光标移动到行的末尾处. H:将光标移到当前窗口(而非全文)的第一行起始处. M ...
- c++第十一天
<c++ primer, 5E> 第68页到第81页,笔记: 1.读取未知量的string对象示例 #include<iostream> using std::cin; usi ...
- python模块-random随机数模块
导入随机数模块import random 1.random.random() 生成[0,1)之间的随机小数 2.random.randint(a,b) 生成[a,b]之间的随机整数 3.random. ...