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[ ...
随机推荐
- “今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛 )--E. DoveCCL and Resistance
题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 链接:https://www.nowcoder.com/acm/contest/104/D来源:牛客网 题目描述 ...
- java做题笔记
java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...
- Java-Class-C:com.ylbtech.api.platfrom.util.RedisUtils.class
ylbtech-Java-Class-C:com.ylbtech.api.platfrom.util.RedisUtils.class 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶 ...
- Dubbo入门到精通学习笔记(八):ActiveMQ的安装与使用(单节点)、Redis的安装与使用(单节点)、FastDFS分布式文件系统的安装与使用(单节点)
文章目录 ActiveMQ的安装与使用(单节点) 安装(单节点) 使用 目录结构 edu-common-parent edu-demo-mqproducer edu-demo-mqconsumer 测 ...
- PAT_A1095#Cars on Campus
Source: PAT A1095 Cars on Campus (30 分) Description: Zhejiang University has 8 campuses and a lot of ...
- Webpack4篇
[Webpack4篇] webpack4 打包优化策略 当前依赖包的版本 1 优化loader配置 1.1 缩小文件匹配范围(include/exclude) 通过排除node_modules下的文件 ...
- python全栈开放实践第三版第一章的练习题完成情况
练习题: 1.简述编译型与解释型语言的区别,且分别列出你知道哪些语言属于编译型,哪些数以解释型.1 编译型:只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可 ...
- arguments的使用
当我们不确定有多少参数传递的时候,可以使用 arguments 来获取,在 JavaScript 中, arguments 实际上它是当前函数的一个内置对象. 所有的函数都内置了一个 argument ...
- vscode centos
https://www.cnblogs.com/My-Jinse/articles/8400137.html rpm -ql 包名 缺少libXss.so.1()(64bit) yum install ...
- Java微服务(Spring-boot+MyBatis+Maven)入门教程
1,项目创建 新建maven项目,如下图: 选择路径,下一步 输入1和2的内容,点完成 项目创建完毕,结构如下图所示: 填写pom.xml里内容,为了用于打包,3必须选择jar,4和5按图上填写 ...