首页 > 其他分享 >CF1672F2 Checker for Array Shuffling 题解

CF1672F2 Checker for Array Shuffling 题解

时间:2024-09-10 21:04:28浏览次数:9  
标签:ch int 题解 void Checker FF Array po define

题目链接

点击打开链接

题目解法

我怎么 F1 都不会做/ll

F1:
由原始值向最终值连边
如果是排列的话,操作次数显然为 \(n-\)环数
拓展到非排列的情况,即相同数之间的下标可以选择顺序,要求分出来的环数最大
直接考虑上面的这东西,让我进入了死胡同。。
先给出一个结论:最大环数的最小值是 出现次数最大值 \(mx\)
证明一下:因为每个环不能包含相同数,所以至少需要 \(mx\) 个环;如果多出一个环,必然由环不经过 \(mx\) 对应的数,这是不优的
构造考虑:把每个位置是从前往后第几个当前数 作为层数,每一层都从小往大连成一个环即可,具体细节见代码:

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=200010;
int a[N],cnt[N];
vector<int> po[N];
void work(){
    int n;read(n);
    F(i,1,n) cnt[i]=0,po[i].clear();
    F(i,1,n) read(a[i]),po[++cnt[a[i]]].pb(i);
    F(i,1,n){
        sort(po[i].begin(),po[i].end(),[&](int x,int y){ return a[x]<a[y];});
        F(j,0,SZ(po[i])-1) swap(a[po[i][j]],a[po[i][j+1]]); 
    }
    F(i,1,n) printf("%d ",a[i]);puts("");
}
int main(){
    int T;read(T);
    while(T--) work();
    return 0;
}

F2:
把出现次数最多的数删掉,然后建图,如果存在环,则 \(wa\),否则 \(ac\)
因为根据 F1,每个环中一定会包含出现次数最多的数,所以如果有环不包含它的话,那么一定 \(wa\)
时间复杂度 \(O(n)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=200010;
int a[N],cnt[N];
vector<int> po[N];
void work(){
    int n;read(n);
    F(i,1,n) cnt[i]=0,po[i].clear();
    F(i,1,n) read(a[i]),po[++cnt[a[i]]].pb(i);
    F(i,1,n){
        sort(po[i].begin(),po[i].end(),[&](int x,int y){ return a[x]<a[y];});
        F(j,0,SZ(po[i])-1) swap(a[po[i][j]],a[po[i][j+1]]); 
    }
    F(i,1,n) printf("%d ",a[i]);puts("");
}
int main(){
    int T;read(T);
    while(T--) work();
    return 0;
}

标签:ch,int,题解,void,Checker,FF,Array,po,define
From: https://www.cnblogs.com/Farmer-djx/p/18407187

相关文章

  • 【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?
    【JAVA线上问题解决】JAVA应用程序CPU持续飙高,如何排查问题,如何快速定位问题,解决问题?场景一、JAVA程序中某个线程占用CPU飙高,问题定位top、jstack命令的使用四步教你快速定位问题代码1.top命令获取异常的java进程PID   top2.查询异常进程中的线程情况,获取异常......
  • [ARC073F] Many Moves 题解
    [ARC073F]ManyMoves题解个人感觉其实还挺套路的题目。不配紫题。对于两个玩意在数轴上跑来跑去这种题目,常见的套路是固定一个点的位置,用另一个点的位置设为状态。对于本题,题目已经帮你固定了一个点,于是我们设\(dp_{x}\)表示一个点在当前要求的位置,另一个点在\(x\)的最小......
  • ABC370 DEF 题解
    ABC370DEF题解赛时过了ABCD,补题的时候发现EF其实也是简单题,为什么就做不出来呢?E这样简单的dp都做不出来,dp必须得多练啊!D-CrossExplosion题目链接对于每一行、列,我们要用一个数据结构来维护未被删除的点,并且要快速找到某一行/列中是否存在某个数,以及查询某个数的前......
  • 「NOI2021 D1T3 庆典」题解
    uoj675加强:\(\sumk\le6\times10^5\)暴力\(u\)在\(s\Rightarrowt\)路径上\(\iff\)正图上\(s\Rightarrowu\)且反图上\(u\Rightarrowt\)时间复杂度\(O((n+m)q)\)正解只关心可达性,不妨SCC缩点成DAG。注意到一个奇怪的条件:对于三座城市\(x,y,z\),若\(x\Right......
  • 题解:[USACO07DEC] Sightseeing Cows G
    洛谷P2868题目大意有个nnn个点,mmm条边的有向图,点有点权,边有边......
  • 力扣474-一和零(Java详细题解)
    题目链接:474.一和零-力扣(LeetCode)前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。如果大家感兴趣,......
  • luogu2516题解
    随机说话第一次交的时候写的版本是这个。下面在sum的计算上少了个else,遂出错。以后写的时候还是尽量简单点,主要是调试的时候好调。题目分析题目里面的公共子序列就是可以不连续可以为空的在字符串里出现顺序相同的子串。对于一个公共子序列,在找到最后一个公共的字符的时......
  • P4563 [JXOI2018] 守卫 题解
    P4563[JXOI2018]守卫题解不愧是九条可怜的\(\text{JXOI}\),只能说确实是道好题。假设当前我们在求\([l,r]\),我们不难发现\(r\)端点一定要放保镖,于是考虑\(r\)保镖的最大监视范围\([x,r]\)。由题意得到对于\([x,r]\)中的每个\(p_1,p_2,\cdots,p_k\),要求斜率\(t(p_i,......
  • 树上一些点的选 题解
    题意简述给你一棵\(n\)个节点以\(1\)为根的有根树,和一个整数\(m\)。对于树上每一个点\(u\),有三个权值\(X,Y,Z\)。你需要在\(u\)的祖先里(不含\(u\))中选出至少\(X\)个点,记\(S_1\)表示这些点到\(u\)的距离之和;在\(u\)的后代里(不含\(u\))中选出至少\(Y\)个点,......
  • CF717A Festival Organization 题解
    Description一个合法的串定义为:长度在\([l,r]\)之间,且只含0,1,并且不存在连续\(2\)个或更多的\(0\)。现在要选出\(k\)个长度相同的合法的串,问有几种选法,答案模\(10^9+7\)。\(1\leqk\leq200,1\leql\leqr\leq10^{18}\)。Solution容易发现答案为\(\sum_{i=l+2}^{r......