题目链接:点击查看

题目大意:给出 nnn 个叶子结点和一个 n∗nn*nn∗n 的 LCALCALCA 矩阵,其中 LCALCALCA 表示的是最近公共祖先节点的权值,现在需要构造出一棵自顶向下权值严格递减的树

题目分析:
参考至:https://blog.csdn.net/liufengwei1/article/details/114298063

思路就是贪心去合并,类似于哈夫曼树那样,将所有的 LCALCALCA 从小到大排序,然后贪心去加

一开始以为所有点权都不一样,后来意识到是每一条链上的点权互不相同,这也就导致了不同链上的点权有可能是相同的,为了解决这个问题我们需要在排序的时候,当权值相同时,按照编号排序,不然会出现下述情况:

假设原本 555 为根节点, 1,2,3,41,2,3,41,2,3,4 为其四个儿子,也是叶子节点,显然四个叶子结点两两之间的 LCALCALCA 都是 555,如果我们先处理的 (1,2)(1,2)(1,2),此时正确的产生了两条边 5−>15->15−>1 和 5−>25->25−>2,接下来如果继续处理点对 (3,4)(3,4)(3,4) 的话,按照我们的算法,会产生出一个点 666 且产生出两条边 6−>36->36−>3 和 6−>46->46−>4,到最后会发现构造出来的并不是一棵树而是一个森林

假如我们按照编号排序,按照顺序依次处理点对 (1,2),(1,3),(1,4)(1,2),(1,3),(1,4)(1,2),(1,3),(1,4) 就不会出现上述问题了

剩下的就只需要维护连通性问题就可以了,这个用并查集就可以轻松解决

代码:

// Problem: D. Dogeforces
// Contest: Codeforces - Educational Codeforces Round 105 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1494/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int c[N],f[N],fa[N];
struct Node {int i,j,val;bool operator<(const Node& t)const {if(val!=t.val) {return val<t.val;} else {if(i!=t.i) {return i<t.i;} else {return j<t.j;}}}
};
int find(int x) {return f[x]==x?x:f[x]=find(f[x]);
}
void init() {for(int i=0;i<N;i++) {f[i]=i;}
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int n;read(n);vector<Node>node;for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) {int x;read(x);if(i<j) {node.push_back({i,j,x});} else {c[i]=x;}}}sort(node.begin(),node.end());int cnt=n;for(auto it:node) {int u=it.i,v=it.j,val=it.val;int xx=find(u),yy=find(v);if(xx==yy) {continue;}if(c[xx]<c[yy]) {swap(xx,yy);}//c[xx]>=c[yy]if(val==c[xx]) {//不用建新点f[xx]=f[yy]=fa[xx]=fa[yy]=xx;} else {c[++cnt]=val;f[xx]=f[yy]=fa[xx]=fa[yy]=cnt;}}cout<<cnt<<endl;for(int i=1;i<=cnt;i++) {printf("%d ",c[i]);}puts("");for(int i=1;i<=cnt;i++) {if(find(i)==i) {cout<<i<<endl;}}for(int i=1;i<=cnt;i++) {if(find(i)!=i) {printf("%d %d\n",i,fa[i]);}}return 0;
}

CodeForces - 1494D Dogeforces(贪心+构造)相关推荐

  1. Long Beautiful Integer CodeForces - 1268A(贪心构造)

    You are given an integer x of n digits a1,a2,-,an, which make up its decimal notation in order from ...

  2. 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

    题目传送门 1 /* 2 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 3 */ 4 /**************************************** ...

  3. 2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造

    题意: 给你n个小于101810^{18}1018的大数,问在可以再不改变序列位置,之改变数值中某数位的'9'变为'6'或将'6'变为'9',求的最终序列由小到大,且字典序最小. 题目: 链接:htt ...

  4. 【牛客 - 318G】LLLYYY的数字思维 与【牛客 - 289J】这是一个沙雕题II(贪心构造)

    题干: LLLYYY很喜欢写暴力模拟贪心思维.某一天在机房,他突然抛给了队友ppq一 个问题.问题如下: 有一个函数f (): int f(int x){     int tmp = 0;     w ...

  5. 常规贪心构造题 最多能完成排序的块 II

    这是 LeetCode 上的  最多能完成排序的块 II ,难度为 困难. Tag : 「贪心」 这个问题和"最多能完成排序的块"相似,但给定数组中的元素可以重复,输入数组最大长度 ...

  6. Codeforces 540B School Marks 【贪心构造】

    题目链接:Codeforces 540B School Marks Little Vova studies programming in an elite school. Vova and his c ...

  7. CodeForces - 1364C Ehab and Prefix MEX(贪心+构造)

    题目链接:点击查看 题目大意:给出一个数组 a ,要求构造一个数组 b ,使得 a[ i ] = MEX{ b[ 1 ] , b[ 2 ] , ... b[ i - 1 ] , b[ i ] },a[ ...

  8. CodeForces - 1265D Beautiful Sequence(贪心+构造+思维)

    题目链接:点击查看 题目大意:给出a个0,b个1,c个2,d个3,要求构造一种序列,使得数列两两之间绝对值之差等于1,若不能构造输出NO 题目分析:首先我们需要稍微讨论一下特殊情况,那就是对于两端的数 ...

  9. CodeForces - 1256C Platforms Jumping(贪心+构造)

    题目链接:点击查看 题目大意:现在固定人初始时在点0处,现在我们需要跨过长度为n的一条河,到达对岸的点n+1处,给出m个木板,我们可以将这m个木板随意摆放,但相对位置不能改变,并且只能互相接触而不能互 ...

最新文章

  1. Win10 无需安装虚拟机/双系统使用 linux
  2. 【云图】一键生成连锁店品牌地图
  3. java循环do while_Java中for、while、do while三种循环语句的区别介绍
  4. JSP学习笔记1:JSP生命周期
  5. python-gui-pyqt5的使用方法-6--lambda传递参数的方法:
  6. 导致W3WP进程会重起情况
  7. 互联网电视牌照商那点事
  8. 谷歌AdMob广告接入(插屏广告)
  9. [项目管理]关于风险管理的问题和可能过早的幼儿教育
  10. VMware报错:VMware Workstation 不可恢复错误: (vmx)
  11. Spring项目接口偶尔报404 Not Found
  12. 求阶乘序列前N项和(15分)
  13. vue中的方法 methods 定义时不要使用箭头函数
  14. OPPO手机新专利曝光!180°旋转摄像头,或能引领摄像新风尚
  15. 参加大数据培训有什么好处
  16. 固态LiDAR,半固态混合LiDAR,机械LiDAR
  17. 拥塞控制算法——BBR
  18. 如何格式化U盘?以及优盘格式化的恢复方法
  19. 山东省青岛市黄海学院计算机考试,2020年计算机考试通知
  20. 物业管理行业重大事项点评:融入基层治理,抬升单盘盈利曲线(20210106).PDF

热门文章

  1. RocketMQ实现原理
  2. ArrayBlockingQueue原理分析-itrs.elementDequeued()
  3. ArrayBlockingQueue原理分析-dequeue方法
  4. wait/notify的基本使用
  5. AOP 代理(AOP Proxy)
  6. Redis 分布式方案Redis Cluster
  7. spring编程式事务控制
  8. 内置方法-del方法和对象的生命周期
  9. 单例设计模式-Enum枚举单例、原理源码解析以及反编译实战
  10. 设置元素的宽和高 元素的left和top 元素卷曲出去的值 为元素绑定事件