题目链接: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:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 10005 using namespace std; int n;
int d[MAX_N];
int vis[MAX_N];
int mat[MAX_N];
int rmat[MAX_N];
int edge[MAX_N][]; bool hungary(int now,int cnt)
{
for(int i=;i<;i++)
{
int temp=edge[now][i];
if(vis[temp]!=cnt)
{
vis[temp]=cnt;
if(mat[temp]==- || hungary(mat[temp],cnt))
{
mat[temp]=now;
rmat[now]=temp;
return true;
}
}
}
return false;
} int main()
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>d[i];
if(d[i]>n/)
{
cout<<"No Answer"<<endl;
return ;
}
int x=(i+d[i])%n;
int y=(i-d[i]+n)%n;
edge[i][]=min(x,y);
edge[i][]=max(x,y);
}
memset(vis,,sizeof(vis));
memset(mat,-,sizeof(mat));
for(int i=n-;i>=;i--)
{
if(!hungary(i,i+))
{
cout<<"No Answer"<<endl;
return ;
}
}
for(int i=;i<n;i++) cout<<rmat[i]<<" ";
cout<<endl;
}

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

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

    题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文 ...

  2. BZOJ 1562 [NOI2009] 变换序列

    [NOI2009] 变换序列 [题解] 就是有一个序列,每个位置可以填两个数,不可重复,问最小字典序. 显然,可以建一个二分图,判合法就是找完美匹配. 那怎么弄最小字典序呢?有好多种解法,我这里给出了 ...

  3. Luogu P1963 [NOI2009]变换序列(二分图匹配)

    P1963 [NOI2009]变换序列 题意 题目描述 对于\(N\)个整数\(0,1, \cdots ,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i \in ...

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

    [问题描述]        对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换 ...

  5. 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≤ ...

  6. BZOJ 1562 变换序列 二分图匹配+字典序

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...

  7. BZOJ 1562 变换序列(二分图匹配)

    显然每个位置只有两个情况,所以用二分图最大匹配来求解. 如果二分图有完全匹配,则有解. 关键是如何求最小的字典序解. 实际上用匈牙利算法从后面开始找增广路,并优先匹配字典序小的即可. # includ ...

  8. 1562. [NOI2009]变换序列【二分图】

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50: 60%的数据中N ...

  9. BZOJ1562: [NOI2009]变换序列(二分图 匈牙利)

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...

随机推荐

  1. Cannot lock storage /tmp/hadoop-root/dfs/name. The directory is already locked.

    [root@nn01 bin]# ./hadoop namenode -format 12/05/21 06:13:51 INFO namenode.NameNode: STARTUP_MSG: /* ...

  2. linux recv函数返回值分析

    函数原型: ssize_t recv(int sockfd, void *buf, size_t len, int flags); 该函数第一个参数制定接收端套接字描述符; 第二个参数指明一个缓冲区, ...

  3. UVA-11625-Nice Prefixes (DP+矩阵快速幂)

    题目(vjudge) 题面 题意: 你有K个字母,你需要用K个字母组成L长度的字符串,定义对于该字符串的任意前缀P 必须满足    ,输出方案数%1000000007的值. 思路: 首先可以想到一种简 ...

  4. centos 6.9使用Rsync+Inotify-tools实现数据实时同步

    centos 6.9使用Rsync+Inotify-tools实现数据实时同步 说明: 操作系统:CentOS 6.9 源服务器:192.168.1.222 备份服务器:192.168.1.1.233 ...

  5. Y2K Accounting Bug - 2586

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11271   Accepted: 5672 Description Ac ...

  6. 【Python + Selenium】之JS定位总结

    感谢:小琰子 Python+Selenium 脚本中的一些js的用法汇总: 1.滚动条 driver.set_window_size(500,500) js = "window.scroll ...

  7. C语言基础知识【C语言教程】

    2017年7月7日23:15:51外边下雨,突然想学习c语言,所以刷一遍基础. 笔记:C 语言教程1.C 语言是一种通用的.面向过程式的计算机程序设计语言.1972 年,为了移植与开发 UNIX 操作 ...

  8. Jmeter 05 JMeter元件详解

    1. JMeter 逻辑控制器 Switch条件控制器.While条件控制器.交替控制器.仅一次控制器.随机控制器.随机顺序控制器.条件控制器(如果(if)).循环控制器.录制控制器.ForEach控 ...

  9. An Ordinary Game(简单推导)

    An Ordinary Game Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement There ...

  10. visual studio2017 无法添加引用 未能加载包ReferenceManagerPackage not such interface support 解决方法

    安装完visual studio 2017 后添加引用总是提示 未能加载包ReferenceManagerPackage, 这个问题困扰了两天,直到在网上看到了下面这一段 I just got thi ...