P1963 变换序列

题目描述

对于N个整数0,1,…,N-1,一个变换序列T可以将i变成Ti,其中:Ti∈{0,1,…,N-1}且 {Ti}={0,1,…,N-1}。 x,y∈{0,1,…,N-1},定义x和y之间的距离D(x,y)=min{|x-y|,N-|x-y|}。给定每个i和Ti之间的距离D(i,Ti),你需要求出一个满足要求的变换序列T。如果有多个满足条件的序列,输出其中字典序最小的一个。 说明:对于两个变换序列S和T,如果存在p<N,满足:对于i=0,1,…,p-1,Si=Ti且Sp<Tp,我们称S比T字典序小。

N<=10000


考试时乱水了20分,还不如暴力

之后我一看

发现每一个i最多有2个能与之匹配的T[i]

明显的不带权二分图匹配

可以用匈牙利算法

但是

如果至少存在一个满足要求的变换序列T,则输出一行为N个整数,表示你计算得到的字典序最小的T;

——题目

在匈牙利算法匹配当中,如何才能保证字典序最小呢?

其实就是从后往前寻找匹配,且优先匹配小的T(即连边时小的在前)。

然后就可以兴奋的水过这一题了

其实我考试时把正解写挂了

代码蒯上

#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{
register char c = getchar();register long long x = 0, z = 1;
for(;c>'9'||c<'0';c=getchar())z=c=='-'?-1:1;
for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
return x*z;
}
const int _ = 10002;
int n,d[_],to[_]={0},ans[_],e[_][3]={0};
bool ed[_]={0};
int dis(int x,int y){return min(abs(x-y),n-abs(x-y));}
bool finder(int now)
{
for(int i=1;i<=2;i++)
{
if(ed[e[now][i]])continue;
ed[e[now][i]]=1;
if(to[e[now][i]]==-1 || finder(to[e[now][i]]))
{to[e[now][i]]=now;return 1;}
}
return 0;
}
int main()
{
register int i,j,k;
n=gotcha();
for(i=0;i<n;i++)d[i]=gotcha();
for(i=0;i<n;i++)
{
j=(i+d[i])%n,k=(i-d[i]+n)%n;
if(j>k)swap(j,k);
e[i][1]=j;e[i][2]=k;
to[i]=-1;
}
for(i=n-1;i>=0;i--)
{
memset(ed,0,sizeof(ed));
if(!finder(i))
{
printf("%s","No Answer");
return 0;
}
}
for(i=0;i<n;i++)ans[to[i]]=i;
for(i=0;i<n;i++)printf("%d ",ans[i]);
return 0;
}

%%%Rank1 XZZ!

匈牙利算法 - Luogu 1963 变换序列的更多相关文章

  1. [Luogu 1963] NOI2009 变换序列

    [Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...

  2. Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

    题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文 ...

  3. 【bzoj1562】【[NOI2009]变换序列】匈牙利算法的性质利用

    (上不了p站我要死了,侵权度娘背锅) Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30 ...

  4. 【BZOJ1562】[NOI2009] 变换序列(匈牙利算法)

    点此看题面 大致题意: 给你一个长度为\(n\)的序列\(D\),让你找到一个字典序最小的\(n\)的排列\(T\),满足\(D_i=min(|T_i-i|,n-|T_i-i|)\). 建图 我想建图 ...

  5. P1963 [NOI2009]变换序列 倒叙跑匈牙利算法

    题意 构造一个字典序最小的序列T,使得 Dis(i, Ti) = di,其中i是从0开始的,Dis(x,y)=min{∣x−y∣,N−∣x−y∣} ,di由题目给定. 思路 二分图匹配,把左边的看成i ...

  6. Luogu P1963 [NOI2009]变换序列(二分图匹配)

    P1963 [NOI2009]变换序列 题意 题目描述 对于\(N\)个整数\(0,1, \cdots ,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i \in ...

  7. BZOJ 1433 && Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法

    刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会) 把人看做左部点,床看作右部点 建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校) 1.在校的 不走的人 自己 ...

  8. 【bzoj1562】 NOI2009—变换序列

    http://www.lydsy.com/JudgeOnline/problem.php?id=1562 (题目链接) 题意 给出一个序列(0~n-1),这个序列经过某个变换会成为另外一个序列,但是其 ...

  9. [模板] 匈牙利算法&&二分图最小字典序匹配

    匈牙利算法 简介 匈牙利算法是一种求二分图最大匹配的算法. 时间复杂度: 邻接表/前向星: \(O(n * m)\), 邻接矩阵: \(O(n^3)\). 空间复杂度: 邻接表/前向星: \(O(n ...

随机推荐

  1. springboot使用过滤器和拦截器

    1.Filter过滤器 @Componentpublic class AuthFilter implements Filter { private static final Log log = Log ...

  2. ABAP EXCEPTION

    CX_ROOT | |--CX_STATIC_CHECK | |--CX_DYNAMIC_CHECK | | | |--CX_SY_ARITHMETIC_ERROR //运算 '&OPERAT ...

  3. CMSG_COMPAT_ALIGN函数

    CMSG_COMPAT_ALIGN函数是什么的使用方法?

  4. 微软Coco Blockchain Framework:一键解决企业级区块链三大难题

    近年来,异军突起的“区块链”受到全行业的广泛关注,众多企业级用户在积极拥抱新技术的过程中却面临三大难题:性能.隐私和组织管理.如果不能很好地解决这些“顽固分子”,区块链技术就相对局限,很难发挥出应有的 ...

  5. .net后台使用post方式对指定地址的方法传值并且获取结果的方法

    /// <summary> /// .net 后台 post http地址请求 /// </summary> /// <param name="uri" ...

  6. js 获取当前年月日时分秒星期

    $("#aa").click(function () { var date = new Date(); this.year = date.getFullYear(); this.m ...

  7. Spring boot 集成Kafka

    搭建Kafka集群,参考: https://www.cnblogs.com/jonban/p/kafka.html 源码示例如下: 1.新建 Maven 项目 kafka 2.pom.xml < ...

  8. NFS缓存IO机制

    NFS的缓存IO机制<一> async 参数模式下分析 NFS 默认的mount参数为async,async 参数表示内核不会透传程序的IO请求给sever,对于写IO会延迟执行,积累一定 ...

  9. C#语言命名的9种规范

    下面介绍C#语言命名的9种规范: a) 类 [规则1-1]使用Pascal规则命名类名,即首字母要大写. [规则1-2]使用能够反映类功能的名词或名词短语命名类. [规则1-3]不要使用“I”.“C” ...

  10. ORACLE的SQL JOIN方式大全

    ORACLE的SQL JOIN方式大全 在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结),官方的解释如下所示 A join is a que ...