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

试题描述

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国的天命者——你,请你帮助他们规划出最优的线路。

输入

第一行为 \(2\) 个正整数 \(N\)、\(M\)。

第二行为 \(N - 1\) 个正整数 \(L[i]\),第 \(i\) 个正整数表示第 \(i+1\) 个成员的直接上司 \(L[i]\)。

接下来 \(M\) 行每行四个正整数 \(x[i]\),\(y[i]\),\(k[i]\),\(w[i]\)。

输出

仅一行,为特别行动组成员人数的最大值和在此前提下安装线路的最小费用之和。

输入示例

5 3
1 1 2 2
5 4 3 10
1 3 1 5
2 4 2 3

输出示例

5 21

数据规模及约定

对于 \(100\texttt{%}\) 的数据:

\(1 \le N、M \le 252501\)

\(1 \le x[i],y[i],k[i] \le N\),\(1 \le L[i] \le i - 1\),保证 \(x[i]\)、\(y[i]\) 号成员均至少有 \(k[i]\) 个上司,\(1 \le w[i] \le 10^9\)。

题解

这题 idea 非常妙啊。

考虑链的情况,我们就是将一个区间中的所有点和另一个等长区间所有点一一对应地连边。我们维护一下 ST 表,显然这个 ST 表分 \(log\) 层,我们每层用并查集维护连通性。当一类边加入时(令这类边链接区间 \(Q_1\) 和区间 \(Q_2\)),我们用 ST 表将区间拆成 \(log\) 个长度为 \(2\) 的整数次幂的区间,设对于长度为 \(2^k\) 的区间,属于 \(Q_1\) 那个区间叫 \(B_1\),属于 \(Q_2\) 的区间为 \(B_2\)。如果 \(B_1\) 和 \(B_2\) 不在同一连通块中,那么就将它们的连通块合并,然后递归处理 \(B_1、B_2\) 的左右半边;如果在同一连通块中,就直接 \(return\)。

对于树的情况,我们可以直接维护树上倍增的结构,令 \(S_{i, j}\) 表示节点 \(i\) 向上走 \(2^j\) 个节点组成的集合,然后对于不同的 \(j\) 用并查集分别维护连通性,操作类似上面所说的做法。最后找答案时我们只关心 \(j = 0\) 那一层的信息。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
#define dwn(i, s, t) for(int i = (s); i >= (t); i--) const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 252510
#define maxlog 18
#define maxnode 4545180
#define LL long long int n, m, Fa[maxn][maxlog], Id[maxn][maxlog];
struct Que {
int x, y, k, w;
Que() {}
Que(int _1, int _2, int _3, int _4): x(_1), y(_2), k(_3), w(_4) {}
bool operator < (const Que& t) const { return w < t.w; }
} qs[maxn]; int cnt, fa[maxnode], siz[maxn];
LL sum[maxn];
int findset(int x) { return x == fa[x] ? x : fa[x] = findset(fa[x]); } void combine(int a, int b, int k, int val) {
int u = findset(Id[a][k]), v = findset(Id[b][k]);
if(u == v) return ;
fa[v] = u;
if(!k){ siz[u] += siz[v]; sum[u] += sum[v] + val; return ; }
combine(a, b, k - 1, val);
combine(Fa[a][k-1], Fa[b][k-1], k - 1, val);
return ;
} int main() {
n = read(); m = read();
rep(i, 2, n) {
Fa[i][0] = read();
rep(j, 1, maxlog - 1) Fa[i][j] = Fa[Fa[i][j-1]][j-1];
}
rep(i, 1, m) {
int x = read(), y = read(), k = read(), w = read();
qs[i] = Que(x, y, k, w);
}
sort(qs + 1, qs + m + 1); rep(i, 1, n) siz[Id[i][0] = ++cnt] = 1;
rep(i, 1, n) rep(j, 1, maxlog - 1) Id[i][j] = ++cnt;
rep(i, 1, cnt) fa[i] = i;
rep(i, 1, m) {
int x = qs[i].x, y = qs[i].y;
dwn(j, maxlog - 1, 0) if(qs[i].k >> j & 1) {
combine(x, y, j, qs[i].w);
x = Fa[x][j]; y = Fa[y][j];
}
} int ans1 = 0;
LL ans2 = (1ll << 60);
rep(i, 1, n) {
int u = findset(i);
if(ans1 < siz[u]) ans1 = siz[u], ans2 = sum[u];
else if(ans1 == siz[u] && ans2 > sum[u]) ans2 = sum[u];
}
printf("%d %lld\n", ans1, ans2); return 0;
}

[nowcoder_Wannafly挑战赛4_F]线路规划的更多相关文章

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

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

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

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

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

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

  4. Wannafly #4 F 线路规划

    数据范围252501 劲啊 Q国的监察院是一个神秘的组织. 这个组织掌握了整个Q国的地下力量,监察着Q国的每一个人. 监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只听从其上直接司的命令 ...

  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. TypeScript task

    Ctrl+Shift+B 生成 js 文件.

  2. 启动Jmeter时遇到的几种错误

    1.权限不够 解决办法:用管理员权限运行 2.sdk版本太低 解决办法:1)查看当前sdk版本:java -version 2)安装sdk1.7或以上版本(jmeter3.0版本要用sdk1.7及以上 ...

  3. S运算符&&和|| 及其优先级

    a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回aa || b : 将a, b转换为Boolean类型, 再执行逻辑或, tru ...

  4. 基于GMap.NET地图下载器的开发和研究

    基于GMap.NET地图下载器的开发和研究 软件下载地址:https://pan.baidu.com/s/1ay0aOm3fiZ35vlfD8kFYFw 1.地图浏览功能 可以浏览谷歌地图.百度.ar ...

  5. 防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement

    package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...

  6. 自己写一个Promise

    参考Promise 的  官方规范  https://promisesaplus.com/ Promise 其实就是一个状态机 它只有两种状态变化 pending    =>   fulfill ...

  7. 【原创】数据处理中判断空值的方法(np.isnan、is np.nan和pd.isna)比较

      转载请注明出处:https://www.cnblogs.com/oceanicstar/p/10869725.html  1.np.isnan(只有数组数值运算时可使用) 注意:numpy模块的i ...

  8. B1007 素数对猜想

    B1007 素数对猜想 让我们定义\(d_n\)为:\(d_n =p_{n+1}−p_n\),其中\(p_i\)是第i个素数.显然有\(d_1=1\),且对于n>1有\(d_n\)是偶数.&qu ...

  9. 笔记-python-standard library-12.1 pickle

    笔记-python-standard library-12.1 pickle 1.      pickle简介 source code: Lib/pickle.py pickle模块实质上是一个实现p ...

  10. 1568: [JSOI2008]Blue Mary开公司(超哥线段树)

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1198  Solved: 418 Descr ...