【题解】P1963 [NOI2009]变换序列

该博客介绍了P1963 [NOI2009]变换序列的问题,讨论了在竞赛中遇到该问题时,从搜索到发现正确解决方案——使用二分图匹配的过程。博主解释了如何通过二分图匹配来解决序列变换,提到了匈牙利算法在维持字典序最小中的应用,并提供了详细的学习资源。
摘要由CSDN通过智能技术生成

https://www.luogu.org/problemnew/show/P1963

变换序列
【问题描述】
对于N个整数0,1,…,N-1,一个变换序列T可以将i变成Ti,其中:Ti∈{0,1,…,N-1}且 {Ti}={0,1,…,N-1}。 x,y∈{0,1,…,N-1},定义x和y之间的距离D(x,y)=min{|x-y|,N-|x-y|}。给定每个i和Ti之间的距离D(i,Ti),你需要求出一个满足要求的变换序列T。如果有多个满足条件的序列,输出其中字典序最小的一个。
说明:对于两个变换序列S和T,如果存在p<N,满足:对于i=0,1,…,p-1,Si=Ti且Sp<Tp,我们称S比T字典序小。
【输入】
输入文件中的第一行为一个整数N,表示序列的长度。
接下来的一行为N个整数Di,其中:Di表示i和Ti之间的距离。
【输出】
如果至少存在一个满足要求的变换序列T,则输出一行为N个整数,表示你计算得到的字典序最小的T;否则输出“No Answer”(不含引号)。
【输入输出样例】
transform.in transform.out
5
1 1 2 2 1
1 2 4 0 3
【数据说明】
对于30%的数据,满足:N<=50;
对于60%的数据,满足:N<=500;
对于100%的数据,满足:N<=10000。

这道题,首先我们先看一下题目,考场上遇到时候,第一反应是用搜索,于是。。。打了个搜索。。。然后完美的由于复杂度爆了。。(搜索应该三十分,但我的复杂度感人只有十分

搜索就不多说,直接讲一下正解,正解是用二分图匹配。
每个元素可以和另外两个元素对应,两个集合相互可以链接,集合内部没有联系,这就形成了一个很好的二分图匹配,二分图的匹配如果不知道的话emmmm。。。。https://blog.csdn.net/dark_scope/article/details/8880547 大佬讲解的匈牙利算法
知道了这是二分图,那么就有了一个大致思路,但是,字典序该如何维护呢,我们考虑匈牙利算法的原理,能连则连(这是一种贪心的思想)那么后面连上的会找到最小的可以连上的对象,所以,我们只需要反向搜,就可以找到最小字典序了

#include<iostream>
#include<cstdio>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FR(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值