内存限制: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. skb_store_bits() 和 skb_copy_bits()

    int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len);    int skb_store_bits(c ...

  2. 10. windows下原来可以这样隐藏webshell

    1.利用保留字隐藏 windows系统有些保留文件夹名,windows系统不允许用这些名字命名文件夹,如 aux|prn|con|nul|com1|com2|com3|com4|com5|com6|c ...

  3. MySQL写入中文乱码

    这点确实很迷,我的数据库属性确实设置了utf-8字符集,但写入中文还是乱码,后来是直接修改了全局配置才修改过来. 1.进入MySQL的本地安装路径,我的安装路径是"C:\Program Fi ...

  4. 基于selenium+java的12306自动抢票

    import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;import org.openqa.selenium.Keys; ...

  5. OpenGL学习笔记——求值器和NURBS

    http://codercdy.com/openglxue-xi-bi-ji-qiu-zhi-qi-he-nurbs/ 在最底层,图形硬件所绘制的是点.直线和多边形(通常是三角形和四边形).平滑的曲线 ...

  6. poj3667(线段树区间合并&区间查询)

    题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...

  7. 2014-11-1 NOIP模拟赛2

    一.题目概览 中文题目名称 连连看 取数 游戏 迎接仪式 英文题目名称 card cycle game welcome 可执行文件名 card cycle game welcome 输入文件名 car ...

  8. 能量项链 洛谷P1063

    1154 能量项链 2006年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在Mars星球上,每个M ...

  9. [Xcode 实际操作]七、文件与数据-(12)数据持久化存储框架CoreData的使用:查找CoreData中的数据

    目录:[Swift]Xcode实际操作 本文将演示如何查找数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...

  10. selenium IDE插件下载

    1.在https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/中下载Firefox的selenium-ide插件: 2.之后在Firef ...