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

这题是二分图应该不难看出来。

对于原序列中的一个点,对应两个可匹配的点。

关键是怎么保证字典序最小

如果是暴力删边+匈牙利的话是$O(n^3)$的。

这里有两种解决方法:

1.强制让$x$号点连向字典序小的点,对失配的点重新匹配

2.将所有边按照字典序排序,优先选择最小的。

 同时在匈牙利的时候从最大的往最小的枚举

    这实际上利用了匈牙利“抢” 的思想。

    如之前的已经匹配过,那么字典序小的会抢字典序大的匹配。同时又因为每次选的是字典序最小的。因此答案可以保证是最优的。

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
const int INF = 1e9 + 10, MAXN = 1e5 + 10;
using namespace std;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N;
int a[MAXN];
int match[MAXN], vis[MAXN], cur;
vector<int> v[MAXN];
void AddEdge(int x, int y) {v[x].push_back(y); v[y].push_back(x);
}
bool Argue(int x) {for(int i = 0; i < v[x].size(); i++) {int to = v[x][i];if(vis[to] == cur) continue;vis[to] = cur; if(match[to] == -1 || Argue(match[to])) {match[to] = x;return true;}}return false;
}
void Hug() {int ans = 0;for(int i = N - 1; i >= 0; i--) {cur++;if(!Argue(i)) {printf("No Answer"); exit(0);}}    for(int i = 0; i < N; i++) match[match[i + N]] = i;for(int i = 0; i < N; i++) printf("%d ", match[i]);
}
main() {
#ifdef WIN32freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);
#endifmemset(match, -1, sizeof(match));N = read();for(int i = 0; i < N; i++) {int x = read();AddEdge(i, (i + x) % N + N);AddEdge(i, (i - x + N) % N + N);}for(int i = 0; i < N << 1; i++) sort(v[i].begin(), v[i].end());Hug();
}

BZOJ1562: [NOI2009]变换序列(二分图 匈牙利)相关推荐

  1. bzoj1562 [NOI2009]变换序列

    bzoj1562 [NOI2009]变换序列 NOI也有SB题系列. 一个\(i\)只有两种可能的\(T_i\) 要求所有\(T_i\)不重复,且字典序坠小. 仔细想一想匈牙利匹配的过程就可以知道:要 ...

  2. bzoj1562[NOI2009] 变换序列

    题目链接:bzoj1562 题目大意: 给出一个序列(0~n-1),这个序列经过某个变换会成为另外一个序列,但是其中的元素不会改变,给出初始序列与变换后的序列每一位上的"距离",求 ...

  3. bzoj1562[NOI2009]变换序列——2016——3——12

    任意门:http://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目: 对于0,1,-,N-1的N个整数,给定一个距离序列D0,D1,-,DN-1,定 ...

  4. bzoj 1562 [NOI2009]变换序列 二分图

    题面 题目传送门 解法 显然可以构建一个二分图模型 但是要求出字典序最小的解,那么网络流就无能为力了 考虑用匈牙利算法来跑 匈牙利算法就是用大的来代替小的,那我们把连接的点从小到大排序,然后从左边大的 ...

  5. P1963 [NOI2009]变换序列

    题目描述 不想水字,详见某谷:P1963 [NOI2009]变换序列 solution 其实    的计算就类似于环上的距离. 对于每一个  都可能有两种位置选择:, . 所以把它们分别连边,二分图上 ...

  6. 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 ...

  7. [NOI2009] 变换序列 (匈牙利最大匹配)

    description - solution 我竟然一眼题!! 变换后的TTT数组是[0,n)[0,n)[0,n)的排列,变换规则也有,距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个 ...

  8. 【二分图匹配】BZOJ1562-[NOI2009] 变换序列

    [题目大意] 对于0,1,-,N-1的N个整数,给定一个距离序列D0,D1,-,DN-1,定义一个变换序列T0,T1,-,TN-1使得每个i,Ti的环上距离等于Di.一个合法的变换序列应是0,1,-, ...

  9. 二分图-匈牙利算法模板

    二分图就不赘述了,我在知识资料整理有相关资料. .最大匹配  .最小路径覆盖  .最小点覆盖  .最大独立集 最大匹配:二分图中边集最大的那个匹配 最小路径(边)覆盖:用尽量小的不想交简单路径覆盖有向 ...

最新文章

  1. 2022-2028年中国高等职业教育产业投资分析及前景预测报告
  2. 西安翻译学院计算机分数线,西安翻译学院录取投档线
  3. 说说进程与线程的区别与联系
  4. eclipse配置struts.xml自动提示
  5. Java性能优化推荐书!RocketMQ消息丢失场景及解决办法
  6. 后端生成Token架构与设计详解
  7. 什么导致了交换机端口呈现err-disable状态?
  8. SHELL脚本之自动化安装通用二进制格式MariaDB
  9. android 隐藏所有 fragment,Android 隐藏Fragment
  10. 并行开发 4.同步机制(上)
  11. rpgmakermv导出html,RpgMaker MV 插件基础(一)
  12. Micrium uC-Probe导入.elf文件的问题
  13. 基于superslide的导航栏 效果切换
  14. linux中无损gpt转mbr,如何快速实现免重装无损磁盘MBR转GPT?
  15. android canvas 画圆边缘模糊,Android canvas画圆
  16. Jim Keller:在指令集上辩论是一件悲哀的事情
  17. java虚拟机有哪些分类?
  18. 简单好玩经典有趣的微信小游戏
  19. 用 C# 编写 USB 存储设备使用痕迹检测和删除工具
  20. 小程序上拉加载onReachBottom不触发

热门文章

  1. Filter案例之登录验证
  2. 记一次Hbase数据迁移和遇到的问题
  3. Java和.NET(C#)的开发用到的技术对比总结
  4. BZOJ4516: [Sdoi2016]生成魔咒
  5. Wpf Binding.Path设置
  6. 程序日志--要养成好习惯
  7. HDU 2818 Building Block
  8. object的classid收集
  9. Django实战(1):需求分析和设计
  10. java replaceall函数_JAVA中string.replace和string.replaceAll的区别及用法