迷之TLE

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define LL long long
using namespace std;
const int MAXN=50005;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
int head[MAXN],pos[MAXN],top[MAXN],dep[MAXN],fa[MAXN],siz[MAXN],wei[MAXN],wein[MAXN],ind,id[MAXN],son[MAXN],nume,n,m,root;
struct edge{
int to,nxt;
}e[MAXN<<1];
void adde(int from,int to){
e[++nume].to=to;
e[nume].nxt=head[from];
head[from]=nume;
}
void dfs1(int u,int rt){
dep[u]=dep[rt]+1;
fa[u]=rt;
siz[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==rt) continue;
dfs1(v,u);
int ma=0;
siz[u]+=siz[v];
if(siz[v]>ma){
ma=siz[v];
son[u]=v;
}
}
}
void dfs2(int u,int topf){
top[u]=topf;
id[u]=++ind;
wein[ind]=wei[u];
if(!son[u]) return ;
dfs2(son[u],topf);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
struct SGT{
int maxa[MAXN<<2],sum[MAXN<<2];
void PushUp(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
maxa[rt]=max(maxa[rt<<1],maxa[rt<<1|1]);
}
void build(int l,int r,int rt){
if(l==r){
sum[rt]=wein[l];
maxa[rt]=wein[l];
pos[l]=rt;
return ;
}
int mid=(l+r)>>1;
if(l<=mid) build(lson);
if(mid<r) build(rson);
PushUp(rt);
}
void Update(int po,int add,int l,int r,int rt){
if(l==r&&l==po){
sum[rt]+=add;
maxa[rt]=sum[rt];
return;
}
int mid=(l+r)>>1;
if(po<=mid) Update(po,add,lson);
else Update(po,add,rson);
PushUp(rt);
}
int QueryS(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int mid=(l+r)>>1;
int ret=0;
if(L<=mid) ret+=QueryS(L,R,lson);
if(mid<R) ret+=QueryS(L,R,rson);
return ret;
}
int QueryM(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return maxa[rt];
}
int mid=(l+r)>>1;
int ma=-0x3f3f3f3f;
if(L<=mid) ma=max(ma,QueryM(L,R,lson));
if(mid<R) ma=max(ma,QueryM(L,R,rson));
return ma;
}
}sgt;
int QuerySRange(int u,int v){
int ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=sgt.QueryS(id[top[u]],id[u],1,n,1);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ans+=sgt.QueryS(id[u],id[v],1,n,1);
return ans;
}
int QueryMRange(int u,int v){
int ma=-0x3f3f3f3f;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ma=max(ma,sgt.QueryM(id[top[u]],id[u],1,n,1));
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ma=max(ma,sgt.QueryM(id[u],id[v],1,n,1));
return ma;
}
int main(){
n=init();
for(int i=1;i<n;i++){
int u=init(),v=init();
adde(u,v);adde(v,u);
}
for(int i=1;i<=n;i++) wei[i]=init();
dep[1]=1;
dfs1(1,0);
dfs2(1,1);
sgt.build(1,n,1);
m=init();
char s[15];
for(int i=1;i<=m;i++){
scanf("%s",s);
int len=strlen(s);
int a=init(),b=init();
if(s[1]=='H'){
int t=b-sgt.sum[pos[id[a]]];
sgt.Update(id[a],t,1,n,1);
}else if(s[3]=='X'){
printf("%d\n",QueryMRange(a,b));
}else printf("%d\n",QuerySRange(a,b));
}
return 0;
}

洛谷 [P2590] 树的统计的更多相关文章

  1. 树链剖分【洛谷P2590】 [ZJOI2008]树的统计

    P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...

  2. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)

    P2590 [ZJOI2008]树的统计 I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问 ...

  3. 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]

    题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...

  4. 洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]: ...

  5. BZOJ1058或洛谷1110 [ZJOI2007]报表统计

    BZOJ原题链接 洛谷原题链接 STL 本题可以直接使用\(\mathtt{STL\ multiset}\)水过去. 因为本题插入数的操作实际上就是将原数列分为\(n\)段,在每一段的末尾插入数,所以 ...

  6. 洛谷P2879 [USACO07JAN]区间统计Tallest Cow

    To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. ...

  7. 【洛谷p5015】标题统计

    (写上瘾了再来一篇吧) 标题统计[传送门] 洛谷算法标签 字符串这种东西,我看到是崩溃的.因为我们只学到了二维数组[这个梗自行get],总之我们当时还没有学.然后显然就是各种翻书,各种百度.大致了解了 ...

  8. 【算法学习】【洛谷】树链剖分 & P3384 【模板】树链剖分 P2146 软件包管理器

    刚学的好玩算法,AC2题,非常开心. 其实很早就有教过,以前以为很难就没有学,现在发现其实很简单也很有用. 更重要的是我很好调试,两题都是几乎一遍过的. 介绍树链剖分前,先确保已经学会以下基本技巧: ...

  9. 洛谷P3384 树链剖分

    如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x ...

随机推荐

  1. BZOJ3997: [TJOI2015]组合数学(网络流)

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 405  Solved: 284[Submit][Status ...

  2. js onclick传递 对象

    在html onclick中如果参数直接传递一个参数js会报错. 如果想要onclick传递参数需要这么做: var user = {id:1, name:'hk'}; var ele = '< ...

  3. javascript数据类型之Array类型

    Array类型 除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了.而且,ECMAScript中的数组与其他多数语言中的数组有着相当大的区别.虽然ECMAScript数组与 ...

  4. 如何初始化grunt

    为什么使用任务运行工具Grunt -- 官方解释 简而言之,自动化.当你处理诸如代码最小化, 代码编译, 单元测试, 代码规范校验等等重复任务时, 你必须要做的工作越少,你的工作就变得越简单.在你完成 ...

  5. How to find missing USB Records?

    In my previously article "EnCase missed some USB activities in the evidence files", I ment ...

  6. windows下安装redis3.2.100单机和集群详解

    下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases 我下载的是3.2.100版本的Redis-x64-3.2.100.zip ...

  7. 单独编译IMX6Q的VPU示例程序:mxc_vpu_test.out

    mxc_vpu_test.out是飞思卡尔为IMX6Q编写的VPU示例程序,有编解码和简单的网络传输功能. 首先从/opt/freescale/pkgs/中提取出imx-test-3.0.35-4.1 ...

  8. Mac OS启动服务优化高级篇

    一.Mac下的启动服务主要三个可配置的地方 1.系统偏好设置->帐户->登陆项 2./System/Library/StartupItems 和 /Library/StartupItems ...

  9. ios开发-第二天

    1.#import可保证无论头文件出现多少次,只包含一次,而#include相反. 2.如果用户不提供文件路径的话,那么argc的值为1,可以用来做是否错误的判断. 3.面向对象和面向过程的区别 面向 ...

  10. mybatis_helloworld(2)_源码

    摘录自:http://blog.csdn.net/y172158950/article/details/16982123 在helloworld(1)中,分析了insert一条数据的流程,现在分析下源 ...