[BZOJ1562][NOI2009] 变换序列

时间:2022-09-04 22:07:30

Description

[BZOJ1562][NOI2009] 变换序列

Input

[BZOJ1562][NOI2009] 变换序列

Output

[BZOJ1562][NOI2009] 变换序列

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。

题解:  

  二分图匹配模型很显然,但是不要看到二分图就去网络流了。。。注意到题目要求的是字典序最小的!如果你用Dinic算法去多路增广,根本无法保证字典序,除非用EK。据说也有边增广边调整的搞法,但是这么多花式搞法,前提都是你不知道匈牙利算法!匈牙利算法是一种非常简单的单路增广算法,不详解了。

  这道题的重点在于你知道二分图匹配这个大专题之后怎么去求解。要求是字典序最小的解,这个很好解决。每次在插入边的时候,将字典序较大的边优先加入即可,每次优先匹配字典序较小的(因为后加入的先匹配)。

代码:

--------------------------------------------------------------------------------------------------

#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;

#define MAXN 20005
#define INF 0x3f3f3f3f

struct Edge { int v, next; } edge[MAXN];

int n, d, num[MAXN], ans[MAXN], vis[MAXN], now, h[MAXN];

void addEdge(int u, int v) { now++, edge[now] = (Edge) {v, h[u]}, h[u] = now; }

int DFS(int o)
{
  for (int x = h[o]; x != -1; x = edge[x].next)
  {
    int v = edge[x].v;
    if (!vis[v])
    {
      vis[v] = 1;
      if (num[v] == -1 || DFS(num[v]))
      {
        ans[o] = v, num[v] = o;
        return 1;
      }
    }
  }
  return 0;
}

void work()
{
  int tot = 0;
  for (int i = n - 1; i >= 0; i--)
  {
    memset(vis, 0, sizeof(vis));
    if (DFS(i)) tot++; else break;
  }
  if (tot != n) printf("No Answer\n");
  else for (int i = 0; i < n; i++) printf("%d ", ans[i]);
}

int x;

int main()
{
  freopen("transform.in", "r", stdin);
  freopen("transform.out", "w", stdout);
  memset(ans, -1, sizeof(ans)), memset(num, -1, sizeof(num)), memset(h, -1, sizeof(h));
  scanf("%d", &n);
  for (int i = 0; i <= n - 1; i++)
  {
    scanf("%d", &x);
    int v1 = i + x >= n ? (i + x) % n : i + x;
    int v2 = i - x < 0 ? i - x + n : i - x;
    if (v1 < v2) swap(v1,v2);
    addEdge(i, v1), addEdge(i, v2);
  }
  work();
  return 0;
}

--------------------------------------------------------------------------------------------------

[BZOJ1562][NOI2009] 变换序列的更多相关文章

  1. bzoj1562&lbrack;NOI2009&rsqb;变换序列——2016——3——12

    任意门:http://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目: 对于0,1,…,N-1的N个整数,给定一个距离序列D0,D1,…,DN-1,定 ...

  2. BZOJ1562&colon; &lbrack;NOI2009&rsqb;变换序列&lpar;二分图 匈牙利&rpar;

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...

  3. BZOJ1562——&lbrack;NOI2009&rsqb;变换序列

    1.题意:题意有些难理解 2.分析:我们发现如果要求判断是否合法的话就so easy了,二分图匹配即可,但是我们发现要求输出字典序最小的,那么我们在匈牙利的时候就倒着枚举,另外邻接表中的边一定要排好序 ...

  4. BZOJ1562 &lbrack;NOI2009&rsqb;变换序列 【KM算法】

    题目 输入格式 输出格式 输入样例 5 1 1 2 2 1 输出样例 1 2 4 0 3 提示 30%的数据中N≤50: 60%的数据中N≤500: 100%的数据中N≤10000. 题解 每个位置可 ...

  5. Bzoj 1562&colon; &lbrack;NOI2009&rsqb;变换序列 匈牙利算法&comma;二分图匹配

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

  6. BZOJ 1562 &lbrack;NOI2009&rsqb; 变换序列

    [NOI2009] 变换序列 [题解] 就是有一个序列,每个位置可以填两个数,不可重复,问最小字典序. 显然,可以建一个二分图,判合法就是找完美匹配. 那怎么弄最小字典序呢?有好多种解法,我这里给出了 ...

  7. &lbrack;Luogu 1963&rsqb; NOI2009 变换序列

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

  8. noi2009变换序列

    noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述  ...

  9. Luogu P1963 &lbrack;NOI2009&rsqb;变换序列&lpar;二分图匹配&rpar;

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

随机推荐

  1. Ubuntu上安装Karma失败对策

    在Ubuntu上安装Karma遇到超时 timeout 错误.Google了一下,国外的码农给了一个快捷的解决方案,实测可行,贴在这里: sudo apt-get install npm nodejs ...

  2. VS输入输出基本操作以及数据类型和类型转换

    (一)   C#项目的组成结构 项目结构 .config ---配置文件(存放配置参数文件) .csproj ---项目文件(管理文件项) .sln   ---解决方案文件(管理项目) .cs   - ...

  3. Jalopy 之 HelloWorld —— Jalopy 在 MyEclipse 下的安装与使用

    如果你要问我Jalopy是什么.我只能告诉你“它是一个格式化代码的工具”.因为我也是一个初学者. 如果你也是初次接触,那一起来学习下吧! ·安装 1.首先,下载资源 下载地址:http://sourc ...

  4. C&num;中的文件操作

    在.NET Framework 中进行的所有输入和输出工作都要用到流(stream) 有两种类型的流: 输出流:当向某些外部目标写入数据时,就要用到输出流(将数据写入到文件中). 输入流:用于将数据读 ...

  5. Mysql笔记【2】-数据表的基本操作

    1.创建数据库表 create table <表名> ( 字段名1 类型 <列级别限制> , 字段名2 类型 <列级别限制> , 字段名3 类型 <列级别限制 ...

  6. 2&period;linux下Makefile编写规范

    转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...

  7. 使用JLink间接烧写S3C2410、S3C2440开发板Nor、Nand Flash的方法

    1. 简要说明 JLink的调试功能.烧写Flash的功能都很强大,但是对于S3C2410.S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢:烧写Nan ...

  8. SharePoint 2013&sol;2010 中的日历重合 &lpar;Calendars Overlay&rpar;

    本文介绍 SharePoint 2013/2010 中的日历重合 (Calendars Overlay). 日历重合 (Calendars Overlay)的用途就是将 不多于10个日历或日历视图聚集 ...

  9. 苹果4S

    港版.4S.白.非翻新机.16G.联通3G移动2G电信2G 1000 美版.4S.白.翻新.16G.联通3G移动2G电信3G 980

  10. spring boot 事件发布与接收

    1.创建发布对象 LoginEvent 2.在要发布对象的地方注入 ApplicationEventPublisher @Autowired ApplicationEventPublisher pub ...