首页 > 代码库 > 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;>