[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. 【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)

    点此看题面 大致题意: 求出一个矩阵中所有\(n*n\)正方形中极差的最小值. 另一种做法 听说这题可以用单调队列去做,但是我写了一个二维\(RMQ\). 二维\(RMQ\) \(RMQ\)相信大家都 ...

  2. 5.1 Object类型

    创建Object实例的方式有两种 ① 使用new操作符跟Object构造函数 var person = new Object(); person.name = "Tom"; pei ...

  3. springboot集成shiro的session污染问题

    问题起因是这样的,有两套系统,系统a和系统b.两套系统均使用shiro做的权限管理,之前部署在两台机器上.使用浏览器打开a系统后另开页签打开b系统,互不干扰都能正常使用,后因业务迁移,两套系统部署到了 ...

  4. C#继承机制 多级继承

    一些面向对象语言允许一个类从多个基类中继承,而另一些面向对象语言只允许从一个类继承,但可以随意从几个接口或纯抽象类中继承. 只有C++支持多级继承,许多程序员对此褒贬不一.多级继承常会引起继承来的类之 ...

  5. Sass和gulp的简单了解

        一.sass  less    css预处理器        sass里面有2种语法  第一种语法是sass  后缀名必须是sass   第二种语法是scss  后缀名必须是scss      ...

  6. 可拖拽div

    在开发的时候需要一个可拖拽的prompt弹框.自己写了一个,大概思路为: 1.获取鼠标左键按下移动的起点坐标(x,y). 2.获取div的left和top属性. 3.得到鼠标坐标到左上角的距离(x-t ...

  7. python笔记-tuple元组的方法

    #!/usr/bin/env python #-*- coding:utf-8 -*- # 创建空元组 tuple1 = () print(tuple) # 创建带有元素的元组 # 元组中的类型可以不 ...

  8. Fakeapp 入门教程(3):参数篇

    参数可以让软件自由度更高.Fakeapp的参数并不算多,但是也非常使用.本文就讲解下几个重要的参数.参数设置界面可以通过点击SETTINGS打开. 参数修改无需点击保存,一旦修改直接生效. Proce ...

  9. 《鸟哥的Linux私房菜》学习笔记(0)——磁盘与文件系统管理

    一.Linux的登陆流程 login: 用户名:每个用户名都有一个用户ID(用户标识符),计算机处理的就是用户ID(数字)而不是用户名(字符),. 认证机制:Authentication,比如密码或者 ...

  10. [原]sencha touch之carousel

    carousel组件是个非常不错的东东,自带可滑动的效果,效果如下图 上面部分可以左右滑动,下面部分可以上下滑动,效果还是不错的,app程序中很有用的布局 代码如下: Ext.application( ...