题意:给一棵树,并给定各个点权的值,然后有3种操作:

I C1 C2 K: 把C1与C2的路径上的所有点权值加上K

D C1 C2 K:把C1与C2的路径上的所有点权值减去K

Q C:查询节点编号为C的权值

/*
要手动扩栈。
*/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 100010
using namespace std;
int a[N],head[N],fa[N],son[N],dep[N],top[N],pos[N],sum[N*],tag[N*],n,m,p,sz;
struct node{
int to,pre;
};node e[N*];
void add(int i,int x,int y){
e[i].to=y;
e[i].pre=head[x];
head[x]=i;
}
void dfs1(int x){
son[x]=;
for(int i=head[x];i;i=e[i].pre){
int v=e[i].to;
if(fa[x]==v) continue;
fa[v]=x;dep[v]=dep[x]+;
dfs1(v);
son[x]+=son[v];
}
}
void dfs2(int x,int chain){
++sz;pos[x]=sz;top[x]=chain;int k=,maxn=;
for(int i=head[x];i;i=e[i].pre)
if(fa[x]!=e[i].to&&son[e[i].to]>maxn){
maxn=son[e[i].to];
k=e[i].to;
}
if(!k)return;
dfs2(k,chain);
for(int i=head[x];i;i=e[i].pre)
if(e[i].to!=fa[x]&&e[i].to!=k)
dfs2(e[i].to,e[i].to);
}
void pushup(int k){
sum[k]=sum[k*]+sum[k*+];
}
void pushdown(int k,int l,int r){
if(!tag[k]) return;
int mid=l+r>>;
tag[k*]+=tag[k];
tag[k*+]+=tag[k];
sum[k*]+=tag[k]*(l-mid+);
sum[k*+]+=tag[k]*(r-mid);
tag[k]=;
}
void change(int l,int r,int k,int x,int y,int v){
if(l>=x&&r<=y){
tag[k]+=v;
sum[k]+=(l-r+)*v;
return;
}
pushdown(k,l,r);
int mid=l+r>>;
if(x<=mid) change(l,mid,k*,x,y,v);
if(y>mid) change(mid+,r,k*+,x,y,v);
pushup(k);
}
int query(int l,int r,int k,int pos){
if(l==r)return sum[k];
pushdown(k,l,r);
int mid=l+r>>;
if(pos<=mid) return query(l,mid,k*,pos);
else return query(mid+,r,k*+,pos);
}
void xiugai(int x,int y,int v){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
change(,n,,pos[top[x]],pos[x],v);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
change(,n,,pos[x],pos[y],v);
}
void work(){
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
add(i*-,x,y);add(i*,y,x);
}
dfs1();dfs2(,);
for(int i=;i<=n;i++)change(,n,,pos[i],pos[i],a[i]);
char opt[];
for(int i=;i<=p;i++){
int x,y,v;
scanf("%s",opt);
if(opt[]=='I'){
scanf("%d%d%d",&x,&y,&v);
xiugai(x,y,v);
}
else if(opt[]=='D'){
scanf("%d%d%d",&x,&y,&v);
xiugai(x,y,-v);
}
else{
scanf("%d",&x);
printf("%d\n",query(,n,,pos[x]));
}
}
}
int main(){while(scanf("%d%d%d",&n,&m,&p)!=EOF){
memset(head,,sizeof(head));
memset(fa,,sizeof(fa));
memset(son,,sizeof(son));
memset(dep,,sizeof(dep));
memset(top,,sizeof(top));
memset(pos,,sizeof(pos));
memset(sum,,sizeof(sum));
memset(tag,,sizeof(tag));
sz=;
work();
}
return ;
}

Aragorn's Story(hdu3966)的更多相关文章

  1. html中id name class的区别(转)

    HTML 中 id与name 区别 一个name可以同时对应多个控件,比如checkbox和radio 而id必须是全文档中唯一的 id的用途 1) id是HTML元素的Identity,主要是在客户 ...

  2. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  3. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  4. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  5. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  6. Online Judge(OJ)搭建(第一版)

    搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...

  7. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  8. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  9. 【.net 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

随机推荐

  1. App Transport Security has blocked a cleartext HTTP

    打开info.plist源代码复制粘贴     <key>NSAppTransportSecurity</key>     <dict> <!--Includ ...

  2. Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题

    Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题 1.首先,要单击右上角的设置输入法的"区域与语言设置",要设置为“为每个窗口设置不同的输入源”. 还有,刚使用的 ...

  3. 关于java中实现在oracle数据库中实现对中文首字母进行排序的解决方案

    首先介绍Oracle 9i新增加的一个系统自带的排序函数 1.按首字母排序 在oracle9i中新增了按照拼音.部首.笔画排序功能.设置NLS_SORT值     SCHINESE_RADICAL_M ...

  4. Ace 在Vue中使用方法

    var Vue = require('vue/dist/vue.common.js'); document.querySelector('body').append(document.createEl ...

  5. 一个batch如何通过一个网络

    一个batch下所有的图片一起经过整个网络,不是说一张图片经过网络后再让下一张进入网络,这样一个batch一起通过网络计算速度比一张一张这样快

  6. CPP-基础:关于引用

    1.什么是“引用”?申明和使用“引用”要注意哪些问题? 引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同. 申明一个引用的时候,切记要对其进行初始化. 引用声明完 ...

  7. QT+动手设计一个登陆窗口+布局

    登陆窗口的样式如下: 这里面涉及着窗口的UI设计,重点是局部布局和整体布局, 首先在ui窗口上添加一个容器类(Widget),然后将需要添加的控件放置在容器中,进行局部布局(在进行局部布局的时候可以使 ...

  8. SSH中的jar包讲解

    我们在搭建SSH框架的时候,需要引入各自的一些jar包 首先,先来看一下我们使用的SSH的各自版本及引入的jar包.   struts2.3.1.2: struts2-core-2.3.1.jar j ...

  9. iOS之WKWebView

    Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到IOS ...

  10. Sass基本数据类型和各类型的原生方法

    数据类型: 数字:1,2,3,11,10px (可以带单位) 字符串:"asd",'asd',asd (有引号和无引号都是字符串类型) 如 $name : zhang san ; ...