迷之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. 2017ecjtu-summer training # 11 POJ 2492

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 38280   Accepted: 12452 D ...

  2. 移动App,AJAX异步请求,实现简单的增、删、改、查

    用ajax发异步请求时,要注意url."AppServer"为后台项目名,"LoginServlet.action"为web.xml中的<url-patt ...

  3. visual studio添加lib库

    方法1: 通过设置工程配置来添加lib库. A.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录. B.添加文件引用的lib静态库路径 ...

  4. [国嵌攻略][061][2440LCD驱动设计]

    LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...

  5. Spark算子--join

      join--Transformation类算子 代码示例 result  

  6. vuethink 在本地没问题,在服务器报错 , php5.6与php5.5之间的大坑

    将环境换为php5.6即可

  7. .32-浅析webpack源码之doResolve事件流(4)

    流程图如下: 重回DescriptionFilePlugin 上一节最后进入relative事件流,注入地点如下: // relative plugins.push(new DescriptionFi ...

  8. NPM使用命令总结

    NPM使用命令总结 npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm ...

  9. UML图学习之二 类图

    类图(ClassDiagrams)是根据系统中的类以及各类之间的关系描述系统的静态视图.类图不仅显示系统内信息的结构,还描述系统内这些信息的行为.类图的一个重要目的是为其他图(如顺序图.交互图)定义一 ...

  10. js 原型 对象篇

    一切皆对象 js中  值类型就不是对象  剩下的都是对象(也就是引用类型) typeof()运算符 判断四种值类型 typeof 10; --> Number  ||   typeof &quo ...