HDU—4046 Panda (线段树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4046
题意:给出一个字符串,统计这个字符串任意区间中“wbw”出现的次数。
规定两种操作,一是查询任意区间“wbw”出现次数;二是修改某一位置的字符。
分析:比较明显的线段树,单点更新,区间查询。
线段树记录的信息是区间中出现“wbw”字符的个数,线段树的叶子节点[i,i]记录字符串str中
str[i-2][i-1][i]是否是“wbw“。
对于字符的修改,这里就有要注意了。修改的位置pos, 可能对线段树中sum[pos-1] sum[pos] 或sum[pos+1]
造成影响。这里要分情况。
代码
#include<cstdio>#include<cstring>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int maxn=50010;int n,m,sum[maxn<<2];char str[maxn];int num[maxn];void pushup(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){if(l==r){sum[rt]=num[l];return;}int m=(l+r)>>1;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)>>1;int ans=0;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)>>1;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=1;t<=T;t++){printf("Case %d:\n",t);scanf("%d%d%s",&n,&m,str+1);memset(num,0,sizeof(num));for(int i=3;i<=n;i++)if(str[i-2]=='w'&&str[i-1]=='b'&&str[i]=='w') num[i]=1;build(1,n,1);int k,a,b;char ch[5];while (m--){scanf("%d",&k);if(k==0){scanf("%d%d",&a,&b);a++;b++; //字符串从1开始,所以下标都加1if(b-a<2) printf("0\n");else printf("%d\n",query(a+2,b,1,n,1));}else{scanf("%d%s",&a,ch);a++;if(ch[0]==str[a]) continue;//修改的和以前一样,这不用任何操作if(a>=3){if(str[a-2]=='w'&&str[a-1]=='b'&&str[a]=='w')update(a,0,1,n,1);if(str[a-2]=='w'&&str[a-1]=='b'&&str[a]=='b')update(a,1,1,n,1);}if(a>=2&&a+1<=n){if(str[a-1]=='w'&&str[a]=='b'&&str[a+1]=='w')update(a+1,0,1,n,1);if(str[a-1]=='w'&&str[a]=='w'&&str[a+1]=='w')update(a+1,1,1,n,1);}if(a+2<=n){if(str[a]=='w'&&str[a+1]=='b'&&str[a+2]=='w')update(a+2,0,1,n,1);if(str[a]=='b'&&str[a+1]=='b'&&str[a+2]=='w')update(a+2,1,1,n,1);}str[a]=ch[0];}}}return 0;}
HDU—4046 Panda (线段树)的更多相关文章
- hdu 4046 Panda [线段树]
Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HdU 4046 Panda 段树
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4046 意甲冠军:到了bw组成的长度为n的字符串(n<=50000).有m次操作(m<=1000 ...
- HDU 4046 Panda(树状数组)
Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
随机推荐
- C++——指针与引用
1.指针本身为对象,引用只是对象的别名.故有指针的引用,没有引用的引用,没有引用的指针.指针必须指向一个实际的对象.引用也必须是实际对象的别名. 2.允许指针赋值和拷贝,指针可指向不同的对象 3.指针 ...
- opencv 打开摄像头(c++)
1,打开视频文件 2,打开IP摄像头 读取大华摄像头 大华的网络摄像头编号:DH-IPC-HFW1225M-I1-0600B,用的是RTSP协议. "rtsp://admin:dahua@1 ...
- 解决 IE6 position:fixed 固定定位问题
#e_float{ _position:absolute; _bottom:auto; _right:50%; _margin-right:-536px; _top:expression(eval(d ...
- HTML5 placeholder实际应用经验分享及拓展
QQ邮箱登陆(http://mail.qq.com) 如下截图啦: 我在上面一个demo类似原理上做了下修改,制作了一个这样子交互效果的demo,希望对有兴趣的同行能帮上点忙,您可以狠狠地点击这里:透 ...
- response和ServletContext和乱码问题
服务器端以/开始就代表当前项目名客户端必须以 /项目名/资源 才能定位到资源 软件与软件之间,以字符为标准传递,传递字节,接收端自己按原来的编码集编码之后再按照自己的编码集解码编码(如果没有对应字符, ...
- python中 try、except、finally执行顺序
我们虽然经常用到try...except 作为异常补货,但是其实很少去研究try源码和机制,也许点进去看过,也是看不出个所以然来 class Exception(BaseException): &qu ...
- SQLite 小调研
一. 概况: SQLite 是 D. Richard Hipp 于 2000 年采用 C 语言编写的一个轻量级.跨平台的关系型数据库,支持大部分 SQL92 标准(比如视图.事务.触发器.blob 数 ...
- linux6查看时间同步服务器的匹配源
当服务器时间与设定好的同步时间源的时间有差异的时候,一般都需要先查看本机的时间同步服务功能是否在正常的运转,以及同步的时间源是哪里,在这里为大家提供一个检查时间用的命令. linux/centos 6 ...
- Effective C++之条款2:尽量以const enum inline替换 #define
本文的标题也可以改成“用编译器替换预处理器”: const double AspectRatio = 1.653; //最好使用上述代码替换下述代码: #define ASPECT_RATIO 1.6 ...
- map方法的简单使用
假设有一个数组a,将a中的数值以2倍的形式放到b数组中 <!DOCTYPE html> <html lang="en"> <head> < ...