代码的美妙

#include <bits/stdc++.h>
%:pragma GCC optimize(3)
using namespace std;
const int maxn=7e4+10;
int n,m;
int ans[maxn];
pair<int,int> tree[maxn]; struct Edge{
int from,to,nxt;
}e[maxn<<1]; inline int read(){
int x=0;bool fopt=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')fopt=0;
for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-48;
return fopt?x:-x;
} int head[maxn],cnt;
inline void add(int u,int v){
e[++cnt].from=u;
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
} namespace LinkCut{
int fa[maxn],dep[maxn],siz[maxn],son[maxn],dis[maxn];
void dfs1(int u){
dep[u]=dep[fa[u]]+1;siz[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u])continue;
fa[v]=u;dfs1(v);
siz[u]+=siz[v];
if(!son[u]||siz[v]>siz[son[u]])son[u]=v;
}
} int top[maxn];
void dfs2(int u,int t){
top[u]=t;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u])continue;
dfs2(v,v==son[u]?t:v);
}
} inline int lca(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
} inline int getdis(int u,int v){
int lcam=lca(u,v);
return dep[u]+dep[v]-(dep[lcam]<<1);
}
} using namespace LinkCut; namespace DSU{
int f[maxn],size[maxn]; int t=0;
struct Node{
int x,y,v;
pair<int,int> p;
}sta[maxn]; inline void Init(){
for(int i=1;i<=n;i++)
f[i]=i;
} int Find(int x){
return x==f[x]?x:Find(f[x]);
} inline void del(int x){
while(x<t){
Node u=sta[t--];
size[u.x]-=u.v;
f[u.y]=u.y;
tree[u.x]=u.p;
}
}
} using namespace DSU; namespace SEG{
#define lson (rt<<1)
#define rson (rt<<1|1)
vector<pair<int,int> > pos[maxn<<2]; inline pair<int,int> pushup(pair<int,int> A,pair<int,int> B,int &flag){
int p[4]={A.first,A.second,B.first,B.second};
int Max=-1;pair<int,int> res;
for(int i=0;i<4;i++)
for(int j=i+1;j<4;j++){
int w=getdis(p[i],p[j]);
if(w>Max){
Max=w;res=make_pair(p[i],p[j]);
}
}
flag=max(Max,flag);
return res;
} inline void build(){
for(int i=1;i<=n;i++)
tree[i]=make_pair(i,i);
} void modify(int rt,int l,int r,int s,int t,int u,int v){
if(r<s||t<l)return;
if(s<=l&&r<=t)return pos[rt].push_back(make_pair(u,v)),void();
int mid=(l+r)>>1;
modify(lson,l,mid,s,t,u,v);
modify(rson,mid+1,r,s,t,u,v);
} inline void Merge(int x,int y,int &res){
x=Find(x);y=Find(y);
pair<int,int> temp=pushup(tree[x],tree[y],res);
if(size[x]<size[y])swap(x,y);
sta[++t]=(Node){x,y,0,tree[x]};
if(size[x]==size[y]){
size[x]++;sta[t].v=1;
}
f[y]=x;tree[x]=temp;
} void Solve(int rt,int l,int r,int res){
int now=t;
for(int i=0;i<pos[rt].size();i++)
Merge(pos[rt][i].first,pos[rt][i].second,res);
if(l==r){
ans[l]=res;del(now);return;
}
int mid=(l+r)>>1;
Solve(lson,l,mid,res);
Solve(rson,mid+1,r,res);
del(now);
}
#undef lson
#undef rson
} using namespace SEG; int main(){
#ifndef LOCAL
freopen("ds.in","r",stdin);
freopen("ds.out","w",stdout);
#endif
n=read();m=read();
for(int i=1;i<n;i++){
int u=read(),v=read(),l=read(),r=read();
add(u,v);add(v,u);
modify(1,1,n,l,r,u,v);
}
dfs1(1);dfs2(1,1);
Init();build();
Solve(1,1,n,0);
while(m--){
int q=read();
printf("%d\n",ans[q]);
}
return 0;
}

最新文章

  1. python 抓取百度音乐
  2. UE4 VR 模式画面扭曲 解决方法
  3. 【转】 HTMLCollection和NodeList的区别
  4. 修改/etc/profile导致常用命令不可用的解决办法
  5. javascript通过时区获取时间
  6. android 项目学习随笔二十一(IM、语音识别、机器人、统计、扫描二维码、条形码)
  7. JavaScript——new Date().getMonth()
  8. Project: Individual Project - Word frequency program-11061160顾泽鹏
  9. Sass函数--map
  10. ecside使用笔记(1)
  11. android基础知识点复习之短信发送
  12. Android--&gt;创建自定义控件
  13. Sublime text 添加lua
  14. .NET Core开源快速开发框架Colder发布 (NET Core2.1+AdminLTE版)
  15. [ZJOI2019]线段树
  16. C#工具:利用HttpClient调用WebApi
  17. 极其简单的VSCode C++环境配置
  18. Numpy一文全了解
  19. ES6快速入门(二)数据结构
  20. javascript History对象属性和方法

热门文章

  1. 浏览器调试的必知必会,零基础足够详细-第一节console面板、移动端调试
  2. 为什么选择H5游戏开发定制?
  3. Mybatis注解开发相关
  4. [LeetCode] 279. 完全平方数(DP)
  5. 一道JavaScript的二维数组求平均数的题
  6. Django ContentType(ORM操作)
  7. 【转】postgreSQL​之autovacuum性能问题分析(二)
  8. UGOPEN实现解析NX表达式
  9. 解析形如(k,v)(k,v)(k,v)字符串
  10. python-数组+递归实现简单代数式运算