内存限制:512 MiB 时间限制:500 ms 标准输入输出
                            题目类型:传统 评测方式:文本比较
                                 上传者: 匿名

树链剖分+线段树

屠龙宝刀点击就送

#include <vector>
#include <cstdio>
#define N 100005
using namespace std;
vector<int>G[N];
struct Segment
{
int l,r,mid,t,ki,k,flagk,flagt;
Segment * ch[];
Segment ()
{
t=ki=k=flagk=flagt=;
ch[]=ch[]=NULL;
}
}*root=new Segment;
int n,m,tim,top[N],siz[N],dep[N],fa[N],belong[N];
void dfs1(int x)
{
siz[x]=;
dep[x]=dep[fa[x]]+;
for(int i=;i<G[x].size();++i)
{
int v=G[x][i];
if(fa[x]==v) continue;
fa[v]=x;
dfs1(v);
siz[x]+=siz[v];
}
}
void dfs2(int x)
{
if(!top[x]) top[x]=x;
int p=;
belong[x]=++tim;
for(int i=;i<G[x].size();++i)
{
int v=G[x][i];
if(fa[x]!=v&&siz[p]<siz[v]) p=v;
}
if(p) top[p]=top[x],dfs2(p);
for(int i=;i<G[x].size();++i)
{
int v=G[x][i];
if(fa[x]!=v&&v!=p) dfs2(v);
}
}
void build(Segment *&k,int l,int r)
{
k=new Segment;
k->l=l;k->r=r;
if(l==r) return;
k->mid=(l+r)>>;
build(k->ch[],l,k->mid);
build(k->ch[],k->mid+,r);
}
void pushdown(Segment *&k)
{
k->ch[]->t+=k->t+k->flagt*k->ch[]->k;
k->ch[]->t+=k->t+k->flagt*k->ch[]->k;
k->ch[]->ki+=k->flagk;
k->ch[]->ki+=k->flagk;
k->ch[]->flagk+=k->flagk;
k->ch[]->flagk+=k->flagk;
k->ch[]->flagt+=k->flagt;
k->ch[]->flagt+=k->flagt;
k->flagk=;
k->flagt=;
k->t=;
}
void plusk(Segment *&k,int l,int r,int d)
{
if(k->l==l&&k->r==r) {k->ki+=d;k->k+=d;k->flagk+=d;return;}
pushdown(k);
if(l>k->mid) plusk(k->ch[],l,r,d);
else if(r<=k->mid) plusk(k->ch[],l,r,d);
else plusk(k->ch[],l,k->mid,d),plusk(k->ch[],k->mid+,r,d);
}
void plust(Segment *&k,int l,int r,int d)
{
if(k->l==l&&k->r==r) {k->t+=d*k->ki;k->flagt+=d;return;}
pushdown(k);
if(l>k->mid) plust(k->ch[],l,r,d);
else if(r<=k->mid) plust(k->ch[],l,r,d);
else plust(k->ch[],l,k->mid,d),plust(k->ch[],k->mid+,r,d);
}
int query(Segment *&k,int t)
{
if(k->l==k->r) return k->t;
pushdown(k);
if(t<=k->mid) return query(k->ch[],t);
else return query(k->ch[],t);
}
void solvek(int x,int y,int d)
{
for(;top[x]!=top[y];x=fa[top[x]])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
plusk(root,belong[top[x]],belong[x],d);
}
if(dep[x]<dep[y]) swap(x,y);
plusk(root,belong[y],belong[x],d);
}
void solvet(int x,int y,int d)
{
for(;top[x]!=top[y];x=fa[top[x]])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
plust(root,belong[top[x]],belong[x],d);
}
if(dep[x]<dep[y]) swap(x,y);
plust(root,belong[y],belong[x],d);
}
int Main()
{
scanf("%d",&n);
for(int u,v,i=;i<n;++i)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs1();dfs2();
build(root,,n);
scanf("%d",&m);
for(int opt,x,d;m--;)
{
scanf("%d%d",&opt,&x);
if(opt==) {scanf("%d",&d);if(d) solvek(,x,d);}
else if(opt==) {scanf("%d",&d);if(d) solvet(,x,d);}
else printf("%d\n",query(root,belong[x]));
}
return ;
}
int sb=Main();
int main(int argc,char *argv[]){;}

LibreOJ #6208. 树上询问的更多相关文章

  1. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  2. [BZOJ 3221][Codechef FEB13] Obserbing the tree树上询问

    [BZOJ 3221]Obserbing the tree树上询问 题目 小N最近在做关于树的题.今天她想了这样一道题,给定一棵N个节点的树,节点按1~N编号,一开始每个节点上的权值都是0,接下来有M ...

  3. [LOJ6208]树上询问

    题目大意: 有一棵n节点的树,根为1号节点.每个节点有两个权值ki,ti,初始值均为0. 给出三种操作: 1.Add(x,d)操作:将x到根的路径上所有点的ki←ki+d 2.Mul(x,d)操作:将 ...

  4. bzoj 3221: Obserbing the tree树上询问 树链剖分+线段树

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3221 题解 啊呀...这是昨天的考试题啊...直接就粘了.. 与4515: [Sdoi2 ...

  5. dsu on tree 树上启发式合并 学习笔记

    近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...

  6. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  7. NOIP2013

    DAY1 转圈游戏 列出式子(x+km)%n,快速幂. // codevs3285 #include<algorithm> #include<iostream> #includ ...

  8. 可持久化Trie & 可持久化平衡树 专题练习

    [xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...

  9. 树链剖分入门-Hdu3966 Aragorn's Story

    AC通道:http://acm.hdu.edu.cn/showproblem.php?pid=3966 [题目大意] 一棵树上每个点有权值,每次支持三种操作:给[a,b]路径上的所有节点的权值加上k, ...

随机推荐

  1. 《精通Spring4.X企业应用开发实战》读后感第五章(方法注入)

  2. jquery、javascript实现(get、post两种方式)跨域解决方法

    一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(function(){ $.ajax({ url: "http://www.xxx ...

  3. LeetCode: 598 Range Addition II(easy)

    题目: Given an m * n matrix M initialized with all 0's and several update operations. Operations are r ...

  4. IT兄弟连 Java语法教程 Java语言入门 典面试题

    1.请说明JVM.JRE和JDK是什么?它们有什么关系? JVM是Java虚拟机,Java Virtual Machine的缩写,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实 ...

  5. SpringBoot(1)—启动原理之SpringApplication对象的创建

    创建SpringApplication对象 SpringBoot版本为 2.1.1.RELEASE @SpringBootApplication public class SpringbootDemo ...

  6. [NOI2002] 贪吃的九头蛇

    考虑任意一种划给大头的方案,两端的都给了大头(bel=1)的边产生难受值,剩下n-k个果子分给m-1个头,当m-1=1时,两端都给了这个小头也产生难受值:而m-1>1的情况要好看的多,贪心的,因 ...

  7. $SCOJ4427 Miss Zhao's Graph$

    \(problem\) 给定一个包含n个顶点m条边的带权有向图,找一条边数最多的路径,且路径上的边的权值严格递增. 图中可能有重边和自环. \(题意非常简单:n个点 m个带权边 最多能连成多少条边\) ...

  8. IDEA导入HttpServlet包

    转载此篇博客,言简意赅.https://blog.csdn.net/liu_yanzhao/article/details/78838670

  9. moment.js插件的简单上手使用

    开发过程中看长篇幅的技术文档是件多么影响多发效率的事情丫,哼哼,人家明明只是想用个简单的功能而已丫,下面文档很好的解决了这个问题,yeah~~~ 一.monent.js时间插件 1.Moment.js ...

  10. 监控数组与foreach绑定-Knockout.js

    html: <h2>Your seat reservations</h2> <table>    <thead>  <tr>         ...