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

#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;
}
时间: 2024-10-12 21:36:01

【区间合并线段树】HDU 4509 模板的相关文章

【区间合并线段树】BZOJ1593-安排住宿

[题目大意] 查询最左端的连续长度区间:或批量修改一些区间.[思路] 区间合并线段树……复习一下.POJ上有一样的题目,我居然还借用了别人的权限号去做BZOJ,简直愚昧到没朋友[笑cry] 处理方法以前的博文里有,这里有不赘述了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cstdlib> 6 using

BZOJ 2243:染色(树链剖分+区间合并线段树)

[SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”.请你写一个程序依次完成这m个操作.Input第一行包含2个整数n和m,分别表示节点数和操作数:第二行包含n个正整数表示n个节点的初始颜色下面 行每行包含两个整数x和y,表示x和y之间有一条无向边.下面 行每行描述一个操作:“C

HDU 1166 敌兵布阵 (我的树状数组加线段树点修改模板)

思路:本题因为是点修改,所以我们可以用线段树或者是树状数组了.线段树的基本操作我在我的代码中会具体体现,关键是要理解下面这幅图,具体的思想大家可以去看看其他的资料 线段树AC代码: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define N 50005 int num

hdu 5700区间交(线段树)

区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 849    Accepted Submission(s): 377 Problem Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大. 例如样例中,选择[2,5]

CodeForces 52C Circular RMQ(区间循环线段树,区间更新,区间求和)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://codeforces.com/problemset/problem/52/C You are given circular array a0,?a1,?...,?an?-?1. There are two types of operations with it: inc(lf,?rg,?v) - this operation increases each element on the segm

区间覆盖(线段树)

区间覆盖(线段树) X轴上方有若干条平行于X轴的线段,求这些线段能够覆盖X轴的总长度? 输入格式 第一行一个数n(n<=100000),表示线段个数: 接下来n行,每行两个整数a[i],b[i](-10^8<=a[i],b[i]<=10^8),代表一个线段的两个端点输出覆盖X轴的长度 输入样例 2 10 12 2 4 输出样例 4 1 /* 2 样例: 3 有两段线 4 1 2 5 2 3 6 */ 7 8 #include <bits/stdc++.h> 9 using n

poj3468A Simple Problem with Integers区间和线段树

同上... #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include

POJ 2528 Mayor&#39;s posters 区间离散化线段树

点击打开链接 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45894   Accepted: 13290 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their elector

HDU 5649 DZY Loves Sorting(二分答案+线段树、线段树合并+线段树分割)

题意 一个 \(1\) 到 \(n\) 的全排列,\(m\) 种操作,每次将一段区间 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作后的第 \(k\) 位. \(1 \leq n \leq 10^5\) 思路 两个 \(\log\) 的做法展现了二分答案的强大功能.首先二分枚举第 \(k\) 位的值,然后将小于等于它的数都变为 \(1\) ,大于它的数变为 \(0\) ,线段树可以实现对 \(01\) 序列快速的排序,按要求进行排序,然后如果第 \(k\) 位为 \(1\) 说明这