Darnassus

题目描述

Even the World Tree must bow to the cycle of life. Everything born will die.

Archimonde has hurt it once, Sylvanas burnt it again.

Now the World Tree is slowly recovering.

The World Tree is burnt apart into n parts. Now it tries to rebuild itself.

Each part of the World Tree has an attribute pip_ipi​, and all pip_ipi​ (1≤i≤n)(1≤i≤n)(1≤i≤n) forms a permutation of 1,2,3...n1,2,3...n1,2,3...n.

For all 1≤i<j≤n1≤i<j≤n1≤i<j≤n, if the World Tree wants to grow an edge connecting part iii and part jjj directly, it needs to spend ∣i−j∣∗∣pi−pj∣|i-j|*|pi-pj|∣i−j∣∗∣pi−pj∣ energy. ∣x∣|x|∣x∣ means the absolute value of xxx.

The World Tree is very smart, so it will grow some edges such that all its n parts become connected (in other words, you can go from any part to any other part using only the edges that have been grown), spending the minimum energy.

Please calculate the minimum energy the World Tree needs to spend.

输入描述

The input consists of multiple test cases.

The first line contains an integer T(1≤T≤5)T (1≤T≤5)T(1≤T≤5) denoting the number of test cases.

For each test case, the first line contains a single integer n(1≤n≤50000)n(1≤n≤50000)n(1≤n≤50000).

The second line contains nnn integers pi(1≤pi≤n)p_i (1≤p_i≤n)pi​(1≤pi​≤n), it’s guaranteed that all pip_ipi​ forms a permutation.

输出描述

For each test case, output one line containing one integer indicating the answer.

输入样例:

2
5
4 3 5 1 2
10
4 7 3 8 6 1 9 10 5 2

输出样例:

7
24

题意

给定 nnn 个点编号为 1−n1-n1−n 以及一个 1−n1-n1−n 的排列 任意两个点 i,ji ,ji,j 之间存在一条边权为 ∣i−j∣∗∣pi−pj∣|i-j|*|pi-pj|∣i−j∣∗∣pi−pj∣ 的边 求将n个点联通的最小权值和

思路

∣i−j∣∗∣pi−pj∣|i-j|*|pi-pj|∣i−j∣∗∣pi−pj∣ 根据该式可知取 ∣i−j∣==1|i-j|==1∣i−j∣==1 的相邻两数连边权值 ≤n−1≤n-1≤n−1 故其中的一种构建生成树的方案是选择 n−1n-1n−1 条两两相邻的边。故最小生成树中必定不存在权值 >n−1>n-1>n−1 的边
证:若存在任意一条权值 >n−1>n-1>n−1 连通任意两个连通块
i)i)i) 两个联通块相邻 那么可以直接选择连通两个连通块相邻的两个点权值 ≤n−1≤n-1≤n−1
ii)ii)ii) 两个联通块不相邻 证明两连通块间存在其它的一个或多个连通块 将相邻的连通块使用权值 ≤n−1≤n-1≤n−1 的相邻边连同后又转化为第一种两个连通块相邻的情况
故选定的边满足 ∣i−j∣∗∣pi−pj∣|i-j|*|pi-pj|∣i−j∣∗∣pi−pj∣ ≤n−1≤n-1≤n−1
∣i−j∣|i-j|∣i−j∣ 或 ∣pi−pj∣|pi-pj|∣pi−pj∣ 两项必有一项 ≤(n−1)≤\sqrt{(n-1)}≤(n−1)​
可以在 O(nn)O(n\sqrt{n})O(nn​) 的时间内枚举出满足条件的边
i)i)i) ∣i−j∣|i-j|∣i−j∣≤(n−1)≤\sqrt{(n-1)}≤(n−1)​ 即两点的下标 ≤(n−1)≤\sqrt{(n-1)}≤(n−1)​
ii)ii)ii) ∣pi−pj∣|pi-pj|∣pi−pj∣ ≤(n−1)≤\sqrt{(n-1)}≤(n−1)​ 即两点的点权 ≤(n−1)≤\sqrt{(n-1)}≤(n−1)​
开两个数组分别记录枚举即可
最多可得到 2∗nn2*n\sqrt{n}2∗nn​ 条边 直接 sortsortsort 会 ttt
因选取的边权值都 ≤n−1≤n-1≤n−1 值域较小 所以可以采用链式前向星桶排
这样在 KruskalKruskalKruskal 求最小生成树时只需要从小到大枚举值域即可

Code

#include<bits/stdc++.h>
using namespace std;
#define __T int csT;scanf("%d",&csT);while(csT--)
#define endl '\n'
const int mod=998244353;
const double PI= acos(-1);
const double eps=1e-6;
const int N=2e5+7;long long x,ans;
int n,cnt,nd;
long long p[50003],id[500003];
int b[50003],dep[500003],h[50003];
int fd(int x)
{if(b[x]==x)return x;return b[x]=fd(b[x]);//路径压缩
}
struct node{int x,y,nx;
}e[24000003];void merge(int x,int y)
{x=fd(x);y=fd(y);if(dep[x]<dep[y]){b[x]=y;}else if(dep[x]==dep[y]){b[x]=y;++dep[y];}else{b[y]=x;}//按秩合并
}inline void sol()
{scanf("%d",&n);for(int i=1;i<=n;++i){b[i]=i;dep[i]=1;h[i]=-1;scanf("%d",&p[i]);id[p[i]]=i;}ans=0;cnt=0;nd=n-1;for(int i=1;i<n;++i){for(int j=1;j*j<=n&&i+j<=n;++j)//向后枚举 sqrt(n) 个点/值{x=abs(i-(i+j))*abs(p[i]-p[i+j]);if(x<n)//将边权小于等于 n-1 的放入对应权值的桶{e[++cnt].x=i;e[cnt].y=i+j;e[cnt].nx=h[x];h[x]=cnt;}x=abs(id[i]-id[i+j])*abs(i-(i+j));if(x<n){e[++cnt].x=id[i];e[cnt].y=id[i+j];e[cnt].nx=h[x];h[x]=cnt;}}}for(int i=1;i<n;++i)//从小到大枚举值域{for(int j=h[i];~j;j=e[j].nx){if(fd(e[j].x)!=fd(e[j].y)){merge(e[j].x,e[j].y);ans+=i;--nd;}if(nd==0)break;}}printf("%d\n",ans);
}
int main()
{//freopen("C:\\Users\\23122\\Desktop\\1.in","r",stdin);//freopen("C:\\Users\\23122\\Desktop\\out.txt","w",stdout);__Tsol();return 0;
}

22中超联赛day8 1007(hdu7226) Darnassus 并查集(按秩合并+路径压缩)+ 链式前向星桶排 + Kruskal求最小生成树相关推荐

  1. BZOJ4668: 冷战 [并查集 按秩合并]

    BZOJ4668: 冷战 题意: 给定 n 个点的图.动态的往图中加边,并且询问某两个点最早什 么时候联通,强制在线. 还可以这样乱搞 并查集按秩合并的好处: 深度不会超过\(O(\log n)\) ...

  2. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)

    题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...

  3. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并

    思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...

  5. 2020牛客多校G[并查集的两种思想,按秩合并+路径压缩]

    题目链接 题目大意:就是有n个点m条边,每次第i个点属于第i个联通块,现在有q次询问给你一个数o,如果o这个联通块没有相连的联通块就没什么事情发生,如果有的话,就将这几个点的联通块都并入o所在的联通块 ...

  6. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  7. acm -(并查集、启发式合并、gcd、枚举因子)2020 China Collegiate Programming Contest Changchun Onsite K. Ragdoll

    传送门 本题考虑直接对每个iii求出所有满足ij=gcd(i,j)i^j=gcd(i,j)ij=gcd(i,j)的jjj,然后存在ggg数组中,对于查询修改操作维护一个并查集即可,合并的时候采用启发式 ...

  8. 图论 + 并查集 ----最小生成树重构图 + 可撤销并查集 + set启发式合并 时间线上的离线求解 D. Graph and Queries

    解题思路 题目大意: 就是给你一个无向图,每个点都有一个权值,和qqq次询问 每次询问有两种操作 1 x:就询问从x点出发,能访问到的最大权值是多少,并把最大权值那个点的权值设置为0 2 x:就是删除 ...

  9. 并查集板子:acwing836. 合并集合

    文章目录 并查集原理 并查集代码实现 并查集原理 并查集的常用操作: 将两个集合合并 询问两个元素是否在同一个集合中 并查集在近乎O(1)的时间内完成以上两个操作. 基本原理:每个集合用一棵树表示.树 ...

最新文章

  1. docker配置cdn-容器内可以通过域名访问
  2. 网络卖家自曝黑幕 “信用刷手”欺骗你
  3. 一台服务器上起2个mysql服务
  4. CVPR 2021 | 港科大:如何利用闪光图像(flash image)来去除反光
  5. 一天一种设计模式(一)------观察者模式
  6. oracle迁移到mysql工具_oracle数据库想迁移到mysql上 有什么方法或者工具吗
  7. Android Studio之导入别人的module后config.gradle配置文件没有生效
  8. 远程管理服务器的具体操作方法
  9. 大数据实战之spark安装部署
  10. 使用cmd和excel完成批量复制所需文件夹和文件
  11. 怎么获取url_Requests库(十二)实战获取今日头条24小时热文
  12. 每页都有的表头和打印分页
  13. 计算机维修情况说明书,电脑坏了(电脑坏了情况说明)
  14. coxphfit+matlab,计算Cox比例风险模型的coxph和cph函数有什么区别?
  15. 计算机网络汇聚层,【大白电气】接入层、汇聚层、核心层——中大型计算机网络系统结构介绍及交换机选型建议...
  16. 1、RL Problem
  17. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)
  18. 仿企查查、天眼查 d3关联关系图 力项导图
  19. 如何组建权责明确、运营高效的数据团队
  20. 数据、数据库、数据库管理系统、数据库系统

热门文章

  1. matlab 高斯迭代代码_KLT目标跟踪学习与代码实现
  2. 济宁ISO9001认证带标与不带标的区别
  3. python数据分析三剑客
  4. 人工智能技术为教育带来什么?
  5. 随机算法-蒙特卡罗算法
  6. 如何接入一个全平台实时互动白板 1
  7. 钉钉企业应用开发指南
  8. ET工业大脑学习感悟
  9. python自动化脚本是什么意思_Python 自动化脚本学习(一)
  10. 【FAS-FRN】《Recognizing Multi-modal Face Spoofing with Face Recognition Networks》