JZYZOJ1539[haoi2015]T2 树链剖分
http://172.20.6.3/Problem_Show.asp?id=1539
在学校的OJ又写了一次,RE了好多次,原来haoi的时候这道题需要开栈+快读,裸数据结构30分,加上快读50分。
oi考试的时候原来不能汇编开栈,只能写手工栈orz(递归变循环那种),学长说当时省选最高分50,本来以为很简单的题没想到这么套路。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define lc x*2
#define rc x*2+1
const int maxn=;
int n,m;
long long a[maxn]={};
struct nod{
int y,next;
}e[maxn*];
int head[maxn]={},tot=;
long long fa[maxn]={},dep[maxn]={},siz[maxn]={};
long long kid[maxn]={},top[maxn]={},val[maxn]={};
struct seg{
long long l,r,v,w,siz;
seg(){l=r=v=w=siz=;}
}t[maxn*];
void init(long long x,long long y){
e[++tot].y=y;e[tot].next=head[x];head[x]=tot;
}
int build1(int x,int pa){
int y,hug=,si,tsn=;fa[x]=pa;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
if(y==pa)continue;
si=build1(y,x);tsn+=si;
if(si>hug)hug=si,kid[x]=y;
}return siz[x]=tsn;
}
void build2(int x,int pa){
int y;dep[x]=++tot;top[x]=pa;
val[dep[x]]=a[x];
if(kid[x])build2(kid[x],pa);
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
if(y==kid[x]||y==fa[x])continue;
build2(y,y);
}
}
void pushup(int x){
if(t[x].siz>)t[x].v=t[lc].v+t[rc].v;
t[x].v+=t[x].w*t[x].siz;
}
void build(int x,int l,int r){
t[x].r=r;t[x].l=l;t[x].siz=r-l+;
if(l==r){t[x].v=val[l];return;}
int mid=(l+r)/;
build(lc,l,mid);
build(rc,mid+,r);
pushup(x);
}
void add(int x,int l,int r,long long w){
if(l<=t[x].l&&t[x].r<=r){
if(t[x].l==t[x].r)t[x].v+=w;
else t[x].w+=w;pushup(x);
return;
}
int mid=(t[x].l+t[x].r)/;
if(l<=mid)add(lc,l,r,w);
if(r>mid)add(rc,l,r,w);
pushup(x);
}
long long sum(int x,int l,int r,long long w){
if(l<=t[x].l&&t[x].r<=r){
return t[x].v+t[x].siz*w;
}
int mid=(t[x].l+t[x].r)/;long long ans=;
if(l<=mid)ans+=sum(lc,l,r,w+t[x].w);
if(r>mid)ans+=sum(rc,l,r,w+t[x].w);
return ans;
}
long long doit(int x){
int a=top[x];long long ans=;
while(a!=){
ans+=sum(,dep[a],dep[x],);
x=fa[a];a=top[x];
}
ans+=sum(,dep[a],dep[x],);
return ans;
}
long long read(){
char ch=getchar();long long x=,f=;
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x*=;x+=ch-'';ch=getchar();}
return x*f;
}
int main(){
//freopen("wtf.in","r",stdin);
int size = << ; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));
n=read();m=read();int x,y,v;
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<n;i++){x=read();y=read();init(x,y);init(y,x);}
tot=;build1(,);build2(,);
build(,,n);
for(int i=;i<=m;i++){
scanf("%d",&v);
if(v==){
scanf("%d%d",&x,&y);
add(,dep[x],dep[x],y);
}
else if(v==){
scanf("%d%d",&x,&y);
add(,dep[x],dep[x]+siz[x]-,y);
}
else{
scanf("%d",&x);
printf("%I64d\n",doit(x));
}
}
return ;
}
JZYZOJ1539[haoi2015]T2 树链剖分的更多相关文章
- Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1841 Solved: 598[Submit][Status] ...
- BZOJ 4034: [HAOI2015]T2( 树链剖分 )
树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...
- [BZOJ4034] [HAOI2015] T2 (树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- BZOJ 4034 [HAOI2015]T2(树链剖分)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4034 [题目大意] 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 有 M 个 ...
- bzoj4034[HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6163 Solved: 2025[Submit][Stat ...
- bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4352 Solved: 1387[Submit][Stat ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- [HAOI2015]树上操作(树链剖分)
[HAOI2015]树上操作(luogu) Description 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增 ...
随机推荐
- UIView显示时遮挡导航栏的方法
[self.navigationController.view:addSubview];
- Mac 上真机调试cocos2d-x-3.16的test程序
文章比较长,一个算是新手又不是新手的程序员的解决过程. 一 xcode中打开项目 首先,下载完成cocos2d-x-3.16之后,解压,然后在根目录build目录下双击cocos2d_tests.xc ...
- Fiddler-- 安装HTTPs证书
1. 现在很多带有比较重要信息的接口都使用了安全性更高的HTTPS,而Fiddler默认是抓取HTTP类型的接口,要想查看HTTPS类型接口就需要安装fiddler证书. 2.打开Fiddler, ...
- Perl6 Bailador框架(4):路径匹配
use v6; use Bailador; =begin pod /:one/:two/:....路径选择 这个路径, 用/分隔 每个/分隔一个, 如果你只设置两个(/admin/login),时, ...
- static class 和 non static class 的区别
static class non static class 1.用static修饰的是内部类,此时这个 内部类变为静态内部类:对测试有用: 2.内部静态类不需要有指向外部类的引用: 3.静态类只能访问 ...
- TCP之非阻塞connect和accept
套接字的默认状态是阻塞的,这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待响应操作完成,可能阻塞的套接字调用可分为以下四类: (1) 输入操作,包括read,readv,rec ...
- centos_7.1.1503_src_4
http://vault.centos.org/7.1.1503/os/Source/SPackages/ libkcompactdisc-4.10.5-3.el7.src.rpm 05-Jul-20 ...
- Centos_Lvm_Create pv vg lv and mount
re-scan new disks without restarting CentOS re-scan new disks(/dev/sdc): #ls /sys/class/scsi_host/ h ...
- 可以高度定制的代理服务器anyproxy
简介 anyproxy是一款可以高度定制的代理服务器,基于nodejs. 特征 支持https明文代理 支持低网速模拟 支持二次开发,可以用javascript控制代理的全部流程,搭建前端个性化调试环 ...
- elasticsearch简单查询
elasticsearch简单查询示例: { "from": "0", //分页,从第一页开始 "size": "10" ...