BZOJ4034 T2
Description
有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:
Input
第一行包含两个整数 N, M 。表示点数和操作数。
Output
对于每个询问操作,输出该询问的答案。答案之间用换行隔开。
Sample Input
1 2 3 4 5
1 2
1 4
2 3
2 5
3 3
1 2 1
3 5
2 1 2
3 3
Sample Output
9
13
HINT
对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不
- //It is made by jump~
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <ctime>
- #include <vector>
- #include <queue>
- #include <map>
- #include <set>
- #ifdef WIN32
- #define OT "%I64d"
- #else
- #define OT "%lld"
- #endif
- using namespace std;
- typedef long long LL;
- const int MAXN = ;
- const int MAXM = ;
- int n,m;
- int ecnt,cnt;
- int first[MAXN],to[MAXM],next[MAXM],id[MAXN],pre[MAXN],last[MAXN],deep[MAXN],father[MAXN],size[MAXN],son[MAXN],top[MAXN];
- int num[MAXN];
- LL qx,qy;
- int ql,qr;
- LL ans;
- struct node{
- LL add;
- LL val;
- }t[MAXN*];
- inline int getint()
- {
- int w=,q=;
- char c=getchar();
- while((c<'' || c>'') && c!='-') c=getchar();
- if (c=='-') q=, c=getchar();
- while (c>='' && c<='') w=w*+c-'', c=getchar();
- return q ? -w : w;
- }
- inline void dfs1(int x,int fa) {
- size[x] = ;
- for(int i = first[x];i;i = next[i]) {
- int v = to[i];
- if(v != fa){
- father[v] = x; deep[v] = deep[x]+;
- dfs1(v,x);
- size[x] += size[v]; if(size[v] > size[son[x]]) son[x] = v;
- }
- }
- }
- inline void dfs2(int x,int fa){
- id[x] = ++cnt; pre[cnt]=x; if(son[x]!=) top[son[x]]=top[x],dfs2(son[x],x);
- for(int i = first[x];i;i = next[i]){
- int v = to[i];
- if(v != fa && v != son[x]) {
- top[v]=v;
- dfs2(v,x);
- }
- }
- last[x] = cnt;
- }
- inline void build(int root,int l,int r){
- if(l == r) { t[root].val = num[pre[l]]; return ; }
- int mid = (l + r)/; int lc = root*,rc = lc+;
- build(lc,l,mid); build(rc,mid+,r);
- t[root].val = t[lc].val + t[rc].val;
- }
- inline void update(int root,int l,int r){
- if(ql <= l && qr >= r) { t[root].add += qy; t[root].val += qy*(r-l+); }
- else{
- int mid = (l + r)/;
- int lc = root*,rc = lc + ;
- if(ql <= mid) update(lc,l,mid); if(qr > mid) update(rc,mid+,r);
- t[root].val = t[lc].val + t[rc].val;
- t[root].val += t[root].add*(r-l+);
- }
- }
- inline void query(int root,int l,int r,LL lei){
- if(ql <= l && qr >= r) {
- ans += t[root].val;
- ans += (LL)lei*(LL)(r-l+);
- return ;
- }
- int mid = (l+r)/; int lc = root*,rc = lc+;
- if(ql <= mid) query(lc,l,mid,lei+t[root].add); if(qr > mid) query(rc,mid+,r,lei+t[root].add);
- }
- inline void work(int x){
- ans=;
- int f1 = top[x];
- while(f1!=) {
- ql=id[f1]; qr=id[x];
- query(,,n,);
- x=father[f1]; f1=top[x];
- }
- ql=; qr=id[x]; query(,,n,);
- printf(OT"\n",ans);
- }
- inline void solve(){
- n = getint(); m = getint();
- for(int i=;i<=n;i++) num[i] = getint();
- int x,y;
- for(int i = ;i < n;i++) {
- x = getint(); y = getint();
- next[++ecnt] = first[x]; first[x] = ecnt; to[ecnt] = y;
- next[++ecnt] = first[y]; first[y] = ecnt; to[ecnt] = x;
- }
- deep[]=; dfs1(,);
- top[]=; dfs2(,);
- build(,,n);
- int ljh;
- for(int i = ;i <= m;i++) {
- ljh = getint();
- if(ljh == ){
- qx = id[getint()]; qy = getint();
- ql=qx; qr=qx;
- update(,,n);
- }
- else if(ljh == ){
- x = getint(); qy = getint();
- qr = last[x]; ql = id[x];
- update(,,n);
- }
- else{
- qx=getint(); work(qx);
- }
- }
- }
- int main()
- {
- solve();
- return ;
- }
BZOJ4034 T2的更多相关文章
- bzoj4034: [HAOI2015]T2
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2684 Solved: 843 Description 有一 ...
- 【BZOJ4034】T2(树链剖分)
题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- BZOJ4034——[HAOI2015]T2
1.题目大意:用一个数据结构支持树的点修改和子树修改.树上路径和 2.分析:树链剖分裸题 #include <cstdio> #include <cstdlib> #inclu ...
- [BZOJ4034] [HAOI2015] T2 (树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...
- 【DFS序】【线段树】bzoj4034 [HAOI2015]T2
分开维护树的入栈序和出栈序,用两棵线段树.回答时就是用一颗的减去另一棵的. #include<cstdio> #include<algorithm> using namespa ...
- 【bzoj4034】[HAOI2015]T2
siz[v]表示以v为根的子树的节点数 top[v]表示v所在的重链的顶端节点 fa[v]表示v的父亲 pos[v]表示v的父边标号 mx[v]表示v的子树中边的标号最大的那条边 参考:http:// ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- [Noip2016]蚯蚓 D2 T2 队列
[Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...
- T2 Func<in T1,out T2>(T1 arg)
委托调用方法的4种方式. using System; using System.Collections.Generic; namespace ConsoleApplication1 { delegat ...
随机推荐
- HUDSON(Java开发的一种持续集成工具)
Hudson是Jenkins的前身,是基于Java开发的一种持续集成工具,用于监控程序重复的工作,包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. Hudson的特性 1.易于 ...
- 转:CentOS设置时区
from: http://os.51cto.com/art/201004/192805.htm 建议直接使用: 1. session 临时修改查看: tzselect. 然后数字键入,回车 2. 永久 ...
- 解决Gradle DSL method not found: ‘android()’
最近导入as的项目出了这样的问题 这个问题困扰了我很长时间,好吧,搜了半天全都是runProguard的,最后在stackoverflow上搜到解决办法了: http://stackoverflow. ...
- 【转】MySQL 性能优化的最佳20多条经验分享
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操 ...
- sed 4个功能
[root@lanny test]# cat test.txt test liyao lanny 经典博文: http://oldboy.blog.51cto.com/2561410/949365 h ...
- Linux 守护进程二(激活守护进程)
//守护进程--读文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- Gruntjs: task之文件映射
由于大多数的任务执行文件操作,Grunt提供了一个强大的抽象声明说明任务应该操作哪些文件.这里总结了几种src-dest(源文件-目标文件)文件映射的方式,提供了不同程度的描述和控制操作方式. 1. ...
- 记录毕业论文 LanguageTool 二次开发时用到的网站
LanguageTool Development LanguageTool Supported Languages Share your knowledge about LT - LanguageTo ...
- [转]MySQL Explain详解
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...
- 【WEB前端经验之谈】时间一年半,或沉淀、或从零开始。
距上次写博客还是有点久了,中间有个写的念头,不过由于不知道写什么也就放弃了. 14年4月份第一份前端工作到现在也有一年半之久了,自己对前端的热爱相对于一年前是有过之而无不及.一年半的时间里自己也成长了 ...