首页 > 其他分享 >Codeforces 1672 F1. Array Shuffling

Codeforces 1672 F1. Array Shuffling

时间:2022-10-25 20:14:37浏览次数:61  
标签:F1 数列 int Codeforces back Array now 200005 size

题意

给一个n个数的数列a,a[i]<=n

定义一个操作:每次可以交换任意位置的两个值;

定义最优操作:对于任意一个原数列的一组排列,使其通过尽可能少的操作变回原数列;

求构造一组原数列的一组排列,使得在最优操作下操作次数尽可能多;

一开始读,都错题了,读成交换智能交换相邻点,一直在考虑逆序对,终于写出来了以后,一直wa,才发现原来是任意点交换

提示

1. 考虑每个点的值没有重复的话,那么很简单,直接构建一个环就好了,操作次数N-1
2. 考虑到有两个相同数值的在一个环里的话,那么就可以分裂成两个环,这样最优解的个数就能减一
3. 因此只需要每次构建一个环,把所有数值的点每次囊括进去一个,直到没有环就好了

#include<bits/stdc++.h>

using namespace std;
vector<int> G[200005];
int a[200005], b[200005];

void run() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        G[i].clear();
    }
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        a[i] = x;
        G[x].emplace_back(i);
    }
    set<int> cnt;
    for (int i = 1; i <= n; i++) {
        if (G[i].size())cnt.emplace(i);
    }
    int sum = 0;
    while (sum < n) {
        vector<int> now, u;
        for (auto k: cnt) {
            now.emplace_back(G[k].back());
            G[k].pop_back();
            if (G[k].size() == 0) {
                u.emplace_back(k);
            }
        }
        sum += now.size();
        for (int i = 0; i < now.size() - 1; i++) {
            b[now[i + 1]] = a[now[i]];
        }
        b[now[0]] = a[now[now.size() - 1]];
        for (auto k: u)cnt.erase(k);
    }
    for (int i = 1; i <= n; i++)cout << b[i] << " \n"[i == n];
}

int main() {
    int t;
    cin >> t;
    while (t--)
        run();
    return 0;
}

标签:F1,数列,int,Codeforces,back,Array,now,200005,size
From: https://www.cnblogs.com/4VDP/p/16826132.html

相关文章

  • Codeforces Round #802 (Div. 2)C. Helping the Nature(差分)
    题目链接题目大意:给你一个有n个元素的数组a,你可以通过一下三种操作使数组的每一个值都为0:选择一个下标i,然后让a[1],a[2]....a[i]都减一;选择一个下标i,然后让a[i......
  • Codeforces Round #829 (Div. 2) A-E
    比赛链接A题解知识点:枚举。只要一个Q后面有一个A对应即可,从后往前遍历,记录A的数量,遇到Q则数量减一,如果某次Q计数为0则NO。时间复杂度\(O(n)\)空间复杂度\(O(1)\)......
  • Jmeter - JsonObject&JsonArray的使用
    需求背景:重复请求一个接口,提取返回的产品型号,按序打印。当返回的数据有产品型号时才能用JSON提取器提取到结果,当返回的数据没有产品型号时想输出"-",因此采用BeanShell后......
  • CF1062E
    \(*\text{Defficult:}\color{Gold}{2300}\)Description给定一棵\(n\)个节点的树,有\(q\)个询问,每次询问给出一个区间\(l,r\)。要求在编号在\([l,r]\)范围内的点......
  • Codeforces Round #830 (Div. 2) C1
    C1.Sheikh(Easyversion)显然对于添加一个数进入区间是只增不减的这就提醒了我们此题具有单调性我们最后的答案肯定就是这一整个区间我们考虑怎么找到最小的答案相......
  • Codeforces Round #756 (Div. 3) F
    F.ATMandStudents金典对于一个区间我们不能让他+的过程中出现负数我们ST表处理前缀和区间最小数然后再二分长度暴力枚举左右端点时间复杂度是O(nlogn)哦还要注意的......
  • CF1738F Connectivity Addicts
    CF1738FConnectivityAddicts给定\(n\)个点的度数,你需要在\(n\)次询问内给出一种涂色方案,使得每个颜色都满足\(s_c\leqn_c^2\),其中\(s_c\)表示所有点的度数和,......
  • CF1743B Permutation Value
    题链:cfluogu构造。Description构造一个\(1\simn\)的排列,使之连续子串构成\(1\simk\)排列的数目最少。Analysis显然,最小数目可以为\(2\)。因为可以构造所示......
  • CF1156E Special Segments of Permutation
    题目链接:​​传送门​​直接枚举最大值往左右扩就过了,,*/#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<algorit......
  • CF1092F Tree with Maximum Cost
    题目链接:​​传送门​​是​​这个题​​​的一个变形就是最小值改成最大值懒了直接改了改当时的代码当时的题解里也有解析#include<iostream>#include<cstdio>#inclu......