测试点1~2:暴力。

测试点3~4:可以将边按r从大到小排序不断加入,然后用并茶几维护深度。好像也可以用猫树做。

好吧其他的部分分并没有看懂。

正解:

线段树分治,求出每个速度的答案。

对于速度区间$[L,R]$,将完全包含这个区间的边加入,对于其余的边,按照和mid的关系分到左右儿子,这里的一条边有可能同时分到两个儿子所以直接塞vector就行了。

那么到达叶子区间时,满足条件的树的结构已经出来了,答案就是这些联通块的直径。

那么大体思路已经清晰了,如何动态维护树的结构呢?lct!!!并查集即可,维护联通块直径的两个端点,合并时分6中情况讨论即可,注意由于递归完左儿子后还要处理右儿子,所以左儿子中连的边都要清掉,于是并查集不能路径压缩,按秩合并即可(然而我故意把size大的合并到size小的还是A掉了)。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define re register
#define co const
#define rec re co
#define LL long long
using namespace std;
struct edge
{
int u,v,nxt,l,r;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define l(x) ed[x].l
#define r(x) ed[x].r
#define n(x) ed[x].nxt
friend bool operator < (edge a,edge b)
{return a.r>b.r;}
}ed[];
int first[],num_e=;
#define f(x) first[x]
int n,m;
int f[][],dep[],size[];
int ttop[],son[],dfn[],id[],cnt;
void dfs1(int x)
{
size[x]=;
for(int i=f(x);i;i=n(i))
if(v(i)!=f[x][])
{
f[v(i)][]=x;dep[v(i)]=dep[x]+;
dfs1(v(i));size[x]+=size[v(i)];
if(size[v(i)]>size[son[x]])son[x]=v(i);
}
}
void dfs2(int x,int t)
{
ttop[x]=t;dfn[x]=++cnt;id[cnt]=x;
if(son[x])dfs2(son[x],t);
for(int i=f(x);i;i=n(i))
if(v(i)!=f[x][]&&v(i)!=son[x])
dfs2(v(i),v(i));
}
inline int LCA(int x,int y)
{
while(ttop[x]!=ttop[y])
{
if(dep[ttop[x]]>dep[ttop[y]])swap(x,y);
y=f[ttop[y]][];
}
if(dep[x]>dep[y])swap(x,y);
return x;
}
#define st sta[top]
#define st2 sta2[top2]
#define st3 sta3[top3]
struct node{int id,pu,pv;}sta[];int top;
struct node2{int id,of;}sta2[];int top2;
struct node3{int id,ad;}sta3[];int top3;
vector<int> in[];
int fa[],u[],v[],al[],siz[];
int get(re int x){return fa[x]==x?x:get(fa[x]);}
LL lenth(re int u,re int v){return dep[u]+dep[v]-dep[LCA(u,v)]*;}
void solve(re int l,re int r,rec int x,re int res)
{
int mid=(l+r)>>,tem=top,tem2=top2,tres=res,tem3=top3;
for(int i=;i<in[x].size();i++)
if(l(in[x][i])<=l&&r(in[x][i])>=r)
{ int f1=get(u(in[x][i])),f2=get(v(in[x][i]));if(f1==f2)continue;
int gl;
if(siz[f1]>siz[f2])
{
fa[f1]=f2;gl=f2;siz[f2]+=siz[f1];
sta[++top]=(node){f2,u[f2],v[f2]};
sta2[++top2]=(node2){f1,f1};
sta3[++top3]=(node3){f2,siz[f1]};
}
else
{
fa[f2]=f1;gl=f1;siz[f1]+=siz[f2];
sta[++top]=(node){f1,u[f1],v[f1]};
sta2[++top2]=(node2){f2,f2};
sta3[++top3]=(node3){f1,siz[f2]};
}
int t1=u[f1],t2=u[f2],t3=v[f1],t4=v[f2];
int max1=lenth(t1,t2),
max2=lenth(t1,t3),
max3=lenth(t1,t4),
max4=lenth(t2,t3),
max5=lenth(t2,t4),
max6=lenth(t3,t4);
int maxn=max(max1,max2);maxn=max(maxn,max3);
maxn=max(maxn,max4);maxn=max(maxn,max5);maxn=max(maxn,max6);
if(maxn==max1)u[gl]=t1,v[gl]=t2;
else if(maxn==max2)u[gl]=t1,v[gl]=t3;
else if(maxn==max3)u[gl]=t1,v[gl]=t4;
else if(maxn==max4)u[gl]=t2,v[gl]=t3;
else if(maxn==max5)u[gl]=t2,v[gl]=t4;
else if(maxn==max6)u[gl]=t3,v[gl]=t4;
res=max(res,maxn);
}
else
{
if(l(in[x][i])<=mid)in[x*].push_back(in[x][i]);
if(r(in[x][i])> mid)in[x*+].push_back(in[x][i]);
}
if(l==r)
{
al[l]=res;
while(top>tem)u[st.id]=st.pu,v[st.id]=st.pv,top--;
while(top2>tem2)fa[st2.id]=st2.of,top2--;
while(top3>tem3)siz[st3.id]-=st3.ad,top3--;
res=tres;
return;
}
solve(l,mid,x*,res);solve(mid+,r,x*+,res);
while(top>tem)u[st.id]=st.pu,v[st.id]=st.pv,top--;
while(top2>tem2)fa[st2.id]=st2.of,top2--;
while(top3>tem3)siz[st3.id]-=st3.ad,top3--;
res=tres;
}
inline int read();
inline void add(rec int u,rec int v,rec int l,rec int r);
signed main()
{
// freopen("speed1.in","r",stdin);
// freopen("out.out","w",stdout); n=read(),m=read();
int tu,tv,tl,tr;
for(re int i=;i<n;i++)
{
tu=read(),tv=read(),tl=read(),tr=read();
add(tu,tv,tl,tr);add(tv,tu,tl,tr);
}
dfs1(),dfs2(,);
for(re int i=;i<=;i++)
for(re int j=;j<=n;j++)
f[j][i]=f[f[j][i-]][i-];
for(re int i=;i<=n;i++)fa[i]=u[i]=v[i]=i,siz[i]=;
for(re int i=;i<=num_e;i+=)in[].push_back(i);
solve(,n,,);
int q;
for(re int i=;i<=m;i++)
{
q=read();
printf("%d\n",al[q]);
}
}
inline int read()
{
int s=,f=;char a=getchar();
while(a<''||a>''){if(a=='-')f=-;a=getchar();}
while(a>=''&&a<=''){s=s*+a-'';a=getchar();}
return s*f;
}
inline void add(rec int u,rec int v,rec int l,rec int r)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
l(num_e)=l;
r(num_e)=r;
n(num_e)=f(u);
f(u)=num_e;
}

HZOJ Dash Speed的更多相关文章

  1. Dash Speed【好题,分治,并查集按秩合并】

    Dash Speed Online Judge:NOIP2016十联测,Claris#2 T3 Label:好题,分治,并查集按秩合并,LCA 题目描述 比特山是比特镇的飙车圣地.在比特山上一共有 n ...

  2. csp-s模拟测试58「Divisors」·「Market」·「Dash Speed」

    A. Divisors   大概平均下来每个数也就几千约数吧....,直接筛 B. Market 可以把时间离线下来, 考试没有想到将询问离线,用数组存算了算只能过200的点,拿了70 事实上背包后直 ...

  3. LYDSY模拟赛day2 Dash Speed

    /* 弃坑 */ #include<cstdio> #include<algorithm> using namespace std; ,M=N*; ],nxt[N<< ...

  4. Claris’ Contest # 2 Day 2 Problem C. Dash Speed(分治+可持久化并查集+树剖)

    题面 题解 \(std\)爆栈了→_→ 我们先考虑一个简化的问题,如果只有加边的情况下如何动态维护直径 合并两棵树时,设\(a,b\)为\(A\)的直径的两个端点,\(c,d\)为\(B\)的直径的两 ...

  5. Dash Speed

    题目大意: 比特山是比特镇的飙车圣地.在比特山上一共有n 个广场,编号依次为1 到n,这些广场之间通过n - 1 条双向车道直接或间接地连接在一起,形成了一棵树的结构.因为每条车道的修建时间以及建筑材 ...

  6. [CSP-S模拟测试]:Dash Speed(线段树+并查集+LCA)

    题目描述 比特山是比特镇的飙车圣地.在比特山上一共有$n$个广场,编号依次为$1$到$n$,这些广场之间通过$n−1$条双向车道直接或间接地连接在一起,形成了一棵树的结构. 因为每条车道的修建时间以及 ...

  7. 联赛模拟测试8 Dash Speed 线段树分治

    题目描述 分析 对于测试点\(1\).\(2\),直接搜索即可 对于测试点\(3 \sim 6\),树退化成一条链,我们可以将其看成序列上的染色问题,用线段树维护颜色相同的最长序列 对于测试点\(7\ ...

  8. 【线段树分治】Dash Speed

    代码的美妙 #include <bits/stdc++.h> %:pragma GCC optimize(3) using namespace std; const int maxn=7e ...

  9. noip2016十连测round2

    A: Divisors 题意:给定 m 个不同的正整数 a 1 ,a 2 ,...,a m ,请对 0 到 m 每一个 k 计算,在区间 [1,n] 里有多少正整数 是 a 中恰好 k 个数的约数. ...

随机推荐

  1. DAO设计模式总结

    1.DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作. 数据开发结构流程: 资源层是数据库的操作层,里面可以进行各种 ...

  2. agc004E Salvage Robots

    题意: 一个网格图,有若干机器人,还有一个出口. 操作一系列指令让机器人一起上下左右走,走出矩形就死,进入出口则得救. 最多救多少机器人? $W,H \leq 100$ 考虑不让所有机器人移动,而让出 ...

  3. Excel函数学习:HLOOKUP函数

    Excel函数学习:HLOOKUP函数 HLOOKUP函数查找表的第一行中的值,返回该表中与找到的值在同一列的另一个值. 什么情况下使用HLOOKUP? HLOOKUP函数可以在查找行中找到精确匹配值 ...

  4. OSI层次关系

    一.OSI参考模型         今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型. 1.OSI的来源         OSI(Open System Interconnect),即开 ...

  5. oracle-约束-序列

    概要图 一 约束 --问题:往表中插入数据的时候,可能出现一些问题,比如:重复插入数据,内容不对(性别) --如何保证数据库表中数据的完整性和一致性呢? 约束是强加在表上的规则或条件,确保数据库满足业 ...

  6. day38 07-Spring框架Bean的时候方式

    Spring是自动帮我们创建对象的,有几种创建Bean的方式呢? 构造方法实例化:(默认无参数)其实就是反射new Instance(). 静态工厂实例化: 实例工厂实例化: 一般不会改变它实例化的方 ...

  7. pytorch 常用问题解决

    1.RuntimeError: cuda runtime erorr (77): an illegal memory access was encountered at 在使用命令前面加上CUDA_L ...

  8. Leetcode96.Unique Binary Search Trees不同的二叉搜索树

    给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 假设n个节点存在二叉排序树的 ...

  9. 2019阿里云开年Hi购季基础云产品分会场全攻略!

    2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...

  10. Codeforces 3D

    题目链接 D. Least Cost Bracket Sequence time limit per test 1 second memory limit per test 64 megabytes ...