首页 > 其他分享 >P1963 [NOI2009] 变换序列

P1963 [NOI2009] 变换序列

时间:2022-12-02 17:25:14浏览次数:73  
标签:ch 匹配 int NOI2009 序列 P1963 字典

P1963 [NOI2009] 变换序列
求最小字典序
匈牙利算法进行匹配
因为每一次是要求已经匹配好的人进行换对象
如果从前面开始,那就是会要求前面已经匹配好的人换对象,答案就不一定是字符串最小
而如果从后面开始,那就是要求后面已经匹配好的人换对象,一定可以保证局部字典序最小

//选择字典序最小的就可以了
//最多和两个点进行匹配
#include <bits/stdc++.h>
using namespace std;
const int N=10005;
const int M=2*N;

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}

int g[N][2];
int vis[N],match[N];
int ans[N];

bool dfs(int now,int dep) {
    for(int i=0;i<2;i++) {
        int to=g[now][i];
        if(vis[to]==dep)continue;
        vis[to]=dep;
        if(match[to]==-1||dfs(match[to],dep)) {
            match[to]=now;
            ans[now]=to;
            return 1;
        }
    }
    return 0;
}

int main() {
    memset(match,-1,sizeof(match));
    memset(vis,-1,sizeof(vis));
    int n=read();
    for(int i=0;i<n;i++) {
        int x=read();
        int t1=(i+x)%n,t2=(i-x+n)%n;
        if(t1>t2)swap(t1,t2);
        g[i][0]=t1;
        g[i][1]=t2;
    }
    for(int i=n-1;i>=0;i--)
        if(dfs(i,i)==0)return cout<<"No Answer",0;
    for(int i=0;i<n;i++)cout<<ans[i]<<' ';
    return 0;
}
//逆向思维进行贪心就可以了
//从后面开始就是对的
//有的时候求字典序最小或者说其他东西最小,往往只需要把某些东西调换一下子就可以了

标签:ch,匹配,int,NOI2009,序列,P1963,字典
From: https://www.cnblogs.com/basicecho/p/16945037.html

相关文章

  • Newtonsoft.Json 对象序列化 -- 系列文章
    Newtonsoft.Json是一个非常棒的.net对象转Json,Json字符串转对象的类库,此分类中主要记录日常使用的方法以及功能总结。三:C#对象转换Json时的一些高级(特殊)设置;二:C#对......
  • .net6&7中如何优雅且高性能的使用Json序列化
    .net中的SourceGenerator让开发者编可以写分析器,在项目代码编译时,分析器分析项目既有的静态代码,允许添加源代码到GeneratorExecutionContext中,一同与既有的代码参与编译。......
  • apache common包中的序列化工具
    什么是序列化我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成......
  • 使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例
    译者注本文是一篇不可多得的好文,MemoryPack的作者neuecc大佬通过本文解释了他是如何将序列化程序性能提升到极致的;其中从很多方面(可变长度、字符串、集合等)解释了一......
  • #yyds干货盘点# 名企真题专题:序列找数
    1.简述:描述从非负整数序列 0,1,2,...,n中给出包含其中n个数的子序列,请找出未出现在该子序列中的那个数。输入描述:输入为n+1个非负整数,用空格分开。其中:首个数字为非负......
  • 剑指offer:栈的压入、弹出序列
    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该......
  • 剑指offer:翻转单词顺序列
    题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“s......
  • 分解商业周期时间序列:线性滤波器、HP滤波器、Baxter滤波器、Beveridge Nelson分解等去
    原文链接:http://tecdat.cn/?p=23000最近我们被客户要求撰写关于商业周期分解的研究报告,包括一些图形和统计输出。本文包含各种过滤器,可用于分解南非GDP的方法。我们做的第......
  • prufer 序列
    有标号无根树和prufer序列形成双射的关系。所以有一些性质。其构造方式是拿一棵树出来,它有许多叶子。找出这些叶子中编号最小id,记录下它的父亲,丢掉。重复这一过程,会得到......
  • 一个关于序列的游戏——DP综合题
    题目有一个序列,你可以在上面删除符合要求的连续段若干次。每次删除都会得到连续段长度对应的分数。需要符合的要求为:1、相邻两个元素相差为12、如果某个元素不在连续段......