博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4817: [Sdoi2017]树点涂色(lct+线段树)
阅读量:4496 次
发布时间:2019-06-08

本文共 2182 字,大约阅读时间需要 7 分钟。

解题思路

  跟这道题很像。只是有了一个询问\(2\)的操作,然后询问\(2\)的答案其实就是\(val[x]+val[y]-2*val[lca(x,y)]+1\)(画图理解)。剩下的操作跟那道题就一样了。

代码

#include
#include
#include
#include
#include
#include
using namespace std;const int MAXN = 100005;inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x;}int n,m,head[MAXN],cnt,to[MAXN<<1],nxt[MAXN<<1];int dep[MAXN],siz[MAXN],fa[MAXN],Fa[MAXN],L[MAXN];int top[MAXN],id[MAXN],wt[MAXN],num,son[MAXN];int Max[MAXN<<2],ll[MAXN],tag[MAXN<<2];inline int max(int x,int y){ return x>y?x:y;}inline void add(int bg,int ed){ to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;}void dfs1(int x,int f,int d){ fa[x]=f;siz[x]=1;dep[x]=d;ll[x]=x;Fa[x]=f; int maxson=-1,u; for(int i=head[x];i;i=nxt[i]){ u=to[i];if(u==f) continue; dfs1(u,x,d+1);siz[x]+=siz[u]; if(siz[u]>maxson) {maxson=siz[u];son[x]=u;} }}void dfs2(int x,int topf){ top[x]=topf;id[x]=++num;wt[num]=dep[x]; if(!son[x]) return;dfs2(son[x],topf);int u; for(int i=head[x];i;i=nxt[i]){ u=to[i];if(u==son[x] || u==fa[x]) continue; dfs2(u,u); }}inline void pushdown(int x){ Max[x<<1]+=tag[x];Max[x<<1|1]+=tag[x]; tag[x<<1]+=tag[x];tag[x<<1|1]+=tag[x]; tag[x]=0;}void build(int x,int l,int r){ if(l==r) {Max[x]=wt[l];return;}int mid=(l+r)>>1; build(x<<1,l,mid);build(x<<1|1,mid+1,r); Max[x]=max(Max[x<<1],Max[x<<1|1]);}void update(int x,int l,int r,int L,int R,int k){ if(L<=l && r<=R) { Max[x]+=k;tag[x]+=k; return ; }int mid=(l+r)>>1;if(tag[x]!=0) pushdown(x); if(L<=mid) update(x<<1,l,mid,L,R,k); if(mid
dep[top[y]]) x=Fa[top[x]]; else y=Fa[top[y]]; } return dep[x]
>1;if(tag[x]!=0) pushdown(x); if(L<=mid) return query(x<<1,l,mid,L); else return query(x<<1|1,mid+1,r,L);}inline int qRange(int x,int y){ return query(1,1,n,id[x])+query(1,1,n,id[y])-2*query(1,1,n,id[lca(x,y)])+1;}int query_max(int x,int l,int r,int L,int R){ if(L<=l && r<=R) return Max[x]; int mid=(l+r)>>1,ret=0;if(tag[x]!=0) pushdown(x); if(L<=mid) ret=max(ret,query_max(x<<1,l,mid,L,R)); if(mid

转载于:https://www.cnblogs.com/sdfzsyq/p/10032962.html

你可能感兴趣的文章
[SimplePlayer] 6. 音频同步
查看>>
把一个SVN项目的目录结构 导入到另外一个空白的SVN项目里
查看>>
Android之Adapter用法总结-(转)
查看>>
总结列表显示ListView知识点
查看>>
android 教程实例系列
查看>>
lucene笔记
查看>>
tomcat无法正常shutdown
查看>>
zookeeper + dubbo 搭建
查看>>
根据前序遍历和中序遍历求出二叉树并打印
查看>>
UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
查看>>
Delphi的命令行编译命令
查看>>
BZOJ 1901 Zju2112 Dynamic Rankings 题解
查看>>
C++虚析构函数
查看>>
《玩转.NET Micro Framework 移植-基于STM32F10x处理器》--微软中国.NET Micro Framework项目组工程师所作之序...
查看>>
php服务端搜索,功能改进
查看>>
unity, 在surface shader中访问顶点色
查看>>
Spring声明式事务配置
查看>>
并查集的实现
查看>>
Leetcode 350. Intersection of Two Arrays II
查看>>
EditPlus VC2010 and 2008 C/C++配置
查看>>