LibreOJ #6208. 树上询问

树链剖分+线段树
#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. 树上询问的更多相关文章
- 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 ...
- [LOJ6208]树上询问
题目大意: 有一棵n节点的树,根为1号节点.每个节点有两个权值ki,ti,初始值均为0. 给出三种操作: 1.Add(x,d)操作:将x到根的路径上所有点的ki←ki+d 2.Mul(x,d)操作:将 ...
- bzoj 3221: Obserbing the tree树上询问 树链剖分+线段树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3221 题解 啊呀...这是昨天的考试题啊...直接就粘了.. 与4515: [Sdoi2 ...
- 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, ...
随机推荐
- go语言中将函数作为变量传递
在Go中函数也是一种变量,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型,函数当做值和类型在我们写一些通用接口的时候非常有用,通过下面这个例子我们可以看到test ...
- 虚拟机vmware11装Mac ox 10.8 解决windows8.1下unlocker202 vmxsmc.exe已停止工作的问题
转载:http://tieba.baidu.com/p/3485956366 先说说故事吧,相信很多图钉都用过VMware Workstation这个软件.我系统是win8.1up1,之前用VMwar ...
- 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 ...
- 部署开发以太坊dapp的四种方式
我们已经学习了4种开发和部署智能合约的方法: 第1种是使用 Truffle 和 Ganache .由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和 IDEs.有 ...
- Android实现点击两次返回退出APP
Android实现点击两次退出APP 这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个APP而不是返回上一个界面,查找了网上的资料,整合和修改了一下写了这篇博客. 这里我主要以我的项目 ...
- Maven配置及使用总结
一. 安装Maven 1. Maven官网 http://maven.apache.org/ 2. 本例子下载最新的版本,apache-maven-3.3.9 解压后目录描述: bin 含有maven ...
- 实验一 用户界面与Shell命令
一.实验课时:2学时 二.实验目的 v 熟悉redhat_linux的用户界面,会进行常用的系统设置. v 掌握常用的shell命令. 三.实验环境 v 运行Windows xp\2000\20 ...
- swift5 正则简单使用
/* 判断是否价格 */ let money = "100.98" let parrern = "^\\d+(\\.\\d{0,2})?$" if NSPred ...
- JSPs only permit GET POST or HEAD的解决方案(REST风格)
问题:原文链接 https://blog.csdn.net/tiberroot/article/details/76615727 看到很多人解决办法使用 @ResponseBody注解 这个意思是按照 ...
- Django之extra
extra过滤 extra extra(select=None, where=None, params=None, tables=None, order_by=None, select_params= ...