首页 > 其他分享 >ARC111C Too Heavy 题解

ARC111C Too Heavy 题解

时间:2023-02-18 08:55:22浏览次数:57  
标签:Heavy std int 题解 ARC111C 体重 物品 using include

无解的情况:当且仅当一个人手上的物品不是自己的物品,并且这个物品的质量大于自己的体重,这个不是自己的东西就卡手了,换不出去,无解。
甲手上是乙的物品。乙的手上是丙的物品,丙的手上是丁的物品,丁的手上是甲的物品,那么甲乙丙丁就形成了一个环,置换环。由于每个人手上的物品(即 \(p_i\))是个排列,所以原序列肯定可以划分为多个置换环,那么只要思考对于每个置换环怎么做就行了。
找到环内体重最大的,然后按照环的顺序每次把下一个人和体重最大的交换手中的物品就行了。
在这个交换过程中会不会出现卡手的情况呢?除去体重最大的那个人,环内的其他人都只交换了一次。如果一次都不能交换已经判定过了。而体重最大的如果会卡手,那这个物品是比环内所有人的体重都大的,而这种情况也判定过了。所以无解的情况只有一种。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define siz(x) int((x).size())
#define all(x) std::begin(x),std::end(x)
using std::cin;using std::cout;
using pii=std::pair<int,int>;
using bsi=std::basic_string<int>;
constexpr int N=200001;
int n,a[N],b[N],p[N];
bool t[N];
bsi r;
std::vector<pii>ans;
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);cin.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=1;i<=n;i++)
		if(cin>>p[i],p[i]!=i&&b[p[i]]>=a[i])
			return cout<<"-1",0;
	for(int i=1;i<=n;i++)if(!t[i]){
		r.clear();
		for(int j=i;!t[j];j=p[j])
			t[j]=true,r+=j;
		int k=*max_element(all(r),[](int x,int y){
			return a[x]<a[y];});
		for(int j=k;p[j]!=k;j=p[j])
			ans.emplace_back(k,p[j]);
	}
	cout<<siz(ans)<<'\n';
	for(auto[u,v]:ans)cout<<u<<' '<<v<<'\n';
	return 0;
}

标签:Heavy,std,int,题解,ARC111C,体重,物品,using,include
From: https://www.cnblogs.com/bxjz/p/ARC111C.html

相关文章

  • NOIP2022 简要题解
    前言作为一名退役OIer,借着此比赛来复健。大部分题目都是口胡(没啥好写的),spj题手写了代码,A了。难度不算特别高,但是赛场上拿到高分略有压力(退役了可以瞎bb)。个人认为应该......
  • 题解 CF690C2
    题目大意:给你一棵树,求一下直径题目分析:emm,怎么说吧,就是树的直径的裸板子。可能有人不大理解,明明是图,你为什么要说是给定一棵树。大家可以自行验证一下,满足如下两个性......
  • 题解 CF690C1
    题目大意:给定一张\(n\)个点\(m\)条边的无向图,判断这是不是一棵树。题目分析:两种思路:思路一:不需要建图,直接使用并查集判环即可最后判断一下图联不联通就行,具体方......
  • 一个autoreconf的报错问题解决
    报错如下configure.ac:36:error:possiblyundefinedmacro:AC_CHECK_LIBIfthistokenandothersarelegitimate,pleaseusem4_pattern_allow.Seet......
  • 题解 CF637B
    题目大意:维护个栈,去重保留最上层题目分析:啥也不是,数组模拟\(\text{stack}+\text{unordered\_map}\)直接秒掉。复杂度\(O(n)\)代码实现:#include<bits/stdc++.h>......
  • 题解 CF742B
    题目大意:给定\(n\)个数,找数对使其异或值为\(k\),求满足这样数对的个数。题目分析:考验位运算功底的题目(实际上也不是很难),主要运用到了下列性质:\[\begin{aligned}\bec......
  • 20230207模拟赛题解
    A-CF755D考虑每次加边产生的贡献。发现每次加边的贡献是这条边与别的边的交点数量加\(1\)。所以可以用线段树或树状数组等数据结构维护,注意要令\(k=\min(k,n-k)\)。B-......
  • CAD坐标显示不全怎么办?CAD坐标常见问题解答!
    今天小编来和大家聊一下浩辰CAD看图王中关于CAD坐标的那些事,比如:CAD坐标为何显示不全?CAD坐标显示结果和之前不一样?以及不能精准捕捉CAD坐标等情况,应该如何轻松解决?今天就和......
  • 0210 模拟题解
    0210模拟题解t1直接枚举\(k\),考虑计算答案。首先发现这个限制等价于存在长度\(\gen-k\)的上升子段。那我们反过来,计算所有上升子段长度都\(\len-k-1\)的方案数......
  • CF、AT 杂题题解
    CF1455Fsolution1前\(i\)次操作只会影响到\([1,i+1]\),并且在第\(i\)次操作前,原本在位置\(i\)的数只可能在\(i\)或\(i-1\)。于是就可以考虑设\(f_{i,0/1}\)......