hdu 4046 Panda
来源:互联网 发布:ubuntu怎么安装iso软件 编辑:程序博客网 时间:2024/04/30 07:52
题意:长度为n的字符串,只有'w'和'b'两种字符,有m个操作。要么查询某个区间内有多少个连续的"wbw",要么修改某个位置的字符,对每次查询输出结果。
思路:线段树(单点修改)。开始没注意看题,写成区间修改了,所以代码也是从那个模式改过来的。然后只要清楚节点保存的内容就好做了,每个节点表示一个区间,保存区间内"wbw"的个数、最左边两个字符和最右边两个字符,就可以进行合并了,具体方法见代码。
#include<cstdio>#include<iostream>#include<algorithm>#include<string.h>#include<math.h>using namespace std;#define maxn 50010char str[maxn];struct node{int l,r;int val;//有几个wbw char l1,l2;//最左边,次左边字符 char r1,r2;//最右边,次右边字符 };node tree[maxn<<2];void push_up(node& p,node& lch, node& rch){p.l=lch.l;p.r=rch.r;if(p.l+1==p.r){p.l1=p.r2=lch.l1;p.l2=p.r1=rch.r1;p.val=0;}else if(p.l+2==p.r){char mid=max( lch.l2,rch.r2 );p.l1=lch.l1;p.r1=rch.r1;p.l2=p.r2=mid;if(p.l1=='w'&&mid=='b'&&p.r1=='w')p.val=1;else p.val=0;}else{p.l1=lch.l1;p.l2=lch.l2;p.r1=rch.r1;p.r2=rch.r2;p.val=lch.val+rch.val;if(lch.r2=='w'&&lch.r1=='b'&&rch.l1=='w')p.val++;if(lch.r1=='w'&&rch.l1=='b'&&rch.l2=='w')p.val++;}}void build_tree(int n,int l,int r){tree[n].l=l; tree[n].r=r;tree[n].val=0;if(l==r){tree[n].l1=tree[n].r1=str[l];tree[n].l2=tree[n].r2=0;//这里忘记初始化WA了几发 return;}int mid=(l+r)>>1;build_tree(n<<1,l,mid);build_tree((n<<1)|1,mid+1,r);push_up(tree[n],tree[n<<1],tree[(n<<1)|1]);}void update(int n,int l,int r,char ch){if(tree[n].l==tree[n].r){tree[n].l1=tree[n].r1=ch;tree[n].val=0;return;}int mid=(tree[n].l+tree[n].r)>>1;if(r<=mid){update(n<<1,l,r,ch);}else{if(l>mid){update((n<<1)|1,l,r,ch);}else{update(n<<1,l,mid,ch);update((n<<1)|1,mid+1,r,ch);}}push_up(tree[n],tree[n<<1],tree[(n<<1)|1]);}node query(int n,int l,int r){if(tree[n].l==l&&tree[n].r==r){return tree[n];}int mid=(tree[n].l+tree[n].r)>>1;if(r<=mid){return query(n<<1,l,r);}else{if(l>mid){return query((n<<1)|1,l,r);}else{node re;node nl=query(n<<1,l,mid);node nr=query((n<<1)|1,mid+1,r);push_up(re,nl,nr);return re;}}}int main(){int t;cin>>t;int cas=0;while(t--){cas++;printf("Case %d:\n",cas);int n,m;cin>>n>>m;scanf("%s",str+1);build_tree(1,1,n);for(int i=1;i<=m;i++){int op;scanf("%d",&op);if(op){int a;char b[4];scanf("%d%s",&a,b);a++;update(1,a,a,b[0]);}else{int a,b;scanf("%d%d",&a,&b);a++;b++;node ans=query(1,a,b);printf("%d\n",ans.val);}}}return 0;}
0 0
- hdu 4046 Panda
- hdu 4046 Panda
- hdu 4046 Panda
- HDU 4046 Panda
- HDU 4046 Panda
- hdu 4046 Panda
- hdu 4046 Panda
- HDU - 4046 Panda
- HDU 4046 Panda 树状数组
- 线段树 HDU 4046 panda
- hdu 4046 Panda 解题报告
- HdU 4046 Panda 线段树
- HDU 4046 Panda(树状数组)
- HDU 4046 Panda(线段树)
- [HDU 4046]Panda[线段树]
- HDU 4046 Panda (树状数组)
- HDU 4046 - Panda (线段树 + 单点更新)
- HDU 4046 Panda(树状数组)
- 关于规范推进农村土地承包经营权确权登记试点工作的通知
- 堆制腐叶土有几种方法?怎样堆制?
- LaTeX图片的位置编排
- UIView contentStretch 图片拉伸
- java+mysql对于表情符的处理
- hdu 4046 Panda
- Android中的跨进程通信方法实例及特点分析(一):AIDL Service
- ubuntu 14.04 x86_64编译安装Skyeye1.3.5RC1的心得
- 每周学点js_<a>的href和onlick
- i os 排序
- 常用有机肥有哪几种?应用前应如何处理?如何用作基肥?能不能分别介绍?
- 开发环境搭建--准备
- ZOJ_2671_Cryptography_线段树
- 2014年双11抢货宝典-双11促销商品价格对比清单---妈妈再也不用担心我成为剁手党啦