首页 > 其他分享 >Solution - Atcoder AGC010E Rearranging

Solution - Atcoder AGC010E Rearranging

时间:2024-07-06 19:09:09浏览次数:8  
标签:Atcoder AGC010E int Solution vis maxn 有连边 互质

因为只有相邻的互质的 \(a_i\) 可以交换,那么就说明不互质的 \(a_i\) 无法相交换,对应的位置关系也就不会改变。

于是可以考虑图论建模,对于 \(\gcd(a_i, a_j) > 1\),连边 \((i, j)\)。
那么对于先手,就相当于要把这些边定向,变为一个 DAG
而后手因为要保证最大,所以肯定是在 DAG 上跑拓扑的时候每次去取最大的点。

于是就考虑先手如何使得后手弄出来的最小。
那么首先,对于一个连通块,先手肯定会把最小的数 \(x\) 放在最前面,因为后面大的就换不到前面来了。
其次,考虑找到与 \(x\) 有连边的 \(y\),那么选上 \(y\),这样就能保证选完 \(x\) 后让后手选到的尽量小了,然后同样的递归 \(y\) 去处理。
若此时还有与 \(x\) 有连边的点没有被确定,又从中选最小的递归下去。
这部分的正确性相当于是保证了,越小的点能够走出去的点是越广的,对于后手选大的贪心就会使得选最大的后面能走的点相对来说没那么广和优,所以是对的。

时间复杂度 \(\mathcal{O}(n^2\log V + n\log n)\),\(V\) 为值域。

#include<bits/stdc++.h>
const int maxn = 2e3 + 10;
int n;
int a[maxn], vis[maxn];
std::vector<int> to[maxn];
void dfs(int u) {
   vis[u] = 1;
   for (int v = 1; v <= n; v++)
      if (! vis[v] && (! u || std::__gcd(a[u], a[v]) > 1))
         to[u].push_back(v), dfs(v);
}
int main() {
   scanf("%d", &n);
   for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
   std::sort(a + 1, a + n + 1);
   dfs(0);
   std::priority_queue<int> Q;
   for (int u : to[0]) Q.push(u);
   for (int i = 1, u; i <= n; i++) {
      u = Q.top(); Q.pop();
      printf("%d ", a[u]);
      for (int v : to[u]) Q.push(v);
   }
   return 0;
}

标签:Atcoder,AGC010E,int,Solution,vis,maxn,有连边,互质
From: https://www.cnblogs.com/rizynvu/p/18287584

相关文章

  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359这场我赛时打的非常不好,只做出了\(2\)题。A-CountTakahashi签到//Problem:A-CountTakahashi//Contest:AtCoder-UNIQUEVISIONProgrammingContest2024Summer(AtCoderBeginnerContest359)//URL:https://atcoder.jp/conte......
  • Solution
    (解决方案)可行性研究报告暨设计方案-zengwenfeng.doc基本上都要300-500多页,大型【纯软件】,县级0-200万,市级项目500-1500万不等,省部级1000-10000万不等都有。本例为过往已完成项目案例目录结构。搞方案都要准备1-3个月呢。所以工作量出来,费用各地不同而已,单从人工投入......
  • Solution - Atcoder AGC034F RNG and XOR
    考虑到这个边权是\(\oplus\),那么说明对于\((u,v)\),\(u\tov\)和\(v\tou\)的边权实质是相同的。那么对于\(0\tox\),就可以反过来,记录下对应的路径,从\(x\)开始走,那么第一次走到\(0\)的时候也就是从\(0\)第一次走到\(x\)的时候。于是就转化为了\(x\)为起点,第一次......
  • AtCoder Beginner Contest 043
    D-Unbalanced只需要找到形如\(XX\)、\(XYX\)的字串即可。即两个相同字符之间最多间隔一个字符。证明:若不然,\(AXYA\),每加一个字符\(A\),都要增加多余字符\(XY\),不可能符合要求。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios......
  • AtCoder Beginner Contest 042
    C-Iroha'sObsession用一个\(\rmst\)数组把每一位标记,然后枚举大于\(n\)的数,一旦有各位都满足要求的数出现就\(\rmbreak\)。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;boolst[10];boolcheck(intx){ while(x){ intb=x%1......
  • Atcoder ABC091D Two Sequences
    首先根据\(\operatorname{xor}\),就想到拆成二进制的\(a_{i,w},b_{i,w}\)来处理。类似竖式加法,考虑把得到的结果\(c_{w}\)分为\(a_{i,w}+b_{j,w}+x\),其中\(x\)就是上一位的进位。进一步的,发现对于总的\(c_{w}\),\(a_{i,w},b_{j,w}\)肯定都在这个位置加了\(......
  • Atcoder ARC090F Number of Digits
    记\(n\)为题面的\(S\)。能发现对于\(f(l)=8\),共有\(9\times10^7\)个数。此时就已经有\(8\times9\times10^7>10^8=n_{\max}\)了,就说明不存在\(f\ge8\)的情况,还满足这部分对应的数能全被选满。所以可以知道对于\(f(l)\ge8\)的情况,只存在\(f(r)-f(l)=......
  • AtCoder Beginner Contest 359 (A ~F)
    A-CountTakahashiQuestion:给你n个单词,要么是Takahashi,要么是Aoki;输出有几个Takahashi即可。Code:#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineintlonglongtypedeflonglongll;typedefunsignedlonglongull;typedefpair<......
  • Atcoder ABC 360 全题解
    致歉对不起,我不应该在全题解的编写上咕咕咕两个月,导致流量大量流失。我知错了,下次还犯。AB无C考虑一个箱子里的所有球,我们需要把这些球放进互不相同的一些箱子里。然而我们可以留一个球在箱子里,显然留重量最大的最好,所以答案就是$\sum_{i=1}^{N}W_i$减去每个箱子里的最......
  • AtCoder Beginner Contest 360
    A-AHealthyBreakfast(abc360A)题目大意给定一个字符串包含RMS,问R是否在S的左边。解题思路比较R和S的下标,谁小即谁在左边。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);......