首页 > 代码库 > HdU 4046 Panda 线段树
HdU 4046 Panda 线段树
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4046
题意:给一由b和w组成的长度为n的字符串(n<=50000),有m次操作(m<=10000),每次操作是询问一段范围内wbw的个数,或者改变一个字符成为w或b。
思路:建一棵线段树,每个结点记录的是从L到R以每个i为最左边的字母的总共的wbw的个数,单点更新的时候要更新三个点。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <cstdlib> #include <queue> #include <stack> #include <vector> #include <ctype.h> #include <algorithm> #include <string> #include <set> #include <ctime> #define PI acos(-1.0) #define INF 0x7fffffff #define eps 1e-8 #define maxn 50005 typedef long long LL; typedef unsigned long long ULL; using namespace std; int n,m,l,r; int num[maxn*4]; char ss[maxn*4]; struct line { int left,right; int n; char value; } a [maxn*4]; void build_tree(int l,int r,int step) { a[step].left=l; a[step].right=r; a[step].n=0; if(l==r) { a[step].n=((l+2<=n)&&(ss[l]=='w'&&ss[l+1]=='b'&&ss[l+2]=='w')); num[l]=step; return; } int mid=(l+r)>>1; build_tree(l,mid,step<<1); build_tree(mid+1,r,step<<1|1); a[step].n=a[step<<1].n+a[step<<1|1].n; } int ans; void change(int s,int step,char k) { if(s==a[step].left&&s==a[step].right) { a[step].value=http://www.mamicode.com/k;>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。