线段树模板题
【Analysis】
先建线段树,考虑如何合并
不难发现两段区间和并时,只有左区间的最右边是 ‘.’ && 右区间的左边是’.'时大区间 + 1 1 1
【Code】
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
namespace IO
{
inline long long read()
{
long long ret=0;bool flag=0;char c=getchar();
while ((c<'0')|(c>'9')) flag ^= !(c^'-'),c=getchar();
while ((c>='0')&(c<='9')) ret=(ret<<1)+(ret<<3)+(c^'0'),c=getchar();
return flag?-ret:ret;
}
char OutputAns[1<<20|1],*OutputCur = OutputAns;
inline void output()
{
OutputCur -= fwrite(OutputAns,1,OutputCur - OutputAns,stdout);
}
inline void print(long long ans)
{
char s[20]={0};
if (OutputCur - OutputAns + sprintf(s,"%lld",ans) >> 20) output();
OutputCur += sprintf(OutputCur,"%lld",ans);
}
inline void printc(char c)
{
if (OutputCur - OutputAns + 1 >> 20) output();
*(OutputCur++) = c;
}
}
using IO::read;
using IO::print;
using IO::output;
using IO::printc;
const int M = 3e5 + 11;
int n,m;
char Arr[M];
namespace Seg
{
int Tree[M<<2];
inline void PushUp(int k,int l,int r)
{
int mid = l + r >> 1;
Tree[k] = Tree[k<<1] + Tree[k<<1|1] + ((Arr[mid] == Arr[mid + 1] && Arr[mid] == '.')
? 1 : 0);
}
inline void Build(int k,int l,int r)
{
if (l == r)
{
Tree[k] = 0;
return ;
}
int mid = l + r >> 1;
Build(k<<1,l,mid);
Build(k<<1|1,mid + 1,r);
PushUp(k,l,r);
}
inline void Modifty(int k,int l,int r,int pos,char c)
{
if (l == r)
{
Arr[pos] = c;
Tree[k] = 0;
return ;
}
int mid = l + r >> 1;
if (pos <= mid) Modifty(k<<1,l,mid,pos,c);
else Modifty(k<<1|1,mid + 1,r,pos,c);
PushUp(k,l,r);
}
inline int Query(int k,int l,int r,int x,int y)
{
if (x <= l && y >= r) return Tree[k];
int mid = l + r >> 1;
int ret = 0;
if (x <= mid) ret = Query(k<<1,l,mid,x,y);
if (y > mid) ret += Query(k<<1|1,mid + 1,r,x,y);
return ret;
}
}
using Seg::Build;
using Seg::Query;
using Seg::Modifty;
inline void Input()
{
n = read(),m = read();
scanf("%s",Arr + 1);
Build(1,1,n);
}
inline void Sovle()
{
while (m--)
{
int pos = read();
char cc;
scanf("%c",&cc);
Modifty(1,1,n,pos,cc);
print(Query(1,1,n,1,n)),printc('\n');
}
output();
}
int main(void)
{
Input();
Sovle();
}