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.pswp.cn/news/277712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277712.shtml
英文地址,請注明出處:http://en.pswp.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…

博客暫停通知-------10.1~11.24

博主在10月初到11月24號之間有對自己來說十分十分重要的事情&#xff0c;可以說是會影響我人生走向的事情。 所以我做出暫停更文章和回復的決定&#xff0c;這期間我基本不會來博客看了&#xff0c;希望如果留言未收到回復的博友或者吧友見諒。 我在貼吧發的一些帖子也暫時不會…

RabbitMQ系列(二)深入了解RabbitMQ工作原理及簡單使用

RabbitMQ簡介 在介紹RabbitMQ之前實現要介紹一下MQ&#xff0c;MQ是什么&#xff1f; MQ全稱是Message Queue&#xff0c;可以理解為消息隊列的意思&#xff0c;簡單來說就是消息以管道的方式進行傳遞。 RabbitMQ是一個實現了AMQP&#xff08;Advanced Message Queuing Protoco…

四葉草社交平臺——十天沖刺(10)

姑且就這樣了&#xff0c;找了個新模板&#xff0c;這個模板先用來過關吧。轉載于:https://www.cnblogs.com/limitCM/p/10925208.html

虛擬機(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 …

Python 獲得程序 exe 的版本號

Python 獲得程序 exe 的版本號 python中需要安裝 pywin32 包 # based on http://stackoverflow.com/questions/580924/python-windows-file-version-attribute from win32com.client import Dispatchdef get_version_via_com(filename):parser Dispatch("Scripting.FileS…

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;再后來就演變成了一個慘案。因為自己一直也沒有使…

字典、列表、元組

1 字典2 Python內置的字典數據類型&#xff1a;全稱dictionary&#xff0c;在其他語言中也稱為map&#xff0c;使用鍵-值&#xff08;key-value&#xff09;存儲&#xff0c;具有極快的查找速度3 4 當將key-value放進dict時&#xff0c;dict會根據key算出value要存放地址&#…

Sublime Text怎么快速建立一個html5頁面模板

在編輯器中輸入一個半角英文的感嘆號&#xff08;!&#xff09;,然后按下TAB鍵

Mac OS X 10.10更新及體驗

前一陣子&#xff0c;更新了Mac OS 10.10 Yosemite&#xff0c;總體用起來感覺還是很不錯的&#xff0c;是很值得升級&#xff0c;相對于10.9 Mavericks優化了不少東西。我之前寫的使用教程有一些也就不適用了&#xff1b;比如更換Dashboard中的背景&#xff0c;10.10中Dashboa…

快速冪學習筆記

啥是快速冪 快速冪&#xff0c;顧名思義&#xff0c;就是快速算某個數的多少次冪。其時間復雜度為 \(O(\log N)\)&#xff0c; 與樸素的\(O(N)\)相比效率有了極大的提高。 原理 來自學長&#xff1a; 我們可以把 \(b\) 分解成二進制數&#xff0c;其中從小到大每一個二進制位 是…

文本處理工具sed

sed&#xff1a;stream Editor流編輯器&#xff0c;默認不編輯原文件&#xff0c;僅對模式空間中的數據做處理&#xff1b;而后&#xff0c;處理結束后&#xff0c;將模式空間打印至屏幕。語法&#xff1a; sed [option] AddressCommand file1 file2... option選項有&#xff1…

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主要清理…

【編程大系】Java資源匯總

1.學習資料&#xff1a; 1&#xff09;Spring Boot 那些事&#xff1a;https://www.w3cschool.cn/springboot/ 對應的 gitHub代碼&#xff1a; https://github.com/JeffLi1993/springboot-learning-example 2&#xff09;Spring Boot基礎視頻&#xff1a;https://www.w3cschool…

Mac OSX使用VMware Fusion安裝windows虛擬機教程

安裝虛擬機之前&#xff0c;先要有兩步準備工作。第一&#xff0c;安裝并激活VMware Fusion&#xff0c;如果大家還沒有下載VMware Fusion請參照上一篇博文&#xff0c;APP推薦之二&#xff0c;下載VMware Fusion并激活。第二&#xff0c;下載你想要安裝的系統鏡像。因為已經裝…