[jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)
题目链接:
https://jzoj.net/senior/#main/show/5926
题目:

题解:
显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树)
于是我们建出kruskal重构树,两个节点的d值就是lca代表的边的边权,问题转化为对于每个lca计算以它为lca的且满足$|c_u-c_v|$的点对的个数
对于每个lca我们枚举 size 较小的那棵子树内的点(每次选择size较小的暴力计算就是启发式合并),算出在另一棵子树中能与它组成点对的点的个数。这个问题实际上就是询问在 dfs 序的一段区间上并且颜色不在一段区间内的点 数,二维数点问题可以离线树状数组完成。
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll; const int N=2e5+;
const int M=5e5+;
int n,m,xys,tot,tim,ask;
ll L,mx;
int fa[N<<],in[N<<],dfn[N<<],siz[N<<],lf[N<<],rf[N<<],ED[N<<],t[N<<];
ll c[N],ANS[N<<],val[N<<];
struct EDGE{
int u,v;
ll w;
}e[M];
bool operator <(EDGE a,EDGE b) {return a.w<b.w;}
struct QUE{
ll x,y;
int k,id;
}q[N<<];
bool operator <(QUE a,QUE b){return (a.x<b.x)||(a.x==b.x&&a.k>b.k);}
inline char nc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
char ch=nc();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=nc();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=nc();}
return s*f;
}
int find(int x)
{
if (fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
void dfs(int x)
{
dfn[x]=++tim;siz[x]=;
if (x<=n) {ED[x]=dfn[x];return;}
if (lf[x]) dfs(lf[x]);
if (rf[x]) dfs(rf[x]);
ED[x]=tim;
if (siz[lf[x]]>siz[rf[x]]) swap(lf[x],rf[x]);
siz[x]+=siz[lf[x]]+siz[rf[x]];
}
void ASK(int x,int st,int ed,int id)
{
if (x<=n)
{
ll p1,p2;
p1=;p2=c[x]-L;
if (p2>=p1)
{
q[++ask]=(QUE){p2,ed,,id};
q[++ask]=(QUE){p1-,ed,-,id};
q[++ask]=(QUE){p2,st-,-,id};
q[++ask]=(QUE){p1-,st-,,id};
}
p1=c[x]+L;p2=mx;
if (L==) ++p1;
if (p1<=p2)
{
q[++ask]=(QUE){p2,ed,,id};
q[++ask]=(QUE){p1-,ed,-,id};
q[++ask]=(QUE){p2,st-,-,id};
q[++ask]=(QUE){p1-,st-,,id};
}
return;
}
if (lf[x]) ASK(lf[x],st,ed,id);if (rf[x]) ASK(rf[x],st,ed,id);
}
void modify(int x,int y)
{
while (x<=tim)
{
t[x]+=y;
x+=x&-x;
}
}
int query(int x)
{
int re=;
while (x)
{
re+=t[x];
x-=x&-x;
}
return re;
}
int main()
{
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
n=read();m=read();L=read();
for (int i=;i<=n;i++) c[i]=read(),mx=max(mx,c[i]),fa[i]=i;
for (int i=;i<=m;i++)
{
e[i].u=read();e[i].v=read();e[i].w=read();
}
sort(e+,e++m);
for (int i=n+;i<=n<<;i++) fa[i]=i;
int cnt=;xys=n;
for (int i=;i<=m;i++)
{
int u=e[i].u,v=e[i].v;
int fu=find(u),fv=find(v);
if (fu!=fv)
{
val[++xys]=e[i].w;
fa[fu]=xys;fa[fv]=xys;
lf[xys]=fu;rf[xys]=fv;
in[fu]++;in[fv]++;
++cnt;
if (cnt==n-) break;
}
}
for (int i=;i<=xys;i++) if (!in[i]) dfs(i);
for (int i=;i<=n;i++)
{
q[++ask]=(QUE){c[i],dfn[i],,};
}
for (int i=n+;i<=xys;i++)
{
ASK(lf[i],dfn[rf[i]],ED[rf[i]],i);
}
sort(q+,q++ask);
for (int i=;i<=ask;i++)
{
if (!q[i].id) modify(q[i].y,);
else ANS[q[i].id]+=q[i].k*query(q[i].y);
}
ll ans=;
for (int i=n+;i<=xys;i++) ans+=ANS[i]*1ll*val[i];
printf("%lld\n",ans);
return ;
}
[jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)的更多相关文章
- [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)
题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...
- [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)
题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...
- [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...
- [JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)
题目链接: https://jzoj.net/senior/#main/show/5895 题目: 题解: 有一个好像比较显然的性质,就是每条边最多经过两次 那么我们考虑哪些边需要经过两次.我们把需要 ...
- [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)
题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...
- [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)
题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景:尊者神高达很穷,所以他需要跑商来赚钱题目描述:基三的地图可以看做 n 个城市,m ...
- [JZOJ 5906] [NOIP2018模拟10.15] 传送门 解题报告(树形DP)
题目链接: https://jzoj.net/senior/#contest/show/2528/2 题目: 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传 ...
- [jzoj 5930] [NOIP2018模拟10.26】山花 解题报告 (质因数分类)
题目链接: http://172.16.0.132/senior/#contest/show/2538/2 题目: 小S决定从某一个节点$u$开始对其子树中与$u$距离小于$K$的节点代表的花树进行采 ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
随机推荐
- 2017-3-3 leetcod 1 35 448
ACM退役了,接下来是考研的准备,刷刷leetcode保证不会生手,也算是调剂生活,初步计划是每天三题吧,希望可以坚持下去. 打算按照专题来做,先是Array....本来以为特别水,结果.... == ...
- [Java]serialVersionUID的作用
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的 字节流中的serialVersionUID与本地相应实体(类 ...
- CommandType.Text
CommandType.Text代表执行的是SQL语句CommandType.StoreProcedure代表执行的是存储过程CommandType代表要执行的类型 //返回DataTable的SQL ...
- 【摘录】JAVA内存管理-自动选择垃圾收集器算法
在J2SE 5.0,垃圾收集的默认值:垃圾收集器.堆大小以及JVM的类型(客户端还是服务器)都会根据应用运行的硬件平台和操作系统自动选择.相比之前设置命令行参数的方式,自动选择很好的匹配了不同类型的应 ...
- linux拷贝文件
linux之cp/scp命令+scp命令详解 2011-03-09 17:27:22| 分类: Linux | 标签:linux cp scp commond |字号 订阅 名称:c ...
- Unity 动画资源与模型资源的区别
动画资源: 模型资源: 对比: 模型文件多出来了 Materials + 贴图 + mesh文件,少了avatar文件 PS:动画资源,是指动画片段,即animation chip,它一般包含在模型资 ...
- ZBrush中移动笔刷介绍
移动笔刷是ZBrush®笔刷中举足轻重的一项,利用移动笔刷可以实现移动顶点的功能,还能改变模型的某一个点和某一位置.本文内容向大家介绍ZBrush®中移动笔刷以便大家熟悉它的用法和特性. 移动笔刷 可 ...
- ajax中遇到无法发送的问题,以及收不到返回信息的问题
1.在做ajax时,数据发送成功,后台确认了也返回了信息,但是怎么都在success里面接收不了,我遇见的造成的原因时因为dataType返回值类型错误造成的原因. var url = "请 ...
- 多个账号GitHub账号配置
1.vi config 重复以上步骤就行 然后#注释下 是个人账号还是公司用的账号 mv id_rsa id_rsa_qq 做下区别,防止冲突 ,别忘了,路径也要改下 mv id_rsa ...
- PAT 天梯赛练习集 L2-022. 重排链表
题目链接:https://www.patest.cn/contests/gplt/L2-022 给定一个单链表 L1→L2→...→Ln-1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln-1→L ...