CF899F. Letters Removing】的更多相关文章

给一个字符串支持以下操作:区间删除某个特定字符.最后输出字符串.n,m<=200000. 这题我居然不会可以回家了.. 首先,单点删除,选个平衡树比如set. 然后,他给的下标是会随删除操作变化的,需要查“存在于字符串中的第K个是谁”来找左右端点,一个树状数组搞定. 树状数组找出题目给的x,y在初始串中的下标L,R,对每个字符开一个set存它的所有出现位置,把这个set里在L,R间的位置去掉,去掉的同时把树状数组里的对应位置-1,即可. #include<stdio.h> #includ…
题目链接:Letters Removing 题意: 给你一个长度为n的字符串,给出m次操作.每次操作给出一个l,r和一个字符c,要求删除字符串l到r之间所有的c. 题解: 看样例可以看出,这题最大的难点在于每次在字符串中删除了前面的字符会对后面的字符产生影响.如何确定当前l和r所指的字符?这里由于对字符的位置查询相当于单点操作区间查询,可以用树状数组维护字符串的前缀和,这样就可以确定l和r的位置了(二分+树状数组 : 复杂度(log(n)×log(n))).再把所有的字符放到set里面进行删除操…
Codeforces 899F - Letters Removing 思路:考虑一下怎么找到输入的l和r在原来串中的位置,我们想到用前缀和来找,一开始所有位置都为1,删掉后为0,那么前缀和为l的位置就是l的位置,前缀和为r的位置就是r的位置. 那么用树状数组来维护一下前缀和,再用二分查找来找到位置就可以了.然后找到的区间可能很大,然而我们要删的只有一种字符,把每种字符的位置分开来保存来操作,可以用set也可以用vector. 代码1(set版,187ms): #include<bits/stdc…
[题目]F. Letters Removing [题意]给定只含小写字母.大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串.n<=2*10^5. [算法]树状数组+平衡树(set) [题解]因为坐标是序列变动后的,动态坐标可以转化为找到第l个存在的数字到第r个存在的数字之间的范围. 将序列中存在记为1,删除记为0,转化为找前缀和恰好为l和r的位置,这是树状数组的经典操作,详见这篇题解介绍的方法(简单的排名功能) 找到l和r在原…
F. Letters Removing time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Petya has a string of length n consisting of small and large English letters and digits. He performs m operations. Each…
Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set 将每个字符对应的下标存入空间, 然后每次删除了一个字符之后就将字符串的相应位置改成一个不会产生干扰的字符(我这里使用的是'.'). 并且在线段树的相应位置标记一下.然后每次删除时候的左右区间就用2分区查找. 找到位置pos 使得 [1,pos]的值等于 pos - l, 这样就可以找到相应的区间了.…
Description Petya has a string of length n consisting of small and large English letters and digits. He performs m operations. Each operation is described with two integers l and r and a character c: Petya removes from the string all characters c on…
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <iostream> #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map>…
题意:给一个字符串和m个操作,每次给出l,r,c,把字符串中l-r这段区间的字符为c的字符删掉,求最后的字符串.(n,m<=2e5)线段树.注意这个区间修改和普通区间修改的区别. 他们都是用树状数组做的哎,可是我对树状数组一直是一脸懵逼 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; +; ; int n…
虽然每次给一个区间,但是可以看作在区间内进行数个点操作,同样数列下标是动态变化的,如果我们将每个字符出现看作1,被删除看作0,则通过统计前缀和就能轻松计算出两个端点的位置了!这正是经典的树状数组操作 需要注意的是,即使每次找到了两个端点,如果只是朴素总左到右遍历会TLE,所以可以给每个字符开一个set,每个set储存字符出现的位置. #include <iostream> #include <cstdio> #include <cstring> #include <…