[LOJ6208]树上询问
题目大意:
有一棵n节点的树,根为1号节点。每个节点有两个权值ki,ti,初始值均为0。
给出三种操作:
1.Add(x,d)操作:将x到根的路径上所有点的ki←ki+d
2.Mul(x,d)操作:将x到根的路径上所有点的ti←ti+d×ki
3.Query(x)操作:询问点x的权值tx
思路:
树链剖分以后用线段树维护。
对于每个结点,我们可以维护3个数a,b,c,表示最后的t为a*b+c。
对于操作1,需要修改a(修改后的ki)和c(修改的数再乘以b就多了,要从c中减去)。
对于操作2,需要修改b。
然后操作3就变成了单点查询。
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) if(ch=='-') neg=true;
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return neg?-x:x;
}
const int N=;
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
int n,par[N],son[N],size[N],dep[N],top[N],id[N];
void dfs1(const int &x,const int &par) {
size[x]=;
::par[x]=par;
dep[x]=dep[par]+;
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i];
if(y==par) continue;
dfs1(y,x);
size[x]+=size[y];
if(size[y]>size[son[x]]) {
son[x]=y;
}
}
}
void dfs2(const int &x) {
id[x]=++id[];
if(x==son[par[x]]) {
top[x]=top[par[x]];
} else {
top[x]=x;
}
if(son[x]) dfs2(son[x]);
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i];
if(y==par[x]||y==son[x]) continue;
dfs2(y);
}
}
struct Tag {
int a,b,c;
void operator += (const Tag &another) {
c+=another.c-another.a*b;
a+=another.a;
b+=another.b;
}
int calc() const {
return a*b+c;
}
};
class SegmentTree {
#define _left <<1
#define _right <<1|1
private:
Tag val[N<<];
void push_down(const int &p) {
val[p _left]+=val[p];
val[p _right]+=val[p];
val[p]=(Tag){,,};
}
public:
void modify(const int &p,const int &b,const int &e,const int &l,const int &r,const Tag &t) {
if(b==l&&e==r) {
val[p]+=t;
return;
}
push_down(p);
const int mid=(b+e)>>;
if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r),t);
if(r>mid) modify(p _right,mid+,e,std::max(mid+,l),r,t);
}
int query(const int &p,const int &b,const int &e,const int &x) {
if(b==e) {
return val[p].calc();
}
push_down(p);
const int mid=(b+e)>>;
return x<=mid?query(p _left,b,mid,x):query(p _right,mid+,e,x);
}
#undef _left
#undef _right
};
SegmentTree t;
inline void modify(int x,const Tag &tag) {
for(;top[x];x=par[top[x]]) {
t.modify(,,n,id[top[x]],id[x],tag);
}
}
inline int query(const int &x) {
return t.query(,,n,id[x]);
}
int main() {
n=getint();
for(register int i=;i<n;i++) {
add_edge(getint(),getint());
}
dfs1(,);
dfs2();
for(register int m=getint();m;m--) {
const int opt=getint(),x=getint();
if(opt==) modify(x,(Tag){getint(),,});
if(opt==) modify(x,(Tag){,getint(),});
if(opt==) printf("%d\n",query(x));
}
return ;
}
[LOJ6208]树上询问的更多相关文章
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- [BZOJ 3221][Codechef FEB13] Obserbing the tree树上询问
[BZOJ 3221]Obserbing the tree树上询问 题目 小N最近在做关于树的题.今天她想了这样一道题,给定一棵N个节点的树,节点按1~N编号,一开始每个节点上的权值都是0,接下来有M ...
- bzoj 3221: Obserbing the tree树上询问 树链剖分+线段树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3221 题解 啊呀...这是昨天的考试题啊...直接就粘了.. 与4515: [Sdoi2 ...
- LibreOJ #6208. 树上询问
内存限制:512 MiB 时间限制:500 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名 树链剖分+线段树 屠龙宝刀点击就送 #include <vector> ...
- dsu on tree 树上启发式合并 学习笔记
近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...
- BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...
- NOIP2013
DAY1 转圈游戏 列出式子(x+km)%n,快速幂. // codevs3285 #include<algorithm> #include<iostream> #includ ...
- 可持久化Trie & 可持久化平衡树 专题练习
[xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...
- 树链剖分入门-Hdu3966 Aragorn's Story
AC通道:http://acm.hdu.edu.cn/showproblem.php?pid=3966 [题目大意] 一棵树上每个点有权值,每次支持三种操作:给[a,b]路径上的所有节点的权值加上k, ...
随机推荐
- ASP.NET 抓取网页内容
(转)ASP.NET 抓取网页内容 ASP.NET 抓取网页内容-文字 ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest. ...
- FOJ Problem 1016 无归之室
Problem 1016 无归之室 Accept: 926 Submit: 7502Time Limit: 1000 mSec Memory Limit : 32768 KB Prob ...
- 在.net2.0中实现Action和Func方法
由于这两个是在.net3.5中新加入的特性,所以我们需要自己写一下. 格式如下: delegate void Action(); delegate void Action<T, T ...
- 关于tap设备
$QEMU_PATH \ -nographic \ -drive file=./rootfs.ext4,format=raw \ -net nic,vlan=0 -net tap,vlan=0,ifn ...
- lua中是 ffi 解析 【是如何处理数据包的/pkt是如何传进去的】 fsfsfs
lua中的ffi是如何解析的呢? 拿bcc中对proto的解析说起: metatype是有大学问的: ffi.metatype(ffi.typeof('struct ip_t'), { __index ...
- 【bzoj4719】[Noip2016]天天爱跑步 权值线段树合并
题目描述 给出一棵n个点的树,以及m次操作,每次操作从起点向终点以每秒一条边的速度移动(初始时刻为0),最后对于每个点询问有多少次操作在经过该点的时刻为某值. 输入 第一行有两个整数N和M .其中N代 ...
- java中unmodifiableList方法的应用场景
java对象中primitive类型变量可以通过不提供set方法保证不被修改,但对象的List成员在提供get方法后,就可以随意add.remove改变其结构,这不是希望的结果.网上看了下,发现Col ...
- Strassen优化矩阵乘法(复杂度O(n^lg7))
按照算法导论写的 还没有测试复杂度到底怎么样 不过这个真的很卡内存,挖个坑,以后写空间优化 还有Matthew Anderson, Siddharth Barman写了一个关于矩阵乘法的论文 < ...
- 忽略node_modules目录
如上图所示添加node_modules目录到忽略文件列表里面,点击应用就可以了.
- Codeforces Round #357 (Div. 2) A
A. A Good Contest time limit per test 1 second memory limit per test 256 megabytes input standard in ...