luogu5823 课表的排列

Posted wxyww

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu5823 课表的排列相关的知识,希望对你有一定的参考价值。

题目链接

problem

构造一个长度为(2n)的数列。满足:
1.[1,n]中每个数字恰好出现两次。
2.将所有相同数字之间相隔的数字个数排序后,得到公差为1的等差数列。
保证n为奇数。

solution

挺妙的一道题(来自蒟蒻的呻吟~)

发现n是奇数。那么将序列分为四部分A,B,C,D。长度分别为k,k+1,k,k+1。让A与C互为相反串,B与D互为相反串。

这样发现,A与C所造成的贡献分别是:k+1,k+3,k+5···。B与D所造成的贡献分别是:k,k+2,k+4,k+6···。合起来恰好是一个等差数列。

一开始自己误加了一个条件(首项必须唯一/nc)

code

/*
* @Author: wxyww
* @Date:   2019-12-17 18:58:18
* @Last Modified time: 2019-12-17 19:08:10
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;

ll read() {
    ll x = 0,f = 1;char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1; c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = x * 10 + c - '0'; c = getchar();
    }
    return x * f;
}

int main() {
    int n = read();
    for(int i = 1;i <= n;++i) printf("%d ",i);
    for(int i = n / 2;i >= 1;--i) printf("%d ",i);
    for(int i = n;i > n / 2;--i) printf("%d ",i);

    return 0;
}

以上是关于luogu5823 课表的排列的主要内容,如果未能解决你的问题,请参考以下文章

luogu1030 求先序排列

Luogu2578 [ZJOI2005]九数码游戏

Luogu P4071[SDOI2016]排列计数

luogu P1706全排列问题

单调栈[Luogu P4248]

[Luogu4921]情侣?给我烧了![错位排列]