【题解】 [NOI2009]变换序列 (二分图匹配)
Solution:
- 这个题面出的很毒瘤,读懂了其实是个板子题qwq
- 题面意思:有个\(0\)至\(N-1\)的数列是由另一个数列通过加减得到的,相当于将\(A_i\)变成\(i\),每一步的代价计算就是\(min(A_i-i,N-(A_i-i))\),并且\(A_i\left(0<=i<N\right)\)互不相同,读入代价,要求字典序最小的满足要求的数列
- 我们设读入的为\(w[i]\)
- 思路其实很简单,\(i\)只可能是由\(i-w[i]\) 或者 \(i+w[i]\) 或者 \(i+N-w[i]\) 或者 \(i-N+w[i]\),然后我们把符合范围\(0\)至\(N-1\)的对应点从大到小建图,这样可以保证搜的时候是从小的点开始
- 然后就从\(N-1\)到\(0\)进行二分图匹配,如果无法匹配就输出\(No Answer\),这样从后到前匈牙利算法去做,保证越前面的匹配的数是最小的。
- 因为\(be[i]\)中存的是\(i\)数字对应变成的数字是什么,所以反过来存一下输出就好啦
主要是想字典序最小的地方有点emmm神奇,其他的地方还是比较显然的
Code:
//It is coded by Ning_Mew on 3.17
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
bool vis[maxn];
int n,w[maxn],be[maxn],ans[maxn];
int head[maxn],cnt=0;
struct Edge{
int nxt,to;
}edge[maxn*4];
priority_queue<int>q;
void add(int from,int to){
edge[++cnt].nxt=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
bool find(int k){
for(int i=head[k];i!=0;i=edge[i].nxt){
int v=edge[i].to;
if(!vis[v]){
vis[v]=true;
if(be[v]==-1||find(be[v])){be[v]=k;return true;}
}
}return false;
}
int main(){
scanf("%d",&n);
while(!q.empty())q.pop();
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
q.push(i-w[i]); q.push(i+w[i]);
q.push(i+n-w[i]);q.push(i-n+w[i]);
while(!q.empty()){
int box=q.top();q.pop();
//cout<<box<<endl;
if(box>=0&&box<n)add(i,box);//cout<<i<<' '<<box<<endl;
}
}
memset(be,-1,sizeof(be));
for(int i=n-1;i>=0;i--){
memset(vis,false,sizeof(vis));
if(find(i));
else{printf("No Answer\n");return 0;}
}
for(int i=0;i<n;i++)ans[be[i]]=i;
for(int i=0;i<n;i++)printf("%d ",ans[i]);printf("\n");
return 0;
}
【题解】 [NOI2009]变换序列 (二分图匹配)的更多相关文章
- Luogu P1963 [NOI2009]变换序列(二分图匹配)
P1963 [NOI2009]变换序列 题意 题目描述 对于\(N\)个整数\(0,1, \cdots ,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i \in ...
- 【BZOJ1562】【jzyzOJ1730】【COGS409】NOI2009变换序列 二分图匹配
[问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换 ...
- 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≤ ...
- BZOJ 1562 变换序列(二分图匹配)
显然每个位置只有两个情况,所以用二分图最大匹配来求解. 如果二分图有完全匹配,则有解. 关键是如何求最小的字典序解. 实际上用匈牙利算法从后面开始找增广路,并优先匹配字典序小的即可. # includ ...
- BZOJ 1562 变换序列 二分图匹配+字典序
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目大意: 思路: 逆序匹配,加边匹配的时候保持字典序小的先加入. 具体证明:h ...
- Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配
题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆ 输入文件:transform.in 输出文 ...
- BZOJ 1562 [NOI2009] 变换序列
[NOI2009] 变换序列 [题解] 就是有一个序列,每个位置可以填两个数,不可重复,问最小字典序. 显然,可以建一个二分图,判合法就是找完美匹配. 那怎么弄最小字典序呢?有好多种解法,我这里给出了 ...
- noi2009变换序列
noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 ...
- [Luogu 1963] NOI2009 变换序列
[Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...
随机推荐
- ASP.NET Core 3.0 实战:构建多版本 API 接口
第一次在博客写分享,请多多捧场,如有歧义请多多包含! 因为业务需求发展需要,所以API接口的变更升级是必不可少的事情,而原有的接口是不可能马上停止使用的.例如:Login接口为例,1.0版本之返回用户 ...
- 20155334 《网络攻防》 Exp6 信息搜集与漏洞扫描
20155334 Exp6 信息搜集与漏洞扫描 一.实验问题回答 哪些组织负责DNS,IP的管理? 答:互联网名称与数字地址分配机构 ICANN ,该机构决定了域名和IP地址的分配.负责协调管理DNS ...
- maven中添加jetty运行插件
maven项目,用jetty插件运行,对热部署的支持比较好.maven的pom文件加入下面代码 <plugin> <groupId>org.mortbay.je ...
- 汇编 EBP ,ESP 寄存器
知识点: CALL框架 EBP寄存器 栈底指针 ESP寄存器 栈顶指针 一.EBP栈底指针 EBP是一个特殊的寄存器,通过EBP+偏移量 可以访问CALL里边的局部变量.它的低16位叫BP ...
- Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志
测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内 ...
- Caffe+Windows 环境搭建收集
Caffe+Anconda3+VS2015+Win10(64位)环境搭建 Caffe on Windows (Visual Studio 2015+CUDA8.0+cuDNNv5) Win10+VS2 ...
- [SDOI2010]地精部落[计数dp]
题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...
- flask_admin 笔记三 客户化视图
客户化视图1, model数据模型参数配置1)配置全局参数内置的ModelView类很适合快速入门. 但是,您需要配置其功能以适合您的特定型号. 这是通过设置ModelView类中提供的配置属性的值来 ...
- mvc5.0-路由
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- onSaveInstanceState和onRestoreInstanceState触发的时机
先看Application Fundamentals上的一段话: Android calls onSaveInstanceState() before the activity becomes vul ...