码迷,mamicode.com
首页 > 其他好文 > 详细

【区间合并线段树】HDU 4509 模板

时间:2016-07-09 17:43:56      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN=100000+50;
const int rt=0;
vector<int> E[MAXN];
int n;
int fa[MAXN],dep[MAXN],hson[MAXN],size[MAXN];
int cnt=0,top[MAXN],pos[MAXN];
int sum[MAXN<<3],add[MAXN<<3],change[MAXN<<3];


//线段树部分
void build()
{
    memset(sum,0,sizeof(sum));
    memset(add,0,sizeof(add));
} 

void pushup(int rt)
{
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void pushdown(int rt,int m)
{
    if (change[rt])
    {
        change[rt<<1]=change[rt<<1|1]=1;
        add[rt<<1]=add[rt];
        add[rt<<1|1]=add[rt];
        sum[rt<<1]=add[rt]*(m-(m>>1));
        sum[rt<<1|1]=add[rt]*(m>>1);
        add[rt]=change[rt]=0;
    }
} 

int query_sum(int L,int R,int l,int r,int rt)
{
    if (L<=l && r<=R) return sum[rt];
    pushdown(rt,r-l+1);
    int m=(l+r)>>1;
    int ret=0;
    if (m>=L) ret+=query_sum(L,R,lson);
    if (m<R) ret+=query_sum(L,R,rson);
    pushup(rt); 
    return ret;
}

void modify(int L,int R,int l,int r,int rt,int x)
{
    if (L<=l && r<=R)
    {
        change[rt]=1;
        add[rt]=x;
        sum[rt]=(r-l+1)*x;
        return;
    }
    pushdown(rt,r-l+1);
    int m=(l+r)>>1;
    if (m>=L) modify(L,R,lson,x);
    if (m<R) modify(L,R,rson,x);
    pushup(rt);
}
//读入部分 
void init()
{
    scanf("%d",&n);
    for (int i=1;i<n;i++)
    {
        int tmp;
        scanf("%d",&tmp);
        addedge(tmp,i);
    }
    dfs1(0,0,1);
    dfs2(0,0);
}

void get_ans()
{
    memset(sum,0,sizeof(sum));
    memset(change,0,sizeof(change));
    memset(add,0,sizeof(add));
    int q;
    scanf("%d",&q);
    for (int i=0;i<q;i++)
    {
        char str[25];
        int x;
        scanf("%s%d",str,&x);
        if (str[0]==i) printf("%d\n",install(x,rt));
            else if (str[0]==u) printf("%d\n",uninstall(x));
    }
}

int main()
{
    init();
    build(); 
    get_ans();
    return 0;
}

 

【区间合并线段树】HDU 4509 模板

标签:

原文地址:http://www.cnblogs.com/iiyiyi/p/5656145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!