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≤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();
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac OS使用技巧十九:Safari碉堡功能之二查看网页源码

因为大三下的时候选修了搜索技术&#xff0c;了解了网络上搜索引擎和网络爬虫的信息扒取的一些东西&#xff0c;后来我们做了一个比较水的东西&#xff0c;就是只扒取了几家较大的下载网站几十个软件的评分下载量等信息&#xff0c;当用户输入一个程序名称&#xff0c;我们会根…

python文件打包发布(引用的包也可以加进来),打包出错解决了,运行出错解决了...

一开始&#xff0c;我以为&#xff0c;打包本来就很容易&#xff0c;可是没有。。。。。 没想到打包还能遇到坑 T.T 打包步骤&#xff1a; 1、安装 pyinstaller &#xff08;cmd&#xff09; pip install pyinstaller 2、进入目标文件所在文件夹&#xff0c;右键在此打开cmd py…

虚拟机(Visual Machine)的云平台的自动伸缩扩容(auto-scaling)技术

云计算平台中允许客户依据应用的负载进行云计算资源的弹性动态伸缩&#xff08;理想的情况是实现一个用多少付费多少的模型&#xff0c;最大限度地降低用户的运营成本&#xff09; 在进行讨论之前&#xff0c;先对几个名词进行定义 1&#xff09;客户&#xff1a;使用云服务的人…

Unity 3D学习笔记之一 界面介绍

因为学校的课程&#xff0c;本学期对Unity 3D有学习的要求&#xff0c;在博客中记录下自己的Unity学习之路&#xff08;内容摘录自书本和视频&#xff0c;书本为Unity 4.x从入门到精通&#xff09;一、Unity界面介绍首先进入Unity3D&#xff0c;在菜单栏&#xff0c;File中new …

Coding and Paper Letter(一)

2019独角兽企业重金招聘Python工程师标准>>> 最近发现需要在快速阅读背景下&#xff0c;对快餐式资源做整理与收集。以Coding&#xff08;以Github&#xff09;和Paper&#xff08;自己看到的一些论文&#xff0c;论文一般主要看题目和摘要做些简单小结&#xff09;…

MacBook刷机勘错篇

前一段时间突然发现自己的MacBook已经好久没有刷过系统了&#xff0c;10.9用着还好&#xff0c;但bootcamp装的win8.1越来越卡&#xff0c;越用越慢。想要重做一下双系统&#xff0c;后来就演变成了两个系统一起更新&#xff0c;再后来就演变成了一个惨案。因为自己一直也没有使…

Mac OS X 10.10更新及体验

前一阵子&#xff0c;更新了Mac OS 10.10 Yosemite&#xff0c;总体用起来感觉还是很不错的&#xff0c;是很值得升级&#xff0c;相对于10.9 Mavericks优化了不少东西。我之前写的使用教程有一些也就不适用了&#xff1b;比如更换Dashboard中的背景&#xff0c;10.10中Dashboa…

Mac OS X必备APP推荐之一

本篇博文要推荐一下装机必备的APP&#xff0c;因为电脑的使用需求因人而异&#xff0c;这里我根据我的见解和长时间的使用经验推荐一些我认为大家基本都用得到的APP&#xff0c;太过专业性质的我就不推荐了&#xff0c;当然我的推荐肯定会有疏漏和偏差的地方&#xff0c;还请熟…

2018-2019-2 20175235 实验四《Android开发基础》实验报告

实验目的 一、Android Studio的安装测试 二、Activity测试 三、UI测试 四、布局测试 五、事件处理测试 一.Android Stuidio的安装测试&#xff1a; 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十四章&#xff1a; 参考http://www.cnblogs.com…

Mac OS X必备APP推荐之二

本篇接着上一篇APP推荐的博文&#xff0c;继续为大家推荐Mac下好用的APP。 一、首先推荐一款DaisyDisk&#xff0c;磁盘分析、清理工具。前面第一篇APP推荐中&#xff0c;我们推荐过APP和系统垃圾清理工具——Cleanmymac&#xff0c;这两个APP侧重有所不同。Cleanmymac主要清理…

Mac OSX使用VMware Fusion安装windows虚拟机教程

安装虚拟机之前&#xff0c;先要有两步准备工作。第一&#xff0c;安装并激活VMware Fusion&#xff0c;如果大家还没有下载VMware Fusion请参照上一篇博文&#xff0c;APP推荐之二&#xff0c;下载VMware Fusion并激活。第二&#xff0c;下载你想要安装的系统镜像。因为已经装…

java简介和开发环境搭建

因为本人的Java一直以来水平都不怎么样&#xff0c;大一的时候只考了60分。所以在临近毕业的时候&#xff0c;我选择了重修Java&#xff0c;这些天正在慢慢的回顾Java&#xff0c;会到博客里面记录一些Java的知识&#xff0c;不为有多少人来看&#xff0c;只希望自己有所收获。…

第六章 函数和宏定义实验(2)

C程序设计实验报告 实验项目&#xff1a; 1、利用复化梯形公式计算定积分 2、计算Ackerman函数 3、编写计算x的y次幂的递归函数getpower(int x,int y)&#xff0c;并在主程序中实现输入输出 4、编写计算学生年龄的递归函数 5、编写递归函数实现Ackman函数 姓名&#xff1a;王锦…

将控件保存为图片

原文:将控件保存为图片将控件保存为图片 周银辉 这里分别提供win form 和 wpf 两种方式 对于.net 2.0 我们可以简单地利用 BitBlt 函数来实现&#xff0c;非常简单&#xff0c;代码如下&#xff1a; publicstaticclassControlToImageConverter { privateconstInt32 S…

Linux基础命令---get获取ftp文件

get 使用lftp登录ftp服务器之后&#xff0c;可以使用get指令从服务器获取文件。 1、语法 get [-E] [-a] [-c] [-O base] rfile [-o lfile] 2、选项列表 选项 说明 -o 指定输出文件的名字&#xff0c;不指定则使用原来的名字 -c 如果失败&#xff0c;持续获取 -E 获取…

Unity3D学习笔记之二资源导入以及工程管理

本次教程&#xff0c;我们来建立自己的一个工程并导入模型&#xff0c;对模型进行处理。特别说明&#xff1a;这系列教程参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》&#xff0c;本博客中采用的模型和方法均来源于此。这是我浏览过好多教程后觉得讲…

关于cocos creator换装功能的实践与思考

2019独角兽企业重金招聘Python工程师标准>>> 最近在做一个基于cocos creator的微信小游戏&#xff0c;其中一个主要的功能是给角色进行换装。先来说下开发环境&#xff1a; cocos creator1.9.3spine 在官方的文档中只有设置皮肤的接口&#xff0c;实际上是存在可以部…

抖店一件代发实操,干货满满!

我是电商珠珠 没有货源的新手&#xff0c;在店铺刚开始的时候可以搞无货源模式&#xff0c;也就是一件代发&#xff0c;去搬运别人店铺的商品到自己店铺&#xff0c;再去利用信息差去赚取差价。 很多人不知道具体要怎么做&#xff0c;今天我就来给大家讲一讲。 一、入驻 入…

Unity3D学习笔记之三Prefab组件的使用

本次教程&#xff0c;我们来创建一个简单的Prefab组件。教程参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》。说到Prefab&#xff0c;中文翻译为预设体&#xff0c;在Unity官方的书本《Unity4.X从入门到精通》中的解释是&#xff1a;可以理解为是一个…

tomcat闪退解决方案

在这几天&#xff0c;遇到一个Tomcat启动闪退的问题&#xff0c;通过查阅各种资料&#xff0c;算是完美解决。在此分享给朋友们。 首先&#xff0c;确定你的问题在哪里 1.查询错误&#xff1a;winR 输入cmd&#xff0c;进入一般处理程序。通过cd 找到你Tomcat的bin文件夹&#…