BZOJ1036 (其实这只是一份板子)
我说我是不是完蛋了啊... ...昨天考试线段树写错,调了好久才调回来;今天做这道树链剖分辣鸡操作题,TM写错了4个地方!先是建树为了省常数打了一个build结果初值赋错了,然后又是线段树!getmax和getsum错的还不是一个地方!最后我发现update赋的不是dfn[x]而是x!再这样下去我是不是有一天连for循环都不会打了啊!!!
好吧我是用Windows的Devcpp写的,丑了一点啊。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
const int N = 30010;
struct Node{int to,next;}E[N<<1];
int n,m,fa[N],top[N],val[N],T[N<<4],T2[N<<4],son[N],size[N],rec[N],dfn[N],tot,dep[N],num,head[N];
inline int gi()
{
int x=0,res=1;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')res=-res;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*res;
}
inline void link(int u,int v)
{
E[++tot]=(Node){v,head[u]};head[u]=tot;
E[++tot]=(Node){u,head[v]};head[v]=tot;
}
inline void dfs1(int x,int fat)
{
dep[x]=dep[fat]+1;
fa[x]=fat;size[x]++;
for(int e=head[x];e;e=E[e].next)
{
if(E[e].to==fat)continue;
dfs1(E[e].to,x);size[x]+=size[E[e].to];
if(size[E[e].to]>size[son[x]])son[x]=E[e].to;
}
}
inline void dfs2(int x,int tp)
{
top[x]=tp;dfn[x]=++num;rec[num]=x;
if(!son[x])return;
dfs2(son[x],tp);
for(int e=head[x];e;e=E[e].next)
if(E[e].to!=fa[x]&&E[e].to!=son[x])
dfs2(E[e].to,E[e].to);
}
inline void build(int x,int l,int r)
{
if(l==r){T2[x]=T[x]=val[rec[l]];return;}
int mid=(l+r)>>1;
build(ls,l,mid);build(rs,mid+1,r);
T2[x]=T2[ls]+T2[rs];T[x]=max(T[ls],T[rs]);
}
inline int gc()
{
char ch=getchar();
while(ch<'A'||ch>'Z')ch=getchar();
if(ch=='C')return 1;if(ch=='Q')ch=getchar();
if(ch=='M')return 2;if(ch=='S')return 3;
}
inline void update(int x,int l,int r,int xp,int v)
{
if(l==r){T[x]=T2[x]=v;return;}
int mid=(l+r)>>1;
if(xp<=mid)update(ls,l,mid,xp,v);
else update(rs,mid+1,r,xp,v);
T2[x]=T2[ls]+T2[rs];T[x]=max(T[ls],T[rs]);
}
inline int getmax(int x,int l,int r,int xl,int xr)
{
if(xl<=l && r<=xr)return T[x];
int mid=(l+r)>>1;
if(xr<=mid)return getmax(ls,l,mid,xl,xr);
else if(xl>mid)return getmax(rs,mid+1,r,xl,xr);
return max(getmax(ls,l,mid,xl,mid),getmax(rs,mid+1,r,mid+1,xr));
}
inline int gmax(int u,int v)
{
int Ans=-N*N;
while(top[u]^top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
Ans=max(Ans,getmax(1,1,n,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dep[u]<dep[v])swap(u,v);
Ans=max(Ans,getmax(1,1,n,dfn[v],dfn[u]));
return Ans;
}
inline int getsum(int x,int l,int r,int xl,int xr)
{
if(xl<=l && r<=xr)return T2[x];
int mid=(l+r)>>1;
if(xr<=mid)return getsum(ls,l,mid,xl,xr);
else if(xl>mid)return getsum(rs,mid+1,r,xl,xr);
else return getsum(ls,l,mid,xl,mid)+getsum(rs,mid+1,r,mid+1,xr);
}
inline int gsum(int u,int v)
{
int Ans=0;
while(top[u]^top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
Ans+=getsum(1,1,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(dep[u]<dep[v])swap(u,v);
Ans+=getsum(1,1,n,dfn[v],dfn[u]);
return Ans;
}
int main()
{
n=gi();
for(int i=1;i<n;++i)link(gi(),gi());
for(int i=1;i<=n;++i)val[i]=gi();
dfs1(1,1);dfs2(1,1);build(1,1,n);m=gi();
while(m--)
{
int type=gc(),x=gi(),y=gi();
switch(type)
{
case 1:{update(1,1,n,dfn[x],y);break;}
case 2:{printf("%d\n",gmax(x,y));break;}
case 3:{printf("%d\n",gsum(x,y));break;}
default:{break;}
}
}
}
BZOJ1036 (其实这只是一份板子)的更多相关文章
- LCA 笔记
简述这几天的LCA 心得: LCA有两种做法:离线 or 在线 先学的离线: 原理博客很多. 我写得两道题,已经模板. HDU:http://acm.hdu.edu.cn/showproblem.ph ...
- Linux内核剖析(四)为arm内核构建源码树
前面说到要做linux底层开发或者编写Linux的驱动,必须建立内核源码树,之前我们提到过在本机上构建源码树—-Linux内核剖析(三),其建立的源码树是针对i686平台的,但是我么嵌入式系统用的是a ...
- 2016级算法第一次练习赛-C.斐波那契进阶
870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的. ...
- petrozavodsk summer 2018 游记&&总结
day0: 出发前训了一场比较水bapc2017保持手感(恢复信心),成功AK了,不过罚时略高.然后三人打车从紫金港到杭州东站,坐高铁到上海虹桥,再坐机场快线到浦东机场(傻乎乎的jsb帮爸爸付了钱,然 ...
- HNOI2004 郁闷的出纳员(Splay)
郁闷的出纳员 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的 ...
- Data Center Maintenance CodeForces - 950E
http://codeforces.com/contest/950/problem/E 贴一份板子 #include<cstdio> #include<vector> #inc ...
- CSPS2019谢幕记
留坑待填. 开始填坑. Day -1 最后一场模拟题.T1花2h切掉,T2啥都不会,T3看出部分解法然后写了暴搜,教练没放子任务,得了45,然后就$rk3$了. 晚上疯狂写板子,1.5h写了8份板子. ...
- JSOI(联合省选)2021 划水记
流水账. Day 0 18:10 去本部拿准考证,结果发现已经没有人了./ruo 敲了几份板子,很早就去睡觉了. Day 1 7:30 到 NFLS 拿到准考证,几乎没有人来.于是做起了政治作业. 然 ...
- splay好板子
找到一份比较好的板子,链接https://blog.csdn.net/crazy_ac/article/details/8034190 #include<cstdio> #include& ...
随机推荐
- 安卓自定义控件(二)BitmapShader、ShapeDrawable、Shape
第一篇博客中,我已经Canvas.Paint.Shader.Xfermode这些对象做了总结,而现在这篇文章主要介绍BitmapShader位图渲染,Xfermode如何实际应用,还有形状的绘制.不过 ...
- Spring Boot 的Maven多模块开发web项目使用外部容器进行部署
Spring Boot中自带有Tomcat容器,因此Spring Boot项目只需要运行main函数,就可以运行,但是以往的web项目,我们习惯于使用自己安装的Tomcat运行或者使用Tomcat.J ...
- 编译虚拟机jvm——openjdk的编译
java只所以被推广,实际上很大原因是因为本身是跨平台的,很大作用是因为虚拟机的关系. 一般情况下开发人员不需要关注虚拟机内部实现就可以日常开发了,但是有时候涉及到性能的时候就需要了解虚拟机的实现机制 ...
- 状态机编程思想(2):删除代码注释(目前支持C/C++和Java)
有时为了信息保密或是单纯阅读代码,我们常常需要删除注释. 之前考虑过正则表达式,但是感觉实现起来相当麻烦.而状态机可以把多种情况归为一类状态再行分解,大大简化问题.本文就是基于状态机实现的. 删除C/ ...
- js 事件冒泡和事件捕获
事件流:指的是网页中元素接受事件的顺序,它是一个概念,而不是具体的实际的东西 事件冒泡:指的是内层元素的事件,会触发包含着此元素的外层元素的事件,触发的顺序是:由内而外的 例如: <!DOCTY ...
- selenium与表格的二三事
今天遇到的问题是selenium与表格中行和列的问题! 我想要做的事情是统计当前的table有多少行,表格形式如下如所示: 图中所示为2行,我的定位方式是这样的 : table=driver.find ...
- Innodb中的锁
Innodb中的锁 共享锁和排它锁(Shared and Exclusive Locks)共享锁和排它锁是行级锁,有两种类型的行级锁 共享锁(s lock)允许持有锁的事务对行进行读取操作 排它锁(x ...
- C#在自定义事件里传递自定义数据,使用EventArgs的姿势
EventArgs是包含事件数据的类的基类,用于传递事件的细节.今天分享的是使用泛型来约束EventArgs,在事件里传递自定义数据的例子. 正题 由于这个关注点很小,直接上代码了. 定义泛型类TEv ...
- javaweb学习总结(七)——HttpServletResponse对象(一)(转)
转载自 http://www.cnblogs.com/xdp-gacl/p/3789624.html Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对 ...
- 安装cuda8.0中所遇到的问题-解决办法
正是申请季高峰,但还是被老师抓着干活.之前一直以为cuda已经装好,才知道是骗自己的.我的显卡是640,ubuntu14.4, 比较low. 我是按照这个教程走的,http://m.blog.csdn ...