Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树
C. Replacement
Time Limit: 20 Sec
Memory Limit: 256 MB
题目连接
http://codeforces.com/contest/570/problem/C
Description
Daniel has a string s, consisting of lowercase English letters and period signs (characters '.'). Let's define the operation of replacementas the following sequence of steps: find a substring ".." (two consecutive periods) in string s, of all occurrences of the substring let's choose the first one, and replace this substring with string ".". In other words, during the replacement operation, the first two consecutive periods are replaced by one. If string s contains no two consecutive periods, then nothing happens.
Let's define f(s) as the minimum number of operations of replacement to perform, so that the string does not have any two consecutive periods left.
You need to process m queries, the i-th results in that the character at position xi (1 ≤ xi ≤ n) of string s is assigned value ci. After each operation you have to calculate and output the value of f(s).
Help Daniel to process all queries.
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 300 000) the length of the string and the number of queries.
The second line contains string s, consisting of n lowercase English letters and period signs.
The following m lines contain the descriptions of queries. The i-th line contains integer xi and ci (1 ≤ xi ≤ n, ci — a lowercas English letter or a period sign), describing the query of assigning symbol ci to position xi.
Output
Print m numbers, one per line, the i-th of these numbers must be equal to the value of f(s) after performing the i-th assignment.
Sample Input
10 3
.b..bz....
1 h
3 c
9 f
Sample Output
4
3
1
HINT
题意
给你一个字符串,然后每两个点可以变成一个点
然后有m次修改操作,每次可以修改一个位置的字符
然后问你修改之后,需要多少次操作,把所有的点,都变成连续的一个点
题解:
我比较蠢,我用的线段树,太蠢了
正解不超过30行,几个if就好了……
维护的是每一个pos的左边的字母和右边的字母位置
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std; #define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define MID(a,b) (a+((b-a)>>1))
const int N=; struct node
{
int lft,rht;
int lmx,rmx;
int len(){return rht-lft+;}
int mid(){return MID(lft,rht);}
void init(){lmx=rmx=len();}
void fun(int valu)
{
if(valu==-) lmx=rmx=;
else lmx=rmx=;
}
}; int n,m; struct Segtree
{
node tree[N*];
void up(int ind)
{
tree[ind].lmx=tree[LL(ind)].lmx;
tree[ind].rmx=tree[RR(ind)].rmx;
if(tree[LL(ind)].lmx==tree[LL(ind)].len())
tree[ind].lmx+=tree[RR(ind)].lmx;
if(tree[RR(ind)].rmx==tree[RR(ind)].len())
tree[ind].rmx+=tree[LL(ind)].rmx;
}
void build(int lft,int rht,int ind)
{
tree[ind].lft=lft,tree[ind].rht=rht;
tree[ind].init();
if(lft!=rht)
{
int mid=tree[ind].mid();
build(lft,mid,LL(ind));
build(mid+,rht,RR(ind));
}
}
void updata(int pos,int ind,int valu)
{
if(tree[ind].lft==tree[ind].rht) tree[ind].fun(valu);
else
{
int mid=tree[ind].mid();
if(pos<=mid) updata(pos,LL(ind),valu);
else updata(pos,RR(ind),valu);
up(ind);
}
}
void query(int pos,int ind,int& x,int& y)
{
if(tree[ind].lft==tree[ind].rht)
{
if(tree[ind].lmx==) x=y=tree[ind].lft;
else x=y=;
}
else
{
int mid=tree[ind].mid();
if(pos<=mid) query(pos,LL(ind),x,y);
else query(pos,RR(ind),x,y);
if(tree[LL(ind)].rht==y) y+=tree[RR(ind)].lmx;
if(tree[RR(ind)].lft==x) x-=tree[LL(ind)].rmx;
}
}
}seg;
char s[N];
int vis[N];
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%s",s+);
seg.build(,n+,);
int len=strlen(s+);
int ans=;
int tmp=;
seg.updata(n+,,-);
for(int i=;i<=len;i++)
{
if(s[i]=='.')
tmp++;
else
{
if(tmp!=)
ans+=(tmp-);
tmp=;
seg.updata(i,,-);
vis[i]=;
}
}
if(tmp!=)
ans+=(tmp-);
while(m--)
{
char cmd[];
int pos,st,ed;
scanf("%d",&pos);
scanf("%s",&cmd);
if(cmd[]!='.')
{
if(vis[pos]==)
printf("%d\n",ans);
else
{
vis[pos]=; seg.query(pos,,st,ed);
ans-=(ed-st);
seg.updata(pos,,-);
seg.query(pos+,,st,ed);
ans+=(ed-st);
if(pos-!=)
{
seg.query(pos-,,st,ed);
ans+=(ed-st);
}
printf("%d\n",ans);
} }
else
{
if(vis[pos]==)
printf("%d\n",ans);
else
{
vis[pos]=;
seg.query(pos+,,st,ed);
ans-=(ed-st);
if(pos-!=)
{
seg.query(pos-,,st,ed);
ans-=(ed-st);
}
seg.updata(pos,,);
seg.query(pos,,st,ed);
ans+=(ed-st);
printf("%d\n",ans); }
}
}
}
return ;
}
Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树的更多相关文章
- Codeforces Round #603 (Div. 2) E. Editor 线段树
E. Editor The development of a text editor is a hard problem. You need to implement an extra module ...
- Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- Codeforces Round #765 Div.1 F. Souvenirs 线段树
题目链接:http://codeforces.com/contest/765/problem/F 题意概述: 给出一个序列,若干组询问,问给出下标区间中两数作差的最小绝对值. 分析: 这个题揭示着数据 ...
- 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- Codeforces Codeforces Round #316 (Div. 2) C. Replacement set
C. Replacement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/proble ...
- Codeforces Round #316 (Div. 2) C. Replacement
题意:给定一个字符串,里面有各种小写字母和' . ' ,无论是什么字母,都是一样的,假设遇到' . . ' ,就要合并成一个' .',有m个询问,每次都在字符串某个位置上将原来的字符改成题目给的字符, ...
- Codeforces Round #316 (Div. 2) C. Replacement(线段树)
C. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces Round #316 (Div. 2C) 570C Replacement
题目:Click here 题意:看一下题目下面的Note就会明白的. 分析:一开始想的麻烦了,用了树状数组(第一次用)优化,可惜没用. 直接判断: #include <bits/stdc++. ...
- Codeforces Round #316 (Div. 2) C Replacement 扫描法
先扫描一遍得到每个位置向后连续的'.'的长度,包含自身,然后在扫一遍求出初始的合并次数. 对于询问,只要对应位置判断一下是不是'.',以及周围的情况. #include<bits/stdc++. ...
随机推荐
- 【转】This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in
原文网址:http://1982106a.blog.163.com/blog/static/8436495620149239361692/ 预览layout.xml文件时提示: This versio ...
- 深入浅出 iOS 之生命周期
转:http://blog.csdn.net/kesalin/article/details/6691766 iOS应用程序的生命周期相比 Android 应用程序的生命周期来说,没那么简明易懂,但是 ...
- 使用Visual Studio 2013对windows应用商店应用进行编码的UI测试
之前进行了一次实验,实验内容是对windows应用商店应用进行编码的UI测试,下面对实验步骤进行详细说明: 1.为 Windows 应用商店应用创建新编码的 UI 测试项目,选择Visual C##→ ...
- lighttpd mod_status模块
用过nginx的status可以查看服务器的状态,之后就想lighttpd有没有这样的模块呢 之后看下配置文件,真的有,然后就试下 第一步, "mod_auth" 把这个前面的#号 ...
- stl+模拟 CCF2016 4 路径解析
// stl+模拟 CCF2016 4 路径解析 // 一开始题意理解错了.... #include <iostream> #include <string> #include ...
- nodejs 5.2.0文档自翻译——Path模块
模块方法概览 Path path.basename(p[, ext]) path.delimiter path.dirname(p) path.extname(p) path.format(pathO ...
- 基于Maven管理的Mapreduce程序下载依赖包到LIB目录
1.Mapreduce程序需要打包作为作业提交到Hadoop集群环境运行,但是程序中有相关的依赖包,如果没有一起打包,会出现xxxxClass Not Found . 2.在pom.xml文件< ...
- 让sublime text 2更好地支持Python
SublimeCodeIntel: ~/.codeintel/config里加了python和pythonExtraPaths的路径(Mac): {"Python" : {&quo ...
- HDU5744:Keep On Movin(字符串)
题意: 给出t组测试数据,每组给出正整数n表示有n种字符,接下来给出n个数表示该种字符的数目,操作一下,使得可以构造的最小回文串字符数目最大且输出. 分析: 如果每个字符出现次数都是偶数, 那么答案显 ...
- UVa12657 - Boxes in a Line(数组模拟链表)
题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...