Codeforces Round #316 (Div. 2) C. Replacement
题意:给定一个字符串,里面有各种小写字母和’ . ' ,无论是什么字母,都是一样的,假设遇到' . . ' ,就要合并成一个' .',有m个询问,每次都在字符串某个位置上将原来的字符改成题目给的字符,问每次须要多少次合并次数。才使字符串没有‘ .. '
思路:最原始的想法,就是对于每一次询问,都遍历整个字符串。这样时间复杂度o(n*m),就高达10^10方,非常明显会tle。
换下思路,事实上每次询问所改变的字符都会保留到下一次。也就是下一次的次数就会受到上一次的影响,那么我仅仅要就算出第一次的合并次数,以下的都能够推出来
题目链接:http://codeforces.com/problemset/problem/570/C
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
char a[300005],b[10];
int main(void)
{
scanf("%d%d",&n,&m);
scanf("%s",a+1);
scanf("%d%s",&cnt,b);
a[cnt]=b[0];//处理第一次
int ret,ans=0,flag;
for(int i=1; i<=n; i++)
{
ret=0;
flag=0;
while(a[i]=='.')//假设一个子序列全都是'.',假设有ret个'.',那么合并次数就是ret-1;
{
i++;
ret++;
flag=1;
}
if(flag) ans+=ret-1;
}
printf("%d\n",ans);
for(int i=1; i<m; i++)//处理剩余的m-1次,每一次的ans均由上一次推出
{ scanf("%d%s",&cnt,b);
char ch=a[cnt];
a[cnt]=b[0];
if(b[0]=='.'&&ch!='.')//假设这一次由字母变成'.',检查前后是否有'.',有一个的话合并次数就要+1
{
if(a[cnt-1]=='.') ans++;
if(a[cnt+1]=='.') ans++;
}
else if(b[0]!='.'&&ch=='.')//由字母变成'.'
{
if(a[cnt-1]=='.') ans--;
if(a[cnt+1]=='.') ans--;
}
printf("%d\n",ans);
}
return 0;
}
Codeforces Round #316 (Div. 2) C. Replacement的更多相关文章
- 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 Codeforces Round #316 (Div. 2) C. Replacement 线段树
C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...
- 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++. ...
- Codeforces Round #316 (Div. 2)
A. Elections time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- Codeforces Round #316 (Div. 2) C 思路/模拟
C. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces Round #316 (Div. 2) (ABC题)
A - Elections 题意: 每一场城市选举的结果,第一关键字是票数(降序),第二关键字是序号(升序),第一位获得胜利. 最后的选举结果,第一关键字是获胜城市数(降序),第二关键字是序号(升序) ...
- Codeforces Round #316 (Div. 2) B. Simple Game
思路:把n分成[1,n/2],[n/2+1,n],假设m在左区间.a=m+1,假设m在右区间,a=m-1.可是我居然忘了处理1,1这个特殊数据.被人hack了. 总结:下次一定要注意了,提交前一定要看 ...
随机推荐
- ios 自定义URL Scheme 设计
在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...
- tabs标签页的数据缓存
一进入tabs标签页默认就将所有标签页的数据请求到,并渲染到页面上, 这样如果数据量太大的话会渲染很久, 我的需求就是点击不同的标签时再请求数据,同时对点击过的标签页数据进行缓存,下次点击时不再重新请 ...
- 数组对象分类个数js
<script type="text/javascript"> $(function(){ var aaa = [ {"task1":"z ...
- C++关键字(保留字)
C++ 关键字 点击下表以进入具体释义 __abstract 2 __alignof Operator __asm __assume __based __box 2 __cdecl __declspe ...
- mysql踩坑
com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value '****** ...
- validate 常用的输入框校验
记录一下angular可以直接用的输入框校验器,外加一个国内手机号码的校验 <!DOCTYPE html> <html> <head> <meta chars ...
- 【pwnable】asm之write up
首先查看源代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <s ...
- POJ 3258 River Hopscotch (二分法)
Description Every year the cows hold an event featuring a peculiar version of hopscotch that involve ...
- 在mysql的操作界面中,如何清屏幕
1.快捷键:Ctrl+L2.通过执行SHELL命令: \! clear实际上 \! 用来执行操作系统的shell命令,不仅是clear,其他命令也可以.shell命令执行完成后,会返回mysql Us ...
- 前端传list,springmvc接收list的方法
handler: function() { var baseCustomerForm = me.getAddBaseCustomerForm().getForm(); var linkStore = ...