正题

题目链接:https://www.luogu.com.cn/problem/CF891B


题目大意

给出\(n\)个数字互不相同的一个序列\(a\),求它的一个排列\(b\),使得选出任意一个\(1\sim n\)的下标真子集,都有\(a\)的对应下标和不等于\(b\)的对应下标和。

\(1\leq n\leq 22,0\leq a_i\leq 10^9\)


解题思路

首先考虑对于每个\(a_i\)向它对应\(b_i\)连边,然后如果连出来的不是一个大小为\(n\)的环的话显然是错的,因为一次选择相当于选择环上的一条边,那么选一个环显然是对的。

然后现在问题就变成了找一个环排列满足以上的条件,再考虑怎么找这个环排列,发现对应环上选择的连续一段那么最后肯定是头\(+\)而且尾\(-\),然后中间的不计贡献,换句话就是无法在这个环上选出一个子序列,然后\(+/-\)交错使得和为\(0\)。

对于这个问题的构造就很简单了,直接选择一个递增的序列,这样每个\(+\)肯定有个比他更大/小的\(-\)与它抵消。

不过这样看上去其实是想复杂了,换种想法其实就是对于每个选出的除了最大的\(a_i\)都有一个更大的\(b_i\)对应,然后如果选择了最大的\(a_i\)那么这个差值需要选择另外\(n-1\)个才能抵上。

时间复杂度:\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30;
int n,a[N],b[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
for(int i=1;i<=n;i++){
if(a[i]==b[n])printf("%d ",b[1]);
else printf("%d ",b[upper_bound(b+1,b+1+n,a[i])-b]);
}
return 0;
}

CF891B-Gluttony【构造】的更多相关文章

  1. CF891B Gluttony

    原题链接 DOWNLOAD AS PDF 题目大意 给你一个有\(n\)个元素的数组\(a\),让你构造一个数组\(b\),满足从 \(a\).\(b\)中任选出\(k\)个下标对应的元素,它们的和不 ...

  2. Gluttony CodeForces - 892D (构造,思维)

    题面: You are given an array a with n distinct integers. Construct an array b by permuting a such that ...

  3. Codeforces 891B - Gluttony

    891B - Gluttony 题意 给出一个数字集合 \(a\),要求构造一个数组 \(b\) 为 \(a\) 的某个排列,且满足对于所有下标集合的子集 \(S=\{x_1,x_2,...,x_k\ ...

  4. Codeforces 892 D.Gluttony

    D. Gluttony time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  5. CF892D—Gluttony(思维,好题)

    http://codeforces.com/contest/892/problem/D D. Gluttony You are given an array a with n distinct int ...

  6. 学习笔记:Maven构造版本号的方法解决浏览器缓存问题

    需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...

  7. 一步步构造自己的vue2.0+webpack环境

    前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...

  8. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

  9. Eos开发——构造查询条件

    1.ajax 方式 var data = { orgid :orgid,year:year ,month: month,type:type,sortField:'sellEmpname' ,sortO ...

随机推荐

  1. jenkins+docker部署java项目

    jenkins + maven + jdk + docker + docker register + dockerfile jenkins插件 # 安装插件 SSH # 配置 系统设置-> SS ...

  2. 安装 iperf和服务器之间测速

    安装 # https://downloads.es.net/pub/iperf/iperf-3.1.3.tar.gz wget https://iperf.fr/download/source/ipe ...

  3. spring cloud 网管篇zuul

    1, consul 2, zuul 程序的yml 文件 server: port: 8083spring: application: name: zuulInfo # 应用名称 cloud: cons ...

  4. 在VS工程中,添加c/c++工程中外部头文件(.h),lib库,dll库的基本步骤

    选择工程,右键-工程属性 其中: VC++目录 -->包含目录,对所有的项目及未来新建的项目都有效 c/c++-->常规-->附加包含目录,仅对当前项目有效 绝对路径设置方法: 在V ...

  5. 玩转Spring生命周期之Lifecycle

    Lifecycle callbacks Initialization callbacks.Destruction callbacks要与容器的bean生命周期管理交互,即容器在启动后和容器在销毁前对每 ...

  6. mac下编译安装grafana

    下载grafana源码 从grafana git 仓库下载指定的分支. 编译后端 我下载的时候,grafana的最新release是7.3.7,其需要安装go 1.15版本 生成可执行文件 进入项目根 ...

  7. 移动端touch事件——单指拖拽

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. Ubuntu在桌面壁纸上显示计算机名

    时间:2018-07-16 记录:byzqy 介绍: 在管理多台计算机时,将每台计算机的ID或者计算机名醒目的显示在电脑桌面,往往是一个不错的选择.下面记录一下在Ubuntu 16.04上使用Pyth ...

  9. 修改anaconda3 jupyter notebook 默认路径

    本文参考了: https://blog.csdn.net/u014552678/article/details/62046638 https://blog.csdn.net/qigenhuochai/ ...

  10. MySQL 事务和锁

    1. 事务 1.1 什么是事务? 1.2 事务的特性:ACID 1.3 事务语句 1.4 事务的隔离级别 1.5 锁 1.6 事务隔离解决并发问题 2. 死锁 2.1 场景示例 2.2 死锁调优 3. ...