【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并
【Wannafly挑战赛4】F 线路规划
题目描述
这个组织掌握了整个帝国的地下力量,监察着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
说明
设(u、v、w)表示一条u到v,费用为w的线路。
则一共有(5、4、10)、(2、2、10)、(1、1、10)、(1、3、5)、(2、4、3)、(1、2、3)共6条线路。
选择第1、4、5、6条线路,可以成立特别行动组{1、2、3、4、5},费用之和为21
备注:
对于100%的数据:
1≤x[i],y[i],k[i]≤N,1≤L[i]≤i - 1,保证x[i]、y[i]号成员均至少有k[i]个上司,1≤w[i]≤109。
题解:看题意是想让你求一个类似最小生成树的东西,但是直接求肯定不行,我们考虑用什么方法来优化求最小生成树的过程。
最基本,也是最重要的第一思路就是倍增。我们用倍增把k拆成log段,每段的长度都形如$2^j$。然后我们从大到小考虑所有的j,将所有形如$2^j$的段放到一起跑最小生成树。然后将树边pushdown下去,继续做下一层,最后在第0层计算费用,时间复杂度$O(nlog^2_n)$。
然而n=250000,O(nlog2n)会TLE。我们考虑能否干掉一个log。我们想到哪到题?NOIP2016蚯蚓!我们可以先将所有边排序,再分段,这样每一段一开始就都是有序的了,并且pushdown下来的边也都是有序的,我们将这两种边分开存,最后归并一下就又是有序的了,时间复杂度就变成$O(nlogn)$了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=260000;
int n,m,ans1;
ll ans2;
int fa[20][maxn],f[20][maxn],Log[maxn],dep[maxn],siz[maxn];
ll sum[maxn];
struct edge
{
int a,b,w;
edge() {}
edge(int a1,int a2,int a3) {a=a1,b=a2,w=a3;}
};
struct node
{
int a,b,k,w;
}p[maxn];
vector<edge> s1[20],s2[20];
vector<edge>::iterator i1,i2,it;
bool cmp2(const node &a,const node &b)
{
return a.w<b.w;
}
int find(int x,int y)
{
return (f[y][x]==x)?x:(f[y][x]=find(f[y][x],y));
}
inline void updata(int a,int b,int x,int w)
{
if(find(a,x)!=find(b,x)) f[x][f[x][a]]=f[x][b];
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
register int i,j,a,b,k,w;
dep[1]=1;
for(i=2;i<=n;i++) fa[0][i]=rd(),dep[i]=dep[fa[0][i]]+1,Log[i]=Log[i>>1]+1;
for(i=1;i<=n;i++) f[0][i]=i;
for(j=1;(1<<j)<=n;j++) for(i=1;i<=n;i++) fa[j][i]=fa[j-1][fa[j-1][i]],f[j][i]=i;
for(i=1;i<=m;i++) p[i].a=rd(),p[i].b=rd(),p[i].k=rd(),p[i].w=rd();
sort(p+1,p+m+1,cmp2);
for(i=1;i<=m;i++)
{
a=p[i].a,b=p[i].b,k=p[i].k,w=p[i].w;
for(j=Log[k];j>=0;j--) if(k>=(1<<j))
k-=(1<<j),s1[j].push_back(edge(a,b,w)),a=fa[j][a],b=fa[j][b];
}
for(i=1;i<=n;i++) siz[i]=1;
for(j=Log[n];j>=0;j--)
{
for(i1=s1[j].begin(),i2=s2[j].begin();i1!=s1[j].end()||i2!=s2[j].end();)
{
if(i1!=s1[j].end()&&(i2==s2[j].end()||(*i1).w<(*i2).w)) it=i1,i1++;
else it=i2,i2++;
a=(*it).a,b=(*it).b,w=(*it).w;
if(find(a,j)!=find(b,j))
{
if(j==0) siz[f[j][b]]+=siz[f[j][a]],sum[f[j][b]]+=sum[f[j][a]]+w;
f[j][f[j][a]]=f[j][b];
if(j) s2[j-1].push_back(edge(a,b,w)),s2[j-1].push_back(edge(fa[j-1][a],fa[j-1][b],w));
}
}
}
for(i=1;i<=n;i++) if(find(i,0)==i)
{
if(siz[i]>ans1) ans1=siz[i],ans2=sum[i];
if(siz[i]==ans1) ans2=min(ans2,sum[i]);
}
printf("%d %lld",ans1,ans2);
return 0;
}
【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并的更多相关文章
- Wannafly #4 F 线路规划
数据范围252501 劲啊 Q国的监察院是一个神秘的组织. 这个组织掌握了整个Q国的地下力量,监察着Q国的每一个人. 监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只听从其上直接司的命令 ...
- [nowcoder_Wannafly挑战赛4_F]线路规划
[nowcoder_Wannafly挑战赛4_F]线路规划 试题描述 Q国的监察院是一个神秘的组织. 这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人. 监察院一共有 \(N\) 个成员,每一个 ...
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- iOS调用第三方导航和线路规划
线路规划: https://blog.csdn.net/qq_19979539/article/details/51938995 百度地图:baidumap: 高德地图:iosamap: 腾讯地图:q ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- Wannafly挑战赛24游记
Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...
- Wannafly挑战赛25C 期望操作数
Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...
随机推荐
- LINQ操作符四:排序操作符
Linq中的排序操作符包括OrderBy.OrderByDescending.ThenBy.ThenByDescending和Reverse,提供了升序或者降序排序. 一.OrderBy操作符 Ord ...
- 公司名称后缀 Inc. Co.,Ltd.
Inc. = Incorporated Co.,Ltd."连在一起为Company Limited,就是有限公司,或者有限责任公司.“Co”后面的“.”是英文中表示词语短缩省略的符号,而“C ...
- 修改jdk
(一)修改jdk的path: (二)修改eclipse里面的jre环境 (三)修改具体项目的jre环境 build path -> config build path (四)修改服务运行环境
- 常用HQL(Hibernate Query Language)查询
查询一个对象(实体类必须有一个不带参数的构造方法) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void test01() ...
- android 创建 xml文件
android创建xml文件的方法. 要操作android的外部存储,所以要在AndroidManifest.xml文件中添加权限. <uses-permission android:name= ...
- (转)从海康7816的ps流里获取数据h264数据
海康7816使用ps流来封装h.264数据,这里使用的解码器无法识别ps流,因此需要将h264数据从ps流里提取出来 对于ps流的规定可以参考13818-1文档 这里从7816里获取到一些数据取样 0 ...
- c#调用cmd
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- js 动态设置 option 的selected 选项
思路:通过for循环判断每个选项,一旦满足条件则设置其selected属性为true即可,关键代码: var obj = document.getElementById(select_id); for ...
- 桥接模式(bridge pattern)-------结构型模式
桥接模式是一种对象结构型模式,其将抽象部分和它的实现部分分离,使它们都可以独立的变化,又称为柄体(Handle and Body)模式或接口(Interface)模式. 优点: 1.分离抽象接口及其实 ...
- 怎样设置easyui中datagrid行高
$('#face_table2').datagrid({ title: '信息', iconCls: 'icon-save', url: 'callro ...