首页 > 其他分享 >AtCoder Grand Contest 010 E Rearranging

AtCoder Grand Contest 010 E Rearranging

时间:2024-01-20 22:58:26浏览次数:25  
标签:AtCoder typedef Contest int long 010 maxn define

洛谷传送门

AtCoder 传送门

赛时在想一些奇怪的东西,没想到建图。

考虑使用元素两两之间的相对顺序来描述序列。发现若 \(x, y\) 互质那么它们的相对顺序被确定了。

先把输入的序列从小到大排序。然后考虑互质的数之间先连一条无向边。那么先手要把无向边定向使得它是个 DAG,后手会求出这个 DAG 的最大拓扑序。也就是说先手要最小化这个 DAG 的最大拓扑序。

考虑把所有点的边按编号从小到大排序,然后从小到大遍历这个图,从小到大遍历出边,这样会形成一个生成森林,边从祖先定向到儿子即可。

考虑这样贪心为什么是对的。发现若先遍历更大的点 \(v_2\) 肯定不优,因为若先遍历更小的点 \(v_1\),说不定就在遍历 \(v_1\) 的过程中访问了 \(v_2\),就能使得不用添加 \(u \to v_2\) 的边。所以是不优的。

时间复杂度为 \(O(n^2 (\log V + \log n))\),\(\log V\) 为求 \(\gcd\) 复杂度。

code
// Problem: E - Rearranging
// Contest: AtCoder - AtCoder Grand Contest 010
// URL: https://atcoder.jp/contests/agc010/tasks/agc010_e
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<int, int> pii;

const int maxn = 2020;

int n, a[maxn], ind[maxn];
bool vis[maxn];
vector<int> G[maxn];

void dfs(int u) {
	vis[u] = 1;
	for (int v = 1; v <= n; ++v) {
		if (!vis[v] && __gcd(a[u], a[v]) > 1) {
			G[u].pb(v);
			++ind[v];
			dfs(v);
		}
	}
}

void solve() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
	}
	sort(a + 1, a + n + 1);
	for (int i = 1; i <= n; ++i) {
		if (!vis[i]) {
			dfs(i);
		}
	}
	priority_queue<pii> pq;
	for (int i = 1; i <= n; ++i) {
		if (!ind[i]) {
			pq.emplace(a[i], i);
		}
	}
	while (pq.size()) {
		int u = pq.top().scd;
		pq.pop();
		printf("%d ", a[u]);
		for (int v : G[u]) {
			if (!(--ind[v])) {
				pq.emplace(a[v], v);
			}
		}
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Contest,int,long,010,maxn,define
From: https://www.cnblogs.com/zltzlt-blog/p/17977276

相关文章

  • AtCoder Beginner Contest 337
    A-Scoreboard思路&&Code/*高桥和青木N场比赛xy得分情况分别为x1y1.....xnyn计算高桥的总得分与青木的总得分进行比较高桥得分>青木得分输出Takahashi==输出Draw<输出Aoki*......
  • AtCoder Beginner Contest 336
    AtCoderBeginnerContest33657秒切A,75秒切B。然后C就卡了,没想到五进制,二分答案加数位DP判断过了。用了半个小时。DE读完题,发现D可做。小推了一下发现可以维护线段树。很快写完过了样例。第一发罚时,\(+1\)和\(-1\)写反了。第二发罚时,把那个“金字塔”写成了......
  • 昆虫科学院 AtCoder Race Ranking 2023 Autumn
    概况为提高选手们的训练/比赛热情,我们(昆虫科学院)通过商讨,在\(2023-5-25\)仿照AtCoderRaceRanking(WTF)机制,设立了“昆虫科学院AtCoderRaceRanking2023”。该排行榜为\(2023\sim2024\)赛季的第二轮排行。校内参赛选手(按照学号排序)AtCoder用户名学号......
  • Petrozavodsk Summer 2019. Day 9. MEX Foundation Contest【杂题】
    比赛链接A.TheOnePolynomialMan给定模数\(p\)和\(0\simp-1\)的两个集合\(U,V\),求有多少个有序对\((a,b)\)满足:\(f(a,b)=\prod\limits_{z\inV}\left(\frac{(2a+3b)^2+5a^2}{(3a+b)^2}+\frac{(2a+5b)^2+3b^2}{(3a+2b)^2}-z\right)\equiv0\pmo......
  • 2020-2021 ICPC Southeastern European Regional Programming Contest (SEERC 2020)
    Preface最害怕的一集,徐神感冒身体不适只能口胡前半场,祁神中途也有事下机导致一段时间内只有我一个人在写题最后也是不负众望体现出没有队友我究竟是多么地彩笔,后面也索性开摆了直接后面3h梭哈写H题(主要写个假做法浪费很长时间)最后喜被卡常打完这场特意叫了一天休息,一是为了徐神......
  • Contest3376 - 2024寒假集训-排位赛竞赛(一)
    A:幂位和高精度。用高精度加法或乘法算出\(2^{1000}\),再将各位累加即为答案。#include<bits/stdc++.h>usingnamespacestd;#definecctieios::sync_with_stdio(0);cin.tie(0);cout.tie(0)stringAP_add(stringA,stringB)//高精度加法{intlena=A.size()......
  • AtCoder Beginner Contest 335
    A-2023(abc335A)题目大意给定一个字符串,将最后一位改成4。解题思路模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);strings;......
  • CodeForces & AtCoder rating 规则简述
    译者:rui_er,转载请注明出处。(备份自2020年11月2日的同名博客)本博客为了方便自己查阅,同时也方便大家了解,但因为我英语很菜,所以难免有翻译错的地方,还请评论区纠正。未注明资料来源的均为常识积累。1CodeForcesrating规则1.1CodeForcesrating与名字颜色换算设\(r\)......
  • The 2021 Sichuan Provincial Collegiate Programming Contest
    题目链接:The2021SichuanProvincialCollegiateProgrammingContestA.Chuanpai题意:定义每一张川牌包含两个数字x,y,并且1<=x<= y<=6,求牌面上数字之和为n的牌种类解题思路:签到,预处理枚举即可查看代码map<int,int>mp;voidinit(){ for(inti=1;i<=6;i......
  • AtCoder ABC 273 复盘
    AARecursiveFunction模拟,递归、递推、累乘都可以。我用的累乘。ACCodeBBrokenRounding也是模拟,每次将\(X\leftarrowX\div10^{i-1}\)后判断\(X\bmod10\)是否\(\geq5\),若是,\(X\leftarrowX+10\);若不是,不进行操作。最后再将\(X\div10\)输出。ACCodeC(K+1)-......