Time limit 10000 ms//另外,BZOJ只算所有点的总时限,所以可能会放过一些原本会TLE的代码

Memory limit 165888 kB

OS Linux

SourceZJOI2008

吐槽

时隔两年再次写树剖,跟楞半岛,找bug找得想吐,被卡题惨烈程度堪比这次——[HAOI2015]树上操作

这题被卡的地方在于,单点修改的时候,树上节点的老id没有变成新id,就拿到线段树上做修改了……卡了两天,拿lemon在本地一遍又一遍测试,没有去oj上交,不然有卡评测的嫌疑……

顺便,win10下栈空间好小,4号点、7号点、9号点树比较深,甚至是链,于是win10下跑dfs就给爆栈了,甚至加了#pragma comment(linker,"/STACK:1024000000,1024000000") 也不行(权限不够?)。

这篇博客纯属纪念。

板子题没有解题思路

源代码

#include<cstdio>
#include<algorithm> int n,q; struct Edge{
int nxt,to;
}e[60010];
int head[30010],cnt=1;
void add(int u,int v)
{
e[cnt]={head[u],v};
head[u]=cnt++;
e[cnt]={head[v],u};
head[v]=cnt++;
}
struct Tree{
long long w;
int fa,dep,sz,wson,top,id;
}t[30010];
void dfs1(int u,int fa)
{
t[u].fa=fa;
t[u].dep=t[fa].dep+1;
t[u].sz=1;
t[u].wson=0;
int maxn=0;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa) continue;
dfs1(v,u);
int temp=t[v].sz;
t[u].sz+=temp;
if(temp>maxn)
{
t[u].wson=v;
maxn=temp;
}
}
}
int id=1;
long long a[30010];
void dfs2(int u,int top)
{
t[u].top=top;
t[u].id=id;
a[id]=t[u].w;
id++;
if(!t[u].wson) return;
dfs2(t[u].wson,top);
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==t[u].fa||v==t[u].wson) continue;
dfs2(v,v);
}
}
struct SegTree{
int l,r;
long long sum,mx;
}s[120010];
inline void pushup(int x)
{
s[x].sum=s[x<<1].sum+s[x<<1|1].sum;
s[x].mx=std::max(s[x<<1].mx,s[x<<1|1].mx);
}
void build(int x,int l,int r)
{
s[x].l=l;
s[x].r=r;
if(l==r)
{
s[x].mx=s[x].sum=a[l];
return;
}
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
void update(int x,int pos,long long k)
{
if(s[x].l==s[x].r&&s[x].l==pos)
{
s[x].mx=s[x].sum=k;
return;
}
int mid=s[x].l+s[x].r>>1;
if(pos<=mid) update(x<<1,pos,k);
else update(x<<1|1,pos,k);
pushup(x);
}
long long quemx(int x,int l,int r)
{
if(l<=s[x].l&&s[x].r<=r) return s[x].mx;
int mid=s[x].l+s[x].r>>1;
long long ans=-1e9;
if(l<=mid) ans=std::max(ans,quemx(x<<1,l,r));
if(r>mid) ans=std::max(ans,quemx(x<<1|1,l,r));
return ans;
}
long long quesum(int x,int l,int r)
{
if(l<=s[x].l&&s[x].r<=r) return s[x].sum;
int mid=s[x].l+s[x].r>>1;
long long ans=0;
if(l<=mid) ans+=quesum(x<<1,l,r);
if(r>mid) ans+=quesum(x<<1|1,l,r);
return ans;
}
inline void change(int pos,long long k)
{
update(1,t[pos].id,k);//就是这里,我之前写成了update(1,pos,k);
}
long long qmax(int u,int v)
{
long long ans=-99999999;
while(t[u].top!=t[v].top)
{
if(t[t[u].top].dep<t[t[v].top].dep) std::swap(u,v);
ans=std::max(ans,quemx(1,t[t[u].top].id,t[u].id));
u=t[t[u].top].fa;
}
if(t[u].id>t[v].id) std::swap(u,v);
ans=std::max(ans,quemx(1,t[u].id,t[v].id));
return ans;
}
long long qsum(int u,int v)
{
long long ans=0;
while(t[u].top!=t[v].top)
{
if(t[t[u].top].dep<t[t[v].top].dep) std::swap(u,v);
ans+=quesum(1,t[t[u].top].id,t[u].id);
u=t[t[u].top].fa;
}
if(t[u].id>t[v].id) std::swap(u,v);
ans+=quesum(1,t[u].id,t[v].id);
return ans;
} int main()
{
//freopen("test.in","r",stdin);
scanf("%d",&n);
for(int i=1,u,v;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++) scanf("%lld",&t[i].w);
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
scanf("%d",&q);
while(q--)
{
char opt[20]={0};
int x,y;
scanf("%s%d%d",opt,&x,&y);
if(opt[1]=='H') change(x,(long long)y);
else if(opt[1]=='M') printf("%lld\n",qmax(x,y));
else printf("%lld\n",qsum(x,y));
}
}

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

  1. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  2. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  3. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 14354  Solved: 5802 [Subm ...

  4. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  5. Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 11102  Solved: 4490[Submit ...

  6. 数据结构(LCT动态树):BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 12266  Solved: 4945[Submit ...

  7. BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )

    树链剖分... 不知道为什么跑这么慢 = = 调了一节课啊跪.. ------------------------------------------------------------------- ...

  8. bzoj 1036: [ZJOI2008]树的统计Count 树链剖分+线段树

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 16294  Solved: 6645[Submit ...

  9. bzoj 1036: [ZJOI2008]树的统计Count (树链剖分+线段树 点权)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 21194  Solved: 8589[Submit ...

随机推荐

  1. 【BZOJ2622】[2012国家集训队测试]深入虎穴

    虎是中国传统文化中一个独特的意象.我们既会把老虎的形象用到喜庆的节日装饰画上,也可能把它视作一种邪恶的可怕的动物,例如“武松打虎”或者“三人成虎”.“不入虎穴焉得虎子”是一个对虎的威猛的形象的极好体现 ...

  2. selenium:css_selector定位详解(css selector和xpath的比较)

    selenium使用css selector和xpath的比较 selenium提供的定位方式(常用) ID NAME CLASS CSS SELECTOR XPATH   推荐的定位方式的优先级 优 ...

  3. netcore 使用redis session 分布式共享

    首先准备redis服务器(docker 和redis3.0内置的哨兵进行高可用设置) 网站配置Redis作为存储session的介质(配置文件这些略).然后可以了解一下MachineKey这个东西.( ...

  4. java中的命名规则

    转载自:http://growstep.diandian.com/post/2011-08-17/3989094 1.类名首字母应该大写.属性(成员变量).方法.对象变量以及所有标识符(如形式参数.实 ...

  5. Javascript实现的图片隐写术

    javascript图片隐写术,感觉可以用它来干点有想法的事情   1.什么是图片隐写术? 权威的wiki说法是“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人 ...

  6. 红帽学习笔记[RHCSA] 第九课[文件归档、硬盘、分区以及自动挂载、Swap、链接]

    文件归档 tar是什么 通过tar命令可以将大型文件汇集成一个文件(归档),注意没有压缩功能. 压缩方式 gzip 通过gzip过滤文档,使用最广泛 bzip2 通常比gzip压缩小,但是不如gzip ...

  7. java学习day1

    一.常用的DOS命令 1.打开cmd 窗口键+r --> 输入cmd --> 确认 2.常用的dos命令 dir:列出当前目录下的所有文件及文件夹 md:创建一个新的目录 rd:删除目录 ...

  8. 一个简单的Vue.js组件开发示例

    //创建属于自己的vue组件库 (function(Vue, undefined) { Vue.component("my-component", { template: '< ...

  9. QRCode.js一个生成二维码的javascript库

    前言 最近在开发中遇到一个需求:将后端返回的链接转换成二维码,那么如何来实现呢?我们可以使用QRCode.js来解决这一问题 什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 ...

  10. luogu P1399 [NOI2013]快餐店

    传送门 注意到答案为这个基环树直径\(/2\) 因为是基环树,所以考虑把环拎出来.如果直径不过环上的边,那么可以在环上每个点下挂的子树内\(dfs\)求得.然后如果过环上的边,那么环上的部分也是一条链 ...