题意:给一棵树,并给定各个点权的值,然后有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. Git强制pull

    git fetch --all git reset --hard origin/master

  2. 在Solr中配置中文分词IKAnalyzer

    李克华 云计算高级群: 292870151 交流:Hadoop.NoSQL.分布式.lucene.solr.nutch 在Solr中配置中文分词IKAnalyzer 1.在配置文件schema.xml ...

  3. POJ2402 Palindrome Numbers第K个回文数——找规律

    问题 给一个数k,给出第k个回文数  链接 题解 打表找规律,详见https://www.cnblogs.com/lfri/p/10459982.html,差别仅在于这里从1数起. AC代码 #inc ...

  4. ndarray数组自动创建

    为了实现某些运算,需要快速构造符合要求的大数组 Numpy函数生成的数组,如不指定类类型,几乎全为浮点型(arange除外,它是整形),因为科学计算中测量值,例如温度.长度,都是浮点数 import ...

  5. 根据HTML语义化编码

    语义化标签——http://www.html5jscss.com/html5-semantics-section.html 写HTML代码时应注意什么? 尽可能少的使用无语义的标签div和span: ...

  6. Java中集合类

    一.Collection Collection 接口用于表示任何对象或元素组.想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection 在前面的大图也可以看出,它是List 和 Set ...

  7. 洛谷 P1120 小木棍[数据加强版]

    这道题可能是我做过的数据最不水的一道题-- 题目传送门 这题可以说是神剪枝,本身搜索并不算难,但剪枝是真不好想(好吧,我承认我看了题解)-- 剪枝: 用桶来存储木棍 在输入的时候记录下最长的木棍和最短 ...

  8. WPF显示尺寸与设备无关问题

    WPF单位 WPF窗口以及其中的所有元素都是用与设备无关的单位进行度量.一个与设备无关的单位被定义为1/96英寸.WPF程序统一用下面一个公式来定义物理单位尺寸: [ 物理单位尺寸(像素)] = [ ...

  9. NLP.TM | GloVe模型及其Python实现

    在进行自然语言处理中,需要对文章的中的语义进行分析,于是迫切需要一些模型去描述词汇的含义,很多人可能都知道word2vector算法,诚然,word2vector是一个非常优秀的算法,并且被广泛运用, ...

  10. java在线聊天项目0.3版本 制作客户端窗体,实现发送按钮和回车发送信息功能,使用ActionListener监听事件中actionPerformed方法(用内部类和匿名内部类两种方法)

    方法一,使用匿名内部类的监听方法,因方法一致代码稍冗余 package com.swift; import java.awt.BorderLayout; import java.awt.Color; ...