难得写一道线段树,先上代码.....
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAXN 50002 struct node{ int l, mid, r; char ch; int v; char ll[2], rr[2]; int num; } a[MAXN*4]; int n, m; void pushup(int e) { a[e].v=a[e<<1].v+a[e<<1|1].v; a[e].num=a[e<<1].num+a[e<<1|1].num; a[e].ll[0]=a[e<<1].ll[0], a[e].rr[1]=a[e<<1|1].rr[1]; if(a[e<<1].num>1) { a[e].ll[1]=a[e<<1].ll[1];} else a[e].ll[1]=a[e<<1|1].ll[0]; if(a[e<<1|1].num>1) a[e].rr[0]=a[e<<1|1].rr[0]; else a[e].rr[0]=a[e<<1].rr[1]; if(a[e<<1].num>1 && a[e<<1].rr[0]=='w' && a[e<<1].rr[1]=='b' && a[e<<1|1].ll[0]=='w') a[e].v++; else if(a[e<<1|1].num>1 && a[e<<1].rr[1]=='w' && a[e<<1|1].ll[0]=='b' && a[e<<1|1].ll[1]=='w') a[e].v++; } void build(int l, int r, int e) ////CALL: build(1, n, 1) { a[e].l=l, a[e].r=r; if(l==r) { scanf("%c", &a[e].ch); a[e].num=1; a[e].ll[0]=a[e].ch; a[e].rr[1]=a[e].ch; } else { a[e].mid=(l+r)>>1; build(l, a[e].mid, e<<1); build(a[e].mid+1, r, e<<1|1); pushup(e); } } void update(int k, char x, int l, int r, int e) { if(l==r) { a[e].ch=x; a[e].ll[0]=a[e].ch; a[e].rr[1]=a[e].ch; } else { if(k<=a[e].mid) update(k, x, l, a[e].mid, e<<1); else update(k, x, a[e].mid+1, r, e<<1|1); pushup(e); } } int query(int L, int R, int l, int r, int e) { int ret=0; if(L<=l && r<=R) //当前区间完全包含所查区间 { ret+=a[e].v; } else // l L R r { if(a[e<<1].r-L>0 && R-a[e<<1|1].l+1>0 && a[e<<1].num>1 && a[e<<1].rr[0]=='w' && a[e<<1].rr[1]=='b'&& a[e<<1|1].ll[0]=='w') ret++; if(R-a[e<<1|1].l>0 && a[e<<1].r-L+1>0 && a[e<<1|1].num>1 && a[e<<1].rr[1]=='w' && a[e<<1|1].ll[0]=='b' && a[e<<1|1].ll[1]=='w') ret++; if(L<=a[e].mid) ret+=query(L, R, l, a[e].mid, e<<1); if(a[e].mid<R) ret+=query(L, R, a[e].mid+1, r, e<<1|1); } return ret; } int main() { int t; scanf("%d", &t); for(int i=0; i<t; i++) { memset(a, 0, sizeof(a)); printf("Case %d:\n", i+1); char o; scanf("%d%d%c", &n, &m, &o); build(1, n, 1); for(int j=0; j<m; j++) { int flag; scanf("%d", &flag); if(flag==0) { int a, b; scanf("%d%d", &a, &b); printf("%d\n", query(a+1, b+1, 1, n, 1)); } else if(flag==1) { int a; char ch[2]; scanf("%d%s", &a, &ch); update(a+1, ch[0], 1, n, 1); } } } }