内存限制: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. Oracle&nbsp;11g&nbsp;R2安装手册(…

    1.Oracle 11g R2安装手册(图文教程)For Windows 1.下载Oracle 11g R2 for Windows版本,下载地址如下官方网站:http://download.orac ...

  2. 7.10实习培训日志-Maven 敏捷编程

    总结 今天早上主要学习了Maven和Idea的Docker插件,遇到了一些坑,对于Idea的Docker插件,不能下载,然后我去访问Idea插件官网,发现被墙了,只要开个VPN就好.下午主要是张总经理 ...

  3. C# 生成word 文档 代码 外加 IIS报错解决方案

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  4. Django 之 requirement.txt 依赖文件生成

    通过依赖文件,别人在使用我们的项目时,不需要再一个个去安装所需模块,只需安装依赖文件即可. 1. 导出整个虚拟环境依赖 # 在项目根目录中,打开终端执行以下命令 # 生成 requirements.t ...

  5. Android在Win10环境搭建

    一.安装JDK并配置环境变量 1.在Java官方网站上下载相应系统的jdk文件安装,如win7 64 位系统下安装jdk-6u45-windows-x64,全部选择默认的安装路径即可安装完成. 2.配 ...

  6. Elasticsearch Query DSL查询入门

    本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...

  7. [Xcode 实际操作]五、使用表格-(9)删除UITableView单元格(手势左滑调出删除按钮)

    目录:[Swift]Xcode实际操作 本文将演示如何删除某一行单元格.手势左滑调出删除按钮. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIK ...

  8. 在Mybatis中处理sql中的大于号小于号

    因为xml格式中,不能随便出现"<".“>”等符号,所以在sql中这一类的符号要进行特殊处理 第一种方法:使用转义字符替换特殊的符号 例如 SELECT * FROM ...

  9. 自动化测试 Cucumber

    Cucumber是一个能够理解用普通语言描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. Cucumber 三大组成: Feature ...

  10. .Net WebApi接口Swagger集成简单使用

    Swagger介绍 Swagger 是一款RESTFUL接口的.基于YAML.JSON语言的文档在线自动生成.代码自动生成的工具.而我最近做的项目用的是WebAPI,前后端完全分离,这时后端使用Swa ...