【hdu3966】Aragorn's Story
题意:给一棵树,并给定各个点权的值,然后有3种操作:
I C1 C2 K: 把C1与C2的路径上的所有点权值加上K
D C1 C2 K:把C1与C2的路径上的所有点权值减去K
Q C:查询节点编号为C的权值
裸裸的树剖
- #include<algorithm>
- #include<iostream>
- #include<cstdlib>
- #include<cstring>
- #include<cstdio>
- #include<cmath>
- using namespace std;
- typedef long long LL;
- #define N 50010
- struct Node
- {
- int to,next;
- }e[N<<];
- int id,cnt;
- int head[N];
- int num[N],siz[N],top[N],son[N];
- int dep[N],pos[N],rank1[N],fa[N];
- LL sum[N<<],add[N<<];
- char s[];
- int n,m,q;
- int u,v;
- int al,ar,ask;
- inline void init()
- {
- memset(son,-,sizeof(son));
- memset(head,-,sizeof(head));
- id=;
- cnt=;
- }
- void link(int x,int y)
- {
- e[++cnt]=(Node){y,head[x]};
- head[x]=cnt;
- }
- void dfs(int x,int father,int d)
- {
- siz[x]=;
- dep[x]=d;
- fa[x]=father;
- for (int i=head[x];~i;i=e[i].next)
- {
- int t=e[i].to;
- if (t!=fa[x])
- {
- dfs(t,x,d+);
- siz[x]+=siz[t];
- if (son[x]==- || siz[x]>siz[son[x]])
- son[x]=t;
- }
- }
- }
- void dfs2(int x,int cha)
- {
- top[x]=cha;
- pos[x]=++id;
- rank1[pos[x]]=x;
- if (son[x]==-)
- return ;
- dfs2(son[x],cha);
- for(int i=head[x];~i;i=e[i].next)
- {
- int t=e[i].to;
- if(t!=son[x] && t!=fa[x])
- dfs2(t,t);
- }
- }
- void pushup(int now)
- {
- sum[now]=max(sum[now<<],sum[now<<|]);
- }
- void pushdown(int now,int m)
- {
- if (add[now])
- {
- add[now<<]+=add[now];
- add[now<<|]+=add[now];
- sum[now<<]+=add[now]*(m-(m>>));
- sum[now<<|]+=add[now]*(m>>);
- add[now]=;
- }
- }
- void build(int nowl,int nowr,int now)
- {
- add[now]=;
- if (nowl==nowr)
- {
- sum[now]=num[rank1[nowl]];
- return ;
- }
- int mid=(nowl+nowr)>>;
- build(nowl,mid,now<<);
- build(mid+,nowr,now<<|);
- pushup(now);
- }
- void update(int nowl,int nowr,int now,int L,int R,int d)
- {
- if (nowl>=L && nowr<=R)
- {
- add[now]+=d;
- sum[now]+=d*(nowr-nowl+);
- return ;
- }
- pushdown(now,nowr-nowl+);
- int mid=nowl+nowr>>;
- if (L<=mid) update(nowl,mid,now<<,L,R,d);
- if (mid<R) update(mid+,nowr,now<<|,L,R,d);
- pushup(now);
- }
- int query(int nowl,int nowr,int now,int d)
- {
- int res();
- if (nowl==nowr)
- return sum[now];
- pushdown(now,nowr-nowl+);
- int mid=nowl+nowr>>;
- if (d<=mid) res=query(nowl,mid,now<<,d);
- else res=query(mid+,nowr,now<<|,d);
- pushup(now);
- return res;
- }
- void work(int x,int y,int val)
- {
- while (top[x]!=top[y])
- {
- if (dep[top[x]]<dep[top[y]])
- swap(x,y);
- update(,n,,pos[top[x]],pos[x],val);
- x=fa[top[x]];
- }
- if (dep[x]>dep[y])
- swap(x,y);
- update(,n,,pos[x],pos[y],val);
- }
- int main()
- {
- while (scanf("%d%d%d",&n,&m,&q)!=EOF && n+m+q)
- {
- init();
- for (int i=;i<=n;i++)
- scanf("%d",&num[i]);
- for (int i=;i<=m;i++)
- {
- scanf("%d%d",&u,&v);
- link(u,v);
- link(v,u);
- }
- dfs(,,);
- dfs2(,);
- build(,n,);
- while (q--)
- {
- scanf("%s",s);
- if (s[]=='I')
- {
- scanf("%d%d%d",&al,&ar,&ask);
- work(al,ar,ask);
- }
- else if (s[]=='D')
- {
- scanf("%d%d%d",&al,&ar,&ask);
- work(al,ar,-ask);
- }
- else
- {
- scanf("%d",&ask);
- printf("%d\n",query(,n,,pos[ask]));
- }
- }
- }
- return ;
- }
【hdu3966】Aragorn's Story的更多相关文章
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
随机推荐
- H5实现调用本地摄像头实现实时视频以及拍照功能
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 21反射、动态代理、枚举、Filter
2018/10/08 1.反射 Constructor Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Cla ...
- 【转】C语言中access函数
头文件:unistd.h 功 能: 确定文件或文件夹的访问权限.即,检查某个文件的存取方式,比如说是只读方式.只写方式等.如果指定的存取方式有效,则函数返回0,否则函数返回-1. 用 法: int a ...
- 19Spring返回通知&异常通知&环绕通知
在前置通知和后置通知的基础上加上返回通知&异常通知&环绕通知 代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interfa ...
- Volume 1. String(uva)
10361 - Automatic Poetry #include <iostream> #include <string> #include <cstdio> # ...
- virtualenvwrapper.sh: There was a problem running the initialization hooks. If Python could not import the module virtualenvwrapper.hook_loader, check that virtualenvwrapper.........(解决办法)
Linux(ubuntu)上python2与python3共存环境下,安装virtualenvwrapper后, 其环境变量被自动设置为VIRTUALENVWRAPPER_PYTHON=/usr/bi ...
- add list of symbols -- latex
* add list of symbols -- latexinclude a *toc.tex* file in the *main.tex* in *main.tex*#+BEGIN_SRC la ...
- 使用js生成条形码以及二维码
一.用js生成条形码这种业务场景不是很常见的,最近刚好又接到这种需求 Google一下,发现github还真有这方面的轮子,感谢github,省去了我们很多造轮子的过程, 好了言归正传,首先引入jsb ...
- Qt 编写应用支持多语言版本--一个GUI应用示例
简介 上一篇博文已经说过如何编写支持多语言的Qt 命令行应用,这一篇说说Qt GUI 应用多语言支持的坑. 本人喜欢用代码来写布局,而不是用 Qt Designer 来设计布局,手写布局比 Qt De ...
- 【Codeforces 1041D】Glider
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分. 枚举每一个上升区的起始位置作为起点(这样做肯定是最优的),然后如果没有掉在地上的话就尽量往右二分(只有上升区之间的间隙会让他往下掉) ...