数据范围252501 劲啊

Q国的监察院是一个神秘的组织。
这个组织掌握了整个Q国的地下力量,监察着Q国的每一个人。
监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只听从其上直接司的命令。其中1号成员是监察院的院长,这个庞然大物的主人。
由于时代的进步,监察院议会决定升级组织的旧式通信器,安装最新的反侦测通信器。
他们拿出了M组线路方案,其中第i组线路方案可以用一个四元组(x[i]、y[i]、k[i]、w[i])描述,表示第x[i]号成员可以安装与y[i]号成员的直接通信线路,费用为w[i];x[i]号成员的上司可以安装与y[i]号成员的上司的直接通信线路,费用为w[i];x[i]号成员的上司的上司可以安装与y[i]号成员的上司的上司的直接通信线路,费用为w[i]; …… ;x[i]号成员的k[i] - 1级上司可以安装与y[i]号成员的k[i] - 1级上司的直接通信线路,费用为w[i]。(这k[i]条线路的费用独立计算)
如果一个集合内部的成员两两之间都可以通过直接或间接的通信线路进行通信,那么这个集合的所有成员可以成立一个特别行动组。
监察院想成立一个成员最多的特别行动组,同时他们想让安装线路的费用之和最小,
所以他们找到了Q国的天命者——你,请你帮助他们规划出最优的线路。

$n,m \leq 252501$

sol:我们先考虑链上的做法,发现是区间向区间连边然后求 MST,就是一个裸的线段树优化建图 + Kruskal

怎么搞到树上呢?好像不可搞,那就。。。好好听话用 ST 表优化建图吧

我们可以把一个区间拆成 log 层,用 ST 表维护一下,每层看做一个点然后用并查集搞

这样为什么是 log 的呢?我们可以考虑合并的写法

我们设连边的两个区间为$S_1$,$S_2$,我们现在有两个长度为$2^k$的区间$K_1$,$K_2$($K_1$属于$S_1$,$K_2$属于$S_2$)如果$K_1$,$K_2$没连在一起,就连,并递归连它的 log 个子区间,连上了就 return

对于树,我们可以维护一个树上倍增的结构,用 $S_{(i,j)}$ 表示 $i$ 号点和它往上 $2^j$ 层的点组成的集合

合并跟链上一样,最后我们只关心 $j = 0$ 时的连通信息

这样就是一个优秀的一个 log 的做法了

emmmmmmmmmmm

“题是好题,但是要卡常”

wzj52501怎么跑的那么快呀QQQAQ

不管了不管了,常以后再卡吧

#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,m;
int fa[maxn][],pos[maxn][];
struct data
{
int x,y,k,w;
bool operator < (const data &b)const{return w < b.w;}
}qs[maxn];
int ufs[],size[maxn],dfn;
LL val[maxn];
inline int find(int x){return x == ufs[x] ? x : ufs[x] = find(ufs[x]);}
void merge(int a,int b,int k,int v)
{
int fu = find(pos[a][k]),fv = find(pos[b][k]);
if(fu == fv)return;
ufs[fv] = fu;
if(!k){size[fu] += size[fv];val[fu] += val[fv] + v;return;}
merge(a, b,k - ,v);
merge(fa[a][k-],fa[b][k-],k - ,v);
}
int main()
{
n = read(),m = read();
for(int i=;i<=n;i++)
{
fa[i][] = read();
for(int j=;j<=;j++)fa[i][j] = fa[fa[i][j - ]][j - ];
}
for(int i=;i<=m;i++)
qs[i].x = read(),qs[i].y = read(),qs[i].k = read(),qs[i].w = read();
sort(qs + ,qs + m + );
for(int i=;i<=n;i++)pos[i][] = ++dfn,size[dfn] = ;
for(int i=;i<=n;i++)
for(int j=;j<=;j++)pos[i][j] = ++dfn;
for(int i=;i<=dfn;i++)ufs[i] = i;
for(int i=;i<=m;i++)
{
int u = qs[i].x,v = qs[i].y;
for(int j=;~j;j--)
if(qs[i].k >> j & )
{
merge(u,v,j,qs[i].w);
u = fa[u][j],v = fa[v][j];
}
}
int ans1 = ;LL ans2 = (1LL << );
for(int i=;i<=n;i++)
{
int fu = find(i);
if(ans1 < size[fu])ans1 = size[fu],ans2 = val[fu];
else if(ans1 == size[fu] && ans2 > val[fu]) ans2 = val[fu];
}
printf("%d %lld",ans1,ans2);
}

哪位大手子教教我怎么卡常呀QQQAQ

Wannafly #4 F 线路规划的更多相关文章

  1. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

  2. iOS调用第三方导航和线路规划

    线路规划: https://blog.csdn.net/qq_19979539/article/details/51938995 百度地图:baidumap: 高德地图:iosamap: 腾讯地图:q ...

  3. [nowcoder_Wannafly挑战赛4_F]线路规划

    [nowcoder_Wannafly挑战赛4_F]线路规划 试题描述 Q国的监察院是一个神秘的组织. 这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人. 监察院一共有 \(N\) 个成员,每一个 ...

  4. 百度地图开发之poi检索,线路规划

      官方文档 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key 先去官方文档申请秘钥下载压缩文件等操作,参考 百度地图的秘钥申请 ...

  5. iOS - 高德地图步行线路规划多点多条线路

    项目集成高德地图遇到的问题: 高德地图的官方步行导航只针对单个起始点单条线路,驾车导航才有途径点多线路.现在项目是要步行导航多个点多条线路

  6. 利用dijkstra算法规划线路

    # dijkstra# 1.在数据库内预先存放了北京市内最新的道路节点,选用优化了得dijkstra算法进行线路规划.    当输入起点和终点后,会计算出最短的路径.同时还能选择查看路径经过的道路节点 ...

  7. java学习规划

    今天在网上看到一位大学生的java学习线路规划,觉得蛮适合我,就详细阅读了一下,规划路线应该适用于大部分学习java语言的人,贴出来与大家共勉. 在学习的过程中,不能急于去学习更多的知识,因为知识是无 ...

  8. Android百度地图开发05之公交信息检索 + 路线规划

    在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容. 公交信息检索 实际上,公交信息检索与POI检索.在线建议检索非常相似,也是把你需要检索的信息发送给百度地图 ...

  9. iOS百度地图路径规划和POI检索详细总结-b

    路径规划.png 百度地图的使用 百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧.坑一: 奥联WIFI_xcodeproj.png 如上图所示,在infoplist里 ...

随机推荐

  1. iOS与JS开发交互总结

    hybrid.jpg 前言 Web 页面中的 JS 与 iOS Native 如何交互是每个 iOS 猿必须掌握的技能.而说到 Native 与 JS 交互,就不得不提一嘴 Hybrid. Hybri ...

  2. mac 地址分配

    https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries 34:96:72:3c:5d:d6mac 地址 ...

  3. Java基础 - 变量的定义和使用

    变量定义 public class Main { public static void main(String[] args) { // 定义byte类型的变量 byte b = 10; System ...

  4. JDK动态代理连接池

    JDK动态代理   1 什么是JDK动态代理 刚刚写ItcastConnection时爽么?因为Connection中的方法太多了,每个都要写,所以很累吧.累点到是没什么,可以完成功能就是好的.但是不 ...

  5. 深入理解ByteBuffer(转)

    转:http://blog.csdn.net/workformywork/article/details/26699345?utm_source=tuicool&utm_medium=refe ...

  6. UML建模:学习笔记(1)

    UML:学习笔记(1) 事物 结构事物 类: 接口: 协作:(定义元素之间的相互作用) 用例:(在系统外部和系统交互的人) 组件:(描述物理系统的一部分) 节点:(一个节点可以被定义为运行时存在的物理 ...

  7. js完美实现table分页

    // JavaScript Document /** * js分页类 * @param iAbsolute 每页显示记录数 * @param sTableId 分页表格属性ID值,为String * ...

  8. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  9. 【leetcode刷题笔记】Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. 题解:以strs[0]为模 ...

  10. 【Flask】SelectedField 同步数据库

    ## 如果不加入__init__函数会导致,SelectedField表单生成只有里面的内容不会和数据库同步(即数据库添加,删除字段时表单中数据项和初始化时一致.下一次重启app是才会同步) clas ...