DFS序+线段树(bzoj 4034)
- 操作1:也就是将某两个点+a;
- 操作2:区间更新
- 操作3:查询起始区间到某点的和
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long LL;
const int INF=2e9+1e8; const int MOD=1e9+;
const double eps=0.0000000001;
void fre()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
}
#define MSET(a,b) memset(a,b,sizeof(a)) const int maxn=1e6+;
void zpsb(int x)
{
if(x>=&&x<maxn) return ;
while();
}
struct Edge
{
int t,next;
}edge[maxn];
int sz,first[maxn],Treeval[maxn];
void addedge(int s,int t)
{
edge[sz].t=t,edge[sz].next=first[s];
first[s]=sz++;
}
int in[maxn],out[maxn];
int reid[maxn],io[maxn],tot;
void dfs(int x,int pre)
{
reid[in[x]=tot]=Treeval[x];
io[tot++]=;
for(int i=first[x];i!=-;i=edge[i].next)
{
int t=edge[i].t;
if(t==pre) continue;
dfs(t,x);
}
reid[out[x]=tot]=-Treeval[x];
io[tot++]=-;
} struct SegTree
{
struct Node
{
int l,r,flag;
LL lazy,sum;
}T[maxn*];
void build(int i,int l,int r)
{
T[i].l=l,T[i].r=r;
T[i].lazy=T[i].flag=;
if(l==r)
{
T[i].sum=reid[r];
T[i].flag=io[r];
return ;
}
int mid=(l+r)>>;
build(i<<,l,mid),build(i<<|,mid+,r);
T[i].sum=T[i<<].sum+T[i<<|].sum;
T[i].flag=T[i<<].flag+T[i<<|].flag;
}
void pushdown(int i)
{
if(T[i].lazy)
{
T[i<<].sum+=T[i].lazy*T[i<<].flag;
T[i<<|].sum+=T[i].lazy*T[i<<|].flag;
T[i<<].lazy+=T[i].lazy,T[i<<|].lazy+=T[i].lazy;
T[i].lazy=;
}
}
void update(int i,int l,int r,LL k)
{
zpsb(i);
if(T[i].l==l&&T[i].r==r)
{
T[i].sum+=T[i].flag*k;
T[i].lazy+=k;
return ;
}
pushdown(i);
int mid=(T[i].l+T[i].r)>>;
if(r<=mid) update(i<<,l,r,k);
else if(l>mid) update(i<<|,l,r,k);
else update(i<<,l,mid,k),update(i<<|,mid+,r,k);
T[i].sum=T[i<<].sum+T[i<<|].sum;
}
LL query(int i,int l,int r)
{
if(T[i].l==l&&T[i].r==r) return T[i].sum;
pushdown(i);
int mid=(T[i].l+T[i].r)>>;
if(r<=mid) return query(i<<,l,r);
else if(l>mid) return query(i<<|,l,r);
else return query(i<<,l,mid)+query(i<<|,mid+,r);
}
}wa;
int main()
{
int n,m;
MSET(first,-);
sz=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&Treeval[i]);
for(int i=;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
tot=;
dfs(,);
// for(int i=1;i<=n;i++)
// {
// printf("x=%d %d %d\n",i,in[i],out[i]);
// }
// for(int i=1;i<=2*n;i++)
// {
// printf("id=%d val=%d\n",i,reid[i]);
// }
wa.build(,,*n);
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==)
{
int x,a;
scanf("%d%d",&x,&a);
wa.update(,in[x],in[x],(LL)a);
wa.update(,out[x],out[x],(LL)a);
}
else if(opt==)
{
int x,a;
scanf("%d%d",&x,&a);
wa.update(,in[x],out[x],(LL)a);
}
else
{
int x;
scanf("%d",&x);
printf("%lld\n",wa.query(,,in[x]));
}
}
} /**************************************************/
/** Copyright Notice **/
/** writer: wurong **/
/** school: nyist **/
/** blog : http://blog.csdn.net/wr_technology **/
/**************************************************/
DFS序+线段树(bzoj 4034)的更多相关文章
- BZOJ 3252题解(贪心+dfs序+线段树)
题面 传送门 分析 此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根 ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
- POJ 3321 DFS序+线段树
单点修改树中某个节点,查询子树的性质.DFS序 子树序列一定在父节点的DFS序列之内,所以可以用线段树维护. 1: /* 2: DFS序 +线段树 3: */ 4: 5: #include < ...
- 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...
- F - Change FZU - 2277 (DFS序+线段树)
题目链接: F - Change FZU - 2277 题目大意: 题意: 给定一棵根为1, n个结点的树. 有q个操作,有两种不同的操作 (1) 1 v k x : a[v] += x, a[v ' ...
- BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树
题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...
随机推荐
- session再次理解
1.session介绍: session主要用来存储用户的会话所需的信息(用户行为信息),当用户在同一个服务器上实现不同的操作时,session信息会以变量的形式存储在服务器的内存中,保存用户的状态信 ...
- springboot配置filter
Filter 过滤器是web开发中很重要的一个组件,下面以一个session登陆的例子介绍下spring boot中如何使用Filter 首先要准备一个实现了Filter的接口的类 SessionFi ...
- 第八讲_图像问答Image Question Answering
第八讲_图像问答Image Question Answering 课程结构 图像问答的描述 具备一系列AI能力:细分识别,物体检测,动作识别,常识推理,知识库推理..... 先要根据问题,判断什么任务 ...
- xshell登陆腾讯云服务器
2016-12-11 00:17:36 前段时间在同学的介绍下关注了一下腾讯云:然后里面有学生优惠可以拿到免费的域名和云服务器.所以感兴趣就实验了一下,今天中午抢到了“1元特惠的学生包”,里面有免 ...
- C#应用程序配置文件.config介绍
我们经常会希望在程序中写入一些配置信息,例如版本号,以及数据库的连接字符串等.你可能知道在WinForm应用程序中可以利用Properties.Settings来进行类似的工作,但这些其实都利用了Ap ...
- Windows 如何为绿色软件运行时添加参数 如最小化,无窗口运行
1 有些软件运行的时候需要或者可以添加参数来实现一些特殊要求,比如开机自启动,运行时不显示主界面,不显示托盘图标等,比如下面的这个流量精灵软件,"urlcore.exe /h /r /t 4 ...
- 百度地图SDK调试SDKInitializer.initialize(getApplicationContext())错误
首先描写叙述下问题出现的原因.開始的时候写了一个百度地图SDK的demo来试功能,由于最開始用的是Eclipse自带的AVD来调试,一切正常. 都能够正常验证,可是由于受不了重复的重新启动AVD设备, ...
- 【Access2007】Access2007的打开方式
Access2007提供了多种打开方式 仅仅读与非仅仅读就不用说了,就是能编辑与不可以编辑的差别 是否以独占的方式打开是Access2007的打开方式的核心 这里什么都没有写的打开是指以"共 ...
- python(22)- 递归和函数式编程
递归: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 1. 必须有一个明确的结束条件: 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少: 3.递 ...
- 拒绝ssh远程暴力破解
拒绝ssh远程暴力破解 简介 在网络技术日益发展的今天,网络上的安全问题日益严重.当你在公网上使用Linux服务器时,很有可能你的服务器正在遭受ssh暴力破解. 曾经有一次我的同伴将给客户提供监控服务 ...