还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来

若某位是1,则前两个为wb,这位就是w

 #include<cstdio>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=;
int n,m,sum[maxn<<];
char str[maxn];
int num[maxn];
void pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=num[l];
return;
}
int m=(l+r)>>;
build(lson);
build(rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
int m=(l+r)>>;
int ans=;
if(L<=m) ans+=query(L,R,lson);
if(R>m) ans+=query(L,R,rson);
return ans;
}
void update(int p,int val,int l,int r,int rt)
{
if(l==r)
{
sum[rt]=val;
return;
}
int m=(l+r)>>;
if(p<=m) update(p,val,lson);
else update(p,val,rson);
pushup(rt);
}
int main()
{
int t,T;
scanf("%d",&T);
for(int t=;t<=T;t++)
{
printf("Case %d:\n",t);
scanf("%d%d%s",&n,&m,str+);
memset(num,,sizeof(num));
for(int i=;i<=n;i++)
if(str[i-]=='w'&&str[i-]=='b'&&str[i]=='w') num[i]=;
build(,n,);
int k,a,b;
char ch[];
while (m--)
{
scanf("%d",&k);
if(k==)
{
scanf("%d%d",&a,&b);
a++;b++; //字符串从1开始,所以下标都加1
if(b-a<) printf("0\n");
else printf("%d\n",query(a+,b,,n,));
}
else
{
scanf("%d%s",&a,ch);
a++;
if(ch[]==str[a]) continue;//修改的和以前一样,这不用任何操作
if(a>=)
{
if(str[a-]=='w'&&str[a-]=='b'&&str[a]=='w')
update(a,,,n,);
if(str[a-]=='w'&&str[a-]=='b'&&str[a]=='b')
update(a,,,n,);
}
if(a>=&&a+<=n)
{
if(str[a-]=='w'&&str[a]=='b'&&str[a+]=='w')
update(a+,,,n,);
if(str[a-]=='w'&&str[a]=='w'&&str[a+]=='w')
update(a+,,,n,);
}
if(a+<=n)
{
if(str[a]=='w'&&str[a+]=='b'&&str[a+]=='w')
update(a+,,,n,);
if(str[a]=='b'&&str[a+]=='b'&&str[a+]=='w')
update(a+,,,n,);
}
str[a]=ch[];
}
}
}
return ;
}
 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
#define ll long long
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
using namespace std;
const int MAXN=;
int sum[MAXN<<],lsum[MAXN<<],rsum[MAXN<<],lc[MAXN<<],rc[MAXN<<];
int n,m,tt;
char s[MAXN];
void pushup(int l,int r,int rt)
{
//printf("%d %d %d %d\n",l,r,rt,mid);
/*if(mid==3)
{
printf("%s\n",s+1);
printf("%c %c %c\n",s[mid-1],s[mid],s[mid+1]);
}*/
sum[rt]=sum[rt<<]+sum[rt<<|];
if(/*(s[mid]=='b'&&s[mid-1]=='w'&&s[mid+1]=='w')||*/(s[mid]=='w'&&s[mid+]=='b'&&s[mid+]=='w')&&mid+<=n)
{
sum[rt]+=;
}
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=;
return;
}
build(lson);
build(rson);
pushup(l,r,rt);
}
void update(int pos,int val,int l,int r,int rt)
{
if(l==r)
{
return;
}
update(pos,val,lson);
update(pos,val,rson);
pushup(l,r,rt);
}
int query(int L,int R,int l,int r,int rt)
{ //printf("%d %d %d %d %d\n",L,R,l,r,rt);
if(L<=l&&r<=R)
{
return sum[rt];
}
if(R<=mid) return query(L,R,lson);
if(L>mid) return query(L,R,rson); int ta,tb;
ta=query(L,R,lson);
tb=query(L,R,rson);
int ans;
ans=max(ta,tb);
if(/*(s[mid]=='b'&&s[mid-1]=='w'&&s[mid+1]=='w')||*/(s[mid]=='w'&&s[mid+]=='b'&&s[mid+]=='w')&&mid+<=n) //同上
{
ans+=;
}
return ans;
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&tt);
int ca=;
while(tt--)
{
printf("Case %d:\n",ca++);
scanf("%d%d",&n,&m);
scanf("%s",s+);
s[]='k';
build(root);
while(m--)
{
int op;
scanf("%d",&op);
if(op==)
{
int l,r;
scanf("%d%d",&l,&r);
//printf("%d %d\n",l,r);
l++,r++;
int w=query(l,r,root);
printf("%d\n",w);
}
else
{
int x,val;
char c[];
scanf("%d%s",&x,c);
x++;
if(c[]!=s[x]) s[x]=c[],update(x,val,root); }
}
}
}

TLE代码

hdu 4046 2011北京赛区网络赛G 线段树 ***的更多相关文章

  1. hdu 4027 2011上海赛区网络赛G 线段树 成段平方根 ***

    不能直接使用成段增减的那种,因为一段和的平方根不等于平方根的和,直接记录是否为1,是1就不需要更新了 #include<cstdio> #include<iostream> # ...

  2. hdu 4044 2011北京赛区网络赛E 树形dp ****

    专题训练 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm ...

  3. hdu 4050 2011北京赛区网络赛K 概率dp ***

    题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...

  4. hdu 4049 2011北京赛区网络赛J 状压dp ***

    cl少用在for循环里 #include<cstdio> #include<iostream> #include<algorithm> #include<cs ...

  5. hdu 4045 2011北京赛区网络赛F 组合数+斯特林数 ***

    插板法基础知识 斯特林数见百科 #include<iostream> #include<cmath> #include<cstdio> #include<cs ...

  6. hdu 4043 2011北京赛区网络赛D 概率+大数 **

    推出公式为:P = A(2n,n)/(2^(2n)*n!) 但是不会大数,学完java再补

  7. hdu 4041 2011北京赛区网络赛B 搜索 ***

    直接在字符串上搜索,注意逗号的处理 #include<cstdio> #include<iostream> #include<algorithm> #include ...

  8. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  9. hdu 4035 2011成都赛区网络赛E 概率dp ****

    太吊了,反正我不会 /* HDU 4035 dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点 ...

随机推荐

  1. 【Storage】Ubuntu LVM 安装配置

    参考资料: https://www.centos.bz/2012/02/installation-and-usage-of-lvm/ http://blog.chinaunix.net/uid-206 ...

  2. POJ 1426

    http://poj.org/problem?id=1426 一道广搜的题目. 题意就是给你一个n,要你求出n的倍数中,只存在0和1的那个数字 所谓的只存在0和1,那么就是某个数的十倍或者十倍+1,而 ...

  3. ubuntu14.04和win7共享文件夹

    环境:vmware12 问题:安装了vmware-tools,但是在/mnt/hgfs下面看不到共享的文件夹. 按照网上的一些经验和教程使用如下命令: mount -t vmhgfs .host:/ ...

  4. linux expect

    1.首先确定是否安装expect /home/root> which expect /usr/bin/expect 如果没有安装,先安装一下 安装方法: 请参考 http://www.cnblo ...

  5. UTF8编码转换(C#)

    例如: UTF8---ISO-8859-1 string string = "这是中文";Encoding utf8 = Encoding.UTF8; Encoding ISO = ...

  6. Django环境搭建

    1.安装好Python 2.7.10 2.下载解压Django Django-1.9.2.tar.gz cmd cd到解压缩目录(***) python setup.py install 3.检测是否 ...

  7. MST:Agri-Net(POJ 1258)

     Agri-Net 题目大意:农夫有一片农场,现在他要把这些田地用管子连起来,田地之间有一定距离,铺设每一段管子的长度与这些田地与田地距离是一样的,问你最小的铺设方案. 这一题很裸,Kruskal算法 ...

  8. IIS 4.0配置

    neHandler”   今天安装了windows7 开发web项目需要安装IIS,当安装完以后,web程序已经映射到了本地IIS上,运行出现如下错误提示 处理程序“PageHandlerFactor ...

  9. 【编程题目】查找最小的 k 个元素

    5.查找最小的 k 个元素(数组)题目:输入 n 个整数,输出其中最小的 k 个.例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 算法里面学 ...

  10. 【网络】ssl与ssh

    ssh(安全外壳协议):百度百科 ssl(安全套接字):http://kb.cnblogs.com/page/162080/ https应用了ssl协议 ssh与ssl的区别:http://blog. ...