【题解】 [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 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...
随机推荐
- 20155325 Exp4 恶意代码分析
系统运行监控 (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述一下分析结果.目标就是找出所有连网的程序,连了哪里,大约干了什么(不抓 ...
- 20155327 Exp9 Web安全基础
20155327 Exp9 Web安全基础 基础问题回答 (1)SQL注入攻击原理,如何防御 SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器 ...
- ECMAScript6——Set数据结构
/** * 数据结构 Set */ // ----------------------------------------------------- /** * 集合的基本概念:集合是由一组无序且唯一 ...
- REST-framework快速构建API--初体验
一.快速上手 1.环境准备 安装restframework,注册app pip install djangorestframework INSTALLED_APPS = [ 'django.contr ...
- effective c++ 笔记 (9-12)
//---------------------------15/03/29---------------------------- //#9 绝不在构造和析构过程中调头virtual函数 { / ...
- stl源码剖析 详细学习笔记 RB_tree (1)
// // RB_tree_STL.cpp // 笔记 // // Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...
- Beyond Compare文本对比中提示编辑禁止的解决方法
Beyond Compare是一款拥有文本比较功能的智能化软件,它支持在文本比较的同时,直接对差异文本进行修改.删除.编辑等一系列操作,这样一来,节约了文本对比的时间.但是在使用Beyond Comp ...
- 关于Java开发一职的经验
本人为大四软件工程学生,由于准备不充分也没有前人指点,去年10月份才赶上秋招节奏,然后签下了一家比较起来还行的公司.所以不太期望大家有求职意愿但苦于不知作何准备,所以特列以下知识点检索供大家查阅.如果 ...
- 在HTML中为JavaScript传递变量
在html中为JavaScript传递变量是一个关键步骤,然后就可以通过对JavaScript变量操作,实现想要达到的目的 本节代码主要使用了JavaScript中的document对象中的getEl ...
- web安全入门课程笔记——网站基础与信息搜集
2-1 网站的基本概念 URL统一资源定位符 这是一个动态页面 ?ID 查询条件 后台数据库最有可能:ACCESS Web容器(web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而 ...