BZOJ 1562 [NOI2009]变换序列:二分图匹配

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1562

题意:

  给定n,定义D(x,y) =  min(|x-y|, n-|x-y|),然后给定数组d[i] = D(i,T[i])。

  让你求一个0到n-1的排列T,下标i∈[0,n-1],满足给定的D(i,T[i]),且字典序最小。

  若没有答案输出"No Answer"。

题解:

  其实就是让你求一个排列T,其中T[i]要么填(i+d[i])%n,要么填(i-d[i]+n)%n。

  所以对于每个i,向它能填的两个数连边,跑一边最大匹配即可。

  又因为要求字典序最小,所以对于每个i连边时,应先连向较小的那个数。然后跑匈牙利的时候按从n-1到0的顺序跑即可。

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <vector>
 5 #define MAX_N 10005
 6
 7 using namespace std;
 8
 9 int n;
10 int d[MAX_N];
11 int vis[MAX_N];
12 int mat[MAX_N];
13 int rmat[MAX_N];
14 int edge[MAX_N][2];
15
16 bool hungary(int now,int cnt)
17 {
18     for(int i=0;i<2;i++)
19     {
20         int temp=edge[now][i];
21         if(vis[temp]!=cnt)
22         {
23             vis[temp]=cnt;
24             if(mat[temp]==-1 || hungary(mat[temp],cnt))
25             {
26                 mat[temp]=now;
27                 rmat[now]=temp;
28                 return true;
29             }
30         }
31     }
32     return false;
33 }
34
35 int main()
36 {
37     cin>>n;
38     for(int i=0;i<n;i++)
39     {
40         cin>>d[i];
41         if(d[i]>n/2)
42         {
43             cout<<"No Answer"<<endl;
44             return 0;
45         }
46         int x=(i+d[i])%n;
47         int y=(i-d[i]+n)%n;
48         edge[i][0]=min(x,y);
49         edge[i][1]=max(x,y);
50     }
51     memset(vis,0,sizeof(vis));
52     memset(mat,-1,sizeof(mat));
53     for(int i=n-1;i>=0;i--)
54     {
55         if(!hungary(i,i+1))
56         {
57             cout<<"No Answer"<<endl;
58             return 0;
59         }
60     }
61     for(int i=0;i<n;i++) cout<<rmat[i]<<" ";
62     cout<<endl;
63 }

原文地址:https://www.cnblogs.com/Leohh/p/8439186.html

时间: 2024-11-05 02:21:08

BZOJ 1562 [NOI2009]变换序列:二分图匹配的相关文章

Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文件:transform.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换序列T.如果有多个满足条

【BZOJ1562】【jzyzOJ1730】【COGS409】NOI2009变换序列 二分图匹配

[问题描述] 对于N个整数0, 1, --, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换序列T.如果有多个满足条件的序列,输出其中字典序最小的一个. 说明:对于两个变换序列S和T,如果存在p<N,满足对于i=0,1,--p-1,Si=Ti且Sp<Tp,我们称S比T字典序小. [输入文件] 输入文件transform.in的第一行包含一个整数N,表示序列的长度.接下来的一行包含N个整数Di,其中Di

1562: [NOI2009]变换序列 - BZOJ

Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤500:100%的数据中N≤10000. 二分图匹配,倒着匹配,每次选小的增广(随便乱yy一下,应该就可以证明是字典序最小的吧) 1 const 2 maxn=10010; 3 var 4 first,link:array[0..maxn]of longint; 5 a:array[0..maxn,

BZOJ1562: [NOI2009]变换序列

1562: [NOI2009]变换序列 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1148  Solved: 599[Submit][Status] Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤500:100%的数据中N≤10000. Source 题解: 不愧是NOI的题目,果然是好题. 具

noi2009变换序列

noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 对于N个整数0,1,…,N-1,一个变换序列T可以将i变成Ti,其中:Ti∈{0,1,…,N-1}且Ui=1 to 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

bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1891  Solved: 919[Submit][Status] Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵

【题解】 [NOI2009]变换序列 (二分图匹配)

懒得复制,戳我戳我 Solution: 这个题面出的很毒瘤,读懂了其实是个板子题qwq 题面意思:有个\(0\)至\(N-1\)的数列是由另一个数列通过加减得到的,相当于将\(A_i\)变成\(i\),每一步的代价计算就是\(min(A_i-i,N-(A_i-i))\),并且\(A_i\left(0<=i<N\right)\)互不相同,读入代价,要求字典序最小的满足要求的数列 我们设读入的为\(w[i]\) 思路其实很简单,\(i\)只可能是由\(i-w[i]\) 或者 \(i+w[i]\)

【bzoj1562】 NOI2009—变换序列

http://www.lydsy.com/JudgeOnline/problem.php?id=1562 (题目链接) 题意:给出一个序列(0~n-1),这个序列经过某个变换会成为另外一个序列,但是其中的元素不会改变,给出初始序列与变换后的序列每一位上的“距离”,求字典序最小的变换序列. Solution  每个位置上只有2种情况,很明显的二分图匹配.因为要求字典序最小,我们考虑匈牙利算法的运行方式,是保证当前匹配的点最优,所以连边是将字典序小的点尽可能后连,保证第一个邻接表第一个选出来的点事字

BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)

云神说他二分图匹配从来都是用网络流水过去的...我要发扬他的精神.. 这道题明显是二分图匹配.网络流的话可以二分答案+最大流.虽然跑得很慢.... ---------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostrea