内存限制: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. go语言中将函数作为变量传递

    在Go中函数也是一种变量,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型,函数当做值和类型在我们写一些通用接口的时候非常有用,通过下面这个例子我们可以看到test ...

  2. 虚拟机vmware11装Mac ox 10.8 解决windows8.1下unlocker202 vmxsmc.exe已停止工作的问题

    转载:http://tieba.baidu.com/p/3485956366 先说说故事吧,相信很多图钉都用过VMware Workstation这个软件.我系统是win8.1up1,之前用VMwar ...

  3. 938. Range Sum of BST

    Given the root node of a binary search tree, return the sum of values of all nodes with value betwee ...

  4. 部署开发以太坊dapp的四种方式

    我们已经学习了4种开发和部署智能合约的方法: 第1种是使用 Truffle 和 Ganache .由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和 IDEs.有 ...

  5. Android实现点击两次返回退出APP

    Android实现点击两次退出APP 这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个APP而不是返回上一个界面,查找了网上的资料,整合和修改了一下写了这篇博客. 这里我主要以我的项目 ...

  6. Maven配置及使用总结

    一. 安装Maven 1. Maven官网 http://maven.apache.org/ 2. 本例子下载最新的版本,apache-maven-3.3.9 解压后目录描述: bin 含有maven ...

  7. 实验一 用户界面与Shell命令

    一.实验课时:2学时 二.实验目的 v  熟悉redhat_linux的用户界面,会进行常用的系统设置. v  掌握常用的shell命令. 三.实验环境 v  运行Windows xp\2000\20 ...

  8. swift5 正则简单使用

    /* 判断是否价格 */ let money = "100.98" let parrern = "^\\d+(\\.\\d{0,2})?$" if NSPred ...

  9. JSPs only permit GET POST or HEAD的解决方案(REST风格)

    问题:原文链接 https://blog.csdn.net/tiberroot/article/details/76615727 看到很多人解决办法使用 @ResponseBody注解 这个意思是按照 ...

  10. Django之extra

    extra过滤 extra extra(select=None, where=None, params=None, tables=None, order_by=None, select_params= ...