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++. ...
随机推荐
- Period(KMP,循环节问题)
题意: 求给你个串,前i位子串由某个字符串重复k次得到,求所有的i和k 分析: i-next[i]恰好是一个循环节 #include <map> #include <set> ...
- 【跟我一起学python吧】python chr()、unichr()和ord()
chr().unichr()和ord() chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符.unichr()跟它一样,只不过返回的是Unicode字符 ...
- gcc编译器与基本类型3
C语言发展史 1969年贝尔实验室 肯尼斯·蓝·汤普逊,丹尼斯·李奇开发了B语言 ->Unix,New B语言,改名C语言83年提出C语言标准 1989年十二月正式通过C语言标准,C89标准 C ...
- Redis3.0 Install
Installation Download, extract and compile Redis with: $ wget http://download.redis.io/releases/redi ...
- 优雅地对泛型List 进行深拷贝
public class People { public string Name; public int Age; public People(string name, int age) { this ...
- Intellij IDEA使用Maven构建Scala项目
1.安装IDEA的Scala插件 使用自带的在线安装方式较为简单.File--Setting--Plugins--Browse reposities 2.创建项目 File - ...
- 优秀java开源项目与解决方案推荐与概论
http://www.oschina.net/project/lang/19/java http://www.open-open.com/ http://java-source.net/ https: ...
- HDU 5821 Ball (贪心)
Ball 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5821 Description ZZX has a sequence of boxes nu ...
- iOS学习之自动布局
Autolayout: 最重要的两个概念: 约束:对控件位置和大小的限定条件 参照:对控件设置的约束是相对于哪一个视图而言的 自动布局的核心计算公式: obj1.property1 =(obj2.pr ...
- 什么是USBMini接口
USB的接口有四种.一种是大头,有A型和B型两种,其中A型最常见,就是我们用的最多的标准的USB接头:一种是小头的,也就是USB Mini,也有A型和B型两种,其中B型应用最多,主要应用于手机.MP4 ...