我们先不考虑字典序最小,先来求出一种可行解。

不难发现,对于每一个i值,它所对应的T值在模n意义下最多两个,于是我们可以用二分图匹配来判断。

那字典序最小呢?

回顾一下二分图匹配的算法:网络流?貌似不好做到字典序最小,所以我们来看匈牙利算法

匈牙利算法是从1~n枚举点,看是否能合法,如果它要的边没被连就连,如果被连过了就一直判断是否有办法可以让前面的匹配换一种连接方式,便是用这种连边方式。

如果实在没有办法了,就只能委屈一下自己了。

那么这样匹配能否使字典序最小呢?

显然是不行的,即使我们让第一条边找到了字典序最小的点,如果后面的点请求更换,而且正好又可以更换找到更大匹配,那么就不一定是字典序最小了(毒瘤)。

那么我们可以怎么做呢?

我们逆向思维,考虑从后往前加边,后面边先选字典序小的,如果前面的边需要就直接给了,这样就可以保证字典序最小了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
#define debug printf("Now is Line : %d\n",__LINE__)
il int read()
{
re int x=0,f=1; re char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return x*f;
}
#define maxn 10005
int n,m,d[maxn],aa[2][maxn],vis[maxn],cnt,ans,match[maxn],to[maxn];
bool dfs(int u)
{
for(re int i=0;i<2;++i)
{
int v=aa[i][u];
if(vis[v]) continue;
vis[v]=1;
if(match[v]==-1||dfs(match[v])) return match[v]=u,to[u]=v,1;
}
return 0;
}
int main()
{
n=read();
memset(match,-1,sizeof(match));
for(re int i=0;i<n;++i) d[i]=read();
for(re int i=0;i<n;++i)
{
int a=(i-d[i]+n)%n,b=(i+d[i])%n;
if(a>b) swap(a,b);
aa[0][i]=a,aa[1][i]=b;
}
for(re int i=n-1;~i;--i)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) ++ans;
}
if(ans<n) return puts("No Answer"),0;
for(re int i=0;i<n;++i) printf("%d ",to[i]);
return 0;
}

[NOI2009]变换序列(二分图匹配)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ 1562 [NOI2009] 变换序列

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

  8. [Luogu 1963] NOI2009 变换序列

    [Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...

  9. noi2009变换序列

    noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述  ...

随机推荐

  1. 商家APP店内点餐开启有桌台点餐模式

    商家APP店内点餐开启有桌台点餐模式 步骤一:管理员后台-配置管理--店铺配置--简易付tab页--是否支持扫码下单-是 步骤二:管理员后台-配置管理--设备管理--选择对应的机器--配置--云POS ...

  2. GDB 显示别的文件;在别文件打断点;执行到函数末尾;跳出当前函数

    显示别的文件:l "文件名.后缀名":行号 在别文件打断点:b "文件名.后缀名":行号 执行到函数末尾:finish 跳出当前函数(当前位置到函数的末尾不被执 ...

  3. python3.x pool.map方法的实质

    我使用多进程的一般方式,都是multiprocessing模块中的Pool.map()方法.下面写一个简单的示例和解析.至于此种方法使用多进程的效率问题,还希望大佬予以指正. 示例: "&q ...

  4. dynalist 配额

    2018-8-29 dynalist 配额 提示有一个G的配额 就是使用的流量用光了.仅有1个G

  5. Bootstrap -- 缩略图、进度条、列表组、面板

    Bootstrap -- 缩略图.进度条.列表组.面板 1. 缩略图 大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap ...

  6. 数据库【mysql】之pymysql

    安装模块 pip install pymysql 导入模块 import pymysql 创建链接 conn = pymysql.connect(host=') 创建索引 cursor = conn. ...

  7. Kafka设计解析(七)- Kafka Stream

    本文介绍了Kafka Stream的背景,如Kafka Stream是什么,什么是流式计算,以及为什么要有Kafka Stream.接着介绍了Kafka Stream的整体架构,并行模型,状态存储,以 ...

  8. kernel笔记——定时器与时间管理

    内核中时钟主要完成以下作用: 记录系统运行时间 完成时间相关的统计功能,如cpu占用率等 定时功能,设定某个进程一段时间后完成某项任务 为实现以上功能,硬件以及内核提供了不同类型的时钟. RTC 实时 ...

  9. springMVC DispatcherServlet类关系图

  10. STM32 FSMC使用笔记

    最近在使用STM32的FSMC与FPGA做并行通信总线控制,做一下总结 1,利用FSMC读取写入16位数据时的封装函数如下,不这样使用的话在与FPGA进行通信的过程中可能会出现不可预知的错误. #de ...