首页 > 其他分享 >acwing.第72场周赛 t3最小移动距离

acwing.第72场周赛 t3最小移动距离

时间:2022-10-10 11:46:22浏览次数:84  
标签:周赛 入度 int LL 查集 t3 long 72 find

AcWing 4626. 最小移动距离

原题链接:https://www.acwing.com/problem/content/4629/

思路

要求对于每一个点x都满足走过t,到达一个目标点y.并且x和y都可以互为目标点。
找出t的最小值。

每一个点的出度为1.易得,互为目标点的点必须在同一个环上才可以满足条件。

维护一个并查集(一个集合就是一个环),维护每个点的入度,维护每个并查集的大小(环的长度)

只看一个环的t:
如果一个环中点的个数为偶数个,那么答案可以是len/2
如果一个环中点的个数为奇数个,那么答案只能是len

n个点可以分为若干个环,最终的答案是这些个环的最小公倍数
此题需要考虑,n分为若干个数之后,这若干个数的最小公倍数会不会爆int,会不会爆long long(爆longlong要开高精度)

n = [a1,a2,...ak],要使得a1 * a2 * ... * ak最大,把n尽量分得更多的3,剩下的用2去凑,这样的使得积最大(结论).
本题n最大100,那分为32个3,2个2。最坏情况为3^32 * 4 =>9 ^ 16 * 4 小于 10 ^ 16 * 4,不会爆longlong

代码
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

typedef long long LL;
const int N = 110;

int d[N],p[N],s[N]; // 记录入度,并查集数组,环的长度
int n;

int find(int x)
{
    if(p[x] != x) p[x] = find(p[x]); // x的父亲结点置为祖宗结点
    return p[x]; 
}

LL gcd(LL a,LL b)
{
    return b ? gcd(b,a%b) : a;
}

LL get()
{
    // 检查所有入度是否都是1(是否都是环)
    for(int i = 1; i <= n; i++)
    {
        if(d[i] != 1) return -1;
    }
    
    // 计算答案 每个环的最小公倍数
    LL res = 1;
    for(int i = 1; i <= n;i ++)
    {
        if(p[i] == i) // 如果是环的起点
        {
            int len = s[i];
            if(len % 2 == 0) len /= 2;
            res = (res * len) / gcd(res,len);
        }
    }
    return res;
}

int main()
{
    cin >> n;
    
    // 并查集初始化
    for(int i = 1; i <= n; i ++)
    {
        p[i] = i;
        s[i] = 1;
    }
    
    // 并查集合并
    for(int i = 1; i <= n; i ++)
    {
        int x;
        cin >> x;
        d[x] ++; // x入度+1
        int a = find(i),b = find(x);
        if(a != b) // 如果没有在一个集合里就放进
        {
            p[a] = b;
            s[b] = s[b] + s[a];
        }
    }
    
    cout << get() << endl;
    
    return 0;
}

标签:周赛,入度,int,LL,查集,t3,long,72,find
From: https://www.cnblogs.com/rdisheng/p/16775103.html

相关文章

  • CSP第27次认证 T3:防疫大数据
    题目直接暴力模拟。首先对于每一个地区,选择用map进行离散化,并直接存储其对应区间信息,使用pair即可。在新输入一个疫情地区时,检查是否与原天数相连即可(同时注意判断b......
  • P6772 [NOI2020] 美食家 题解
    一道不错的题目。一个朴素的dp就是\(f_{i,x}\)表示时间\(i\)时从1走到\(x\)的最大美味值,就有转移\(f_{i,v_j}=\max\{f_{i-w_j,u_j}+c_{v_j}+美食节贡献\}\),结......
  • ABC 272 E Add and Mex(调和级数 暴力)
    EAddandMex(调和级数暴力)题意:​ 给出一个长度为n\(\le1e5\)的数组a,每秒对数组中的数加上其下标,例如\(a_i\)在第一秒为\(a_i+i\),第二秒为\(a_i+2i\)。请输出前m\(\le......
  • ABC272 做题笔记
    打得比较漂亮的一场,光速过ABCDE,但是FGH都太过神仙,EX干脆赛时只有两人AC/kkAProblemlink->https://atcoder.jp/contests/abc272/tasks/abc272_a。Solution按题意......
  • The valid characters are defined in RFC 7230 and RFC 3986
    Invalidcharacterfoundintherequesttarget.ThevalidcharactersaredefinedinRFC7230andRFC3986@BeanpublicConfigurableServletWebServerFactorywebSe......
  • AtCoder Beginner Contest 272(A~E)
    Avoidsolve(intCase){intn;cin>>n;vector<int>a(n);for(auto&i:a)cin>>i;cout<<accumulate(all(a),0)<<nline;}Bconst......
  • 「题解」Codeforces 1572B Xor of 3
    我知道你很急,但你先别急。我急了我急了我急了。如果直接上去莽构造的话,很可能就是像我一样大分讨的后果。先特判掉全是1,或者1的个数是奇数的情况。我的做法是考虑所......
  • Solution -「CSTC 2017」「洛谷 P3772」游戏
    \(\mathscr{Description}\)  有\(n\)个随机真值\(x_{1..n}\),已知\(P(x_1=1)=p_1\),对于\(2\lei\len\),\(P(x_i=1\midx_{i-1}=1)=p_i\),\(P(x_i=1\midx_{i......
  • AtCoder Beginner Contest 272 D Root M Leaper
    RootMLeaper\(bfs\)模拟先把能走的矩阵预处理出来,然后直接跑\(bfs\)要注意各种边界#include<iostream>#include<cstdio>#include<array>#include<queue>us......
  • abc272_f Two Strings (后缀数组)
    https://atcoder.jp/contests/abc272/tasks/abc272_f将SS#TT在字符串中排序,看标号为1-n后面有多少2n+2-3n+1的标号然后就会注意题目要的是小于等于,那么要拼成SS......