[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. 对ListBox控件中的数据进行排序

    实现效果: 知识运用: ListBox控件的Sorted属性 //ListBox控件中的数据项是否按字母顺序排序 public bool Sorted{get;set;} 实现代码: private ...

  2. C# 理解FileInfo类的Open()方法

    我们在对文件进行读写操作之前必须打开文件,FileInfo类为我们提供了一个Open()方法,该方法包含了两个枚举类型值的参数,一个为FileMode枚举类型值,另一个为FileAccess枚举类型值 ...

  3. Websocket教程SpringBoot+Maven整合

    1.大话websocket及课程介绍 简介: websocket介绍.使用场景分享.学习课程需要什么基础 2.课程技术选型和浏览器兼容讲解 简介: 简单介绍什么是springboot.socketjs ...

  4. 谭浩强 c++程序设计第一章课后习题 第10题

    #include <iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个整数类型的数 ...

  5. JavaScript获取时间戳与时间戳转化

    第一种方法(精确到秒): var timestamp1 = Date.parse( new Date()); 第二种方法(精确到毫秒): var timestamp2 = ( new Date()). ...

  6. ZR#317.【18 提高 2】A(计算几何 二分)

    题意 Sol 非常好的一道题,幸亏这场比赛我没打,不然我估计要死在这个题上qwq 到不是说有多难,关键是细节太多了,我和wcz口胡了一下我的思路,然后他写了一晚上没调出来qwq 解法挺套路的,先提出一 ...

  7. 两个list缩进为一个list,python

    # w_list = ['a', 'b', 'c', 'd'] # e_list = ['c', 'd', 'b', 'a'] w_list = ['a', 'b', 'c', 'd', 'ff', ...

  8. window.onload和$(docunment).ready的区别

    浏览器加载完DOM后,会通过javascript为DOM元素添加事件,在javascript中,通常使用window.onload()方法. 在jquery中,则使用$(document).ready ...

  9. Maya建模命令

    Surface-Loft(放样)在两条曲线中间生成曲面Section Radius 改变圆环的圆环半径Edit Mesh- Merge 点连结挤压 keep face together(整体挤压),若 ...

  10. Understanding on 'Error to Origin (50x)' , 'Internal CDN Error (50x)' and 'External Error (50x)' in Chartron

    Overview This document explains about definition of these values on OUI Chartron. Definition of Erro ...