数据范围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. Java static关键字特点

    一.特点 1.随着类的加载而加载2.优先于对象存在3.被类的所有对象共享4.可以通过类名调用 二.调用特征 静态方法: 成员变量:只能访问静态变量 成员方法:只能访问静态成员方法 非静态方法: 成员变 ...

  2. byte[] 、Bitmap与Drawbale 三者直接的转换

    经常遇到这种类似头疼的问题 byte[] .Bitmap与Drawbale 三者直接的转换 1.byte[] ->Bitmap Bitmap Bitmap = BitmapFactory.dec ...

  3. django form 表单验证

  4. Gaby Ivanushka(快排)

    Gaby Ivanushka Once upon a time there lived a tsar that has a daughter — Beautiful Vasilisa. There w ...

  5. csv .xlsx

    def gen_file_data(fodir, fname, sheet_index=0, ): if fname.find('.xlsx') > -1: fname_open = '%s\\ ...

  6. 在函数中如何获取 线程对象、线程唯一ID

    threading.current_thread() threading.current_thread().ident

  7. 3.写一个hello world页面

    经过1和2的学习,现在已经可以正常启动Django了,这一节说怎么写一个hello world页面,所有的环境基础就是1和2中搭建的 1.在app模块中添加页面 具体为 hello_django\he ...

  8. ABAP table control例子

    [转自]http://blog.csdn.net/lhx20/article/details/3039909Table control用于在screen上以表格的形式显示数据,在table contr ...

  9. linux后台开发必备技能

    一.linux和os: 1.命令:netstat tcpdump ipcs ipcrm  这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 2.cpu 内存 硬盘 等等与系统性能调试相关的 ...

  10. 2个canvas叠加运用(时钟例子)

    最近在学习canvas,http://corehtml5canvas.com/code-live/,主要的学习方式就是通过上面的一些例子来学习canvas的一些用法.但是我发现,这里的例子,只要can ...