本文涉及知识点

构造

P8976 「DTOI-4」排列

题目背景

Update on 2023.2.1:新增一组针对 @yuanjiabao 的 Hack 数据,放置于 #21。

Update on 2023.2.2:新增一组针对 @CourtesyWei 和 @bizhidaojiaosha 的 Hack 数据,放置于 #22。


构造一个排列 p p p,使得 下标为奇数的项之和 ≥ a 且下标为偶数的项之和 ≥ b 。 \small\color{white}{下标为奇数的项之和 \geq a 且下标为偶数的项之和 \geq b。} 下标为奇数的项之和a且下标为偶数的项之和b

题目描述

小 L 给你一个偶数 n n n 和两个整数 a , b a, b a,b,请你构造一个长为 n n n 的排列 p p p,使得其满足 ∑ i = 1 n 2 p i ≥ a \displaystyle\sum_{i = 1}^{\frac{n}{2}} p_i \geq a i=12npia ∑ i = n 2 + 1 n p i ≥ b \displaystyle\sum_{i = \frac{n}{2} + 1}^{n} p_i \geq b i=2n+1npib

输入格式

本题有多组测试数据。

第一行,一个整数 T T T,表示数据组数。

对于每组数据:

一行,三个整数 n , a , b n, a, b n,a,b

输出格式

对于每组数据,如果无解,输出 − 1 -1 1;否则,输出一行, n n n 个整数,表示你构造出的排列 p p p

如有多解,输出任意一组均可。

输入输出样例 #1

输入 #1

2
6 6 12
6 8 14

输出 #1

1 6 2 5 3 4
-1

说明/提示

本题开启 Special Judge。

Subtask \textbf{Subtask} Subtask n n n a , b a, b a,b分值
1 1 1 2 ≤ n ≤ 10 2 \leq n \leq 10 2n10无特殊限制 20 pts ⁡ 20 \operatorname{pts} 20pts
2 2 2无特殊限制 a = b = 0 a = b = 0 a=b=0 10 pts ⁡ 10 \operatorname{pts} 10pts
3 3 3同上 a = 0 a = 0 a=0 b = 0 b = 0 b=0 10 pts ⁡ 10 \operatorname{pts} 10pts
4 4 4同上无特殊限制 60 pts ⁡ 60 \operatorname{pts} 60pts

对于 100 % 100\% 100% 的数据, 2 ≤ n , ∑ n ≤ 1 0 5 2 \leq n, \sum n \leq 10^5 2n,n105 0 ≤ a , b ≤ n ( n + 1 ) 2 0 \leq a, b \leq \frac{n(n + 1)}{2} 0a,b2n(n+1) 1 ≤ T ≤ 10 1 \leq T \leq 10 1T10 n n n偶数

构造

const long long M = N / 2;
long long x1 = (1 + M) * M / 2; 
long long x2 = (M + 1 + 2 * M) * M / 2;

x1是最小的一半数之和,x2是最大的一半数之和。
如果a>x2,无解。
x = max(x1,a) 余下的都给b,如果不足,则无解。
y = x − x 1 y=x-x1 y=xx1故y ∈ [ 0 , x 2 − x 1 ] , x 2 − x 1 = 2 × M × M / 2 = M × M \in[0,x2-x1],x2-x1=2\times M \times M /2=M\times M [0,x2x1],x2x1=2×M×M/2=M×M
(i,i+M)共M组,如果 M ∣ y M|y My,则任选 y M \frac y M My组。
c1 = y/M,c2=y%M。
如果 c 1 ≤ M − 2 c1 \le M-2 c1M2
M和M+c2换,其它c1组从其它M-2组(除1组和c2组外)中选。
如果 c 1 > M − 2 c1 > M-2 c1>M2
全部换了在换回来。
M + 1 ∼ 2 × M M+1 \sim 2\times M M+12×M 换M,减少 1 ∼ M − 1 1 \sim M-1 1M1
M + 1 ∼ 2 × M M+1 \sim 2\times M M+12×M 换1,减少 M ∼ 2 M − 1 M \sim 2M-1 M2M1
结合一起就是 1 ∼ 2 M − 1 1 \sim 2M-1 12M1

代码

核心代码

#include <iostream>
#include <sstream>
#include <vector>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<string>
#include<algorithm>
#include<functional>
#include<queue>
#include <stack>
#include<iomanip>
#include<numeric>
#include <math.h>#include <bitset>
using namespace std;template<class T = int>
vector<T> Read(int n,const char* pFormat = "%d") {vector<T> ret;T d ;while (n--) {scanf(pFormat, &d);ret.emplace_back(d);}return ret;
}template<class T = int>
vector<T> Read( const char* pFormat = "%d") {int n;scanf("%d", &n);vector<T> ret;T d;while (n--) {scanf(pFormat, &d);ret.emplace_back(d);}return ret;
}class Solution {public:vector<int> Ans(int N,long long a,long long b ) {const long long M = N / 2;long long x1 = (1 + M) * M / 2;long long x2 = (M + 1 + 2 * M) * M / 2;if (a > x2) { return { -1 }; }long long x = max(x1, a);if(x1+x2-x < b ) { return { -1 }; }long long x3 = (x - x1) / M;long long x4 = (x - x1) % M;if (x3 >= M-1 ) {vector<int> ans(N);iota(ans.begin(), ans.begin() + M, M + 1);iota(ans.begin() + M, ans.end(), 1);if (M - 1 == x3) {const int i1 = (M+1)-(M - x4) - 1 + M;swap(ans[i1], ans[0]);}return ans;}vector<int> ans1, ans2;vector<bool> has(M + 1);int iInit = 0;if (0 != x4){ans1.emplace_back(1);ans1.emplace_back(M + 1);ans2.emplace_back(M + 1 - x4);ans2.emplace_back(M * 2 + 1 - x4);has[1] = has[M + 1 - x4] = true;iInit += 2;}for (int i = 1; i <= M; i++) {if (has[i]) { continue; }if (ans1.size() < x3 + iInit) {ans1.emplace_back(i + M);ans2.emplace_back(i);}else {ans1.emplace_back(i );ans2.emplace_back(i + M);}}ans1.insert(ans1.end(), ans2.begin(), ans2.end());return ans1;}};int main() {
#ifdef _DEBUGfreopen("a.in", "r", stdin);
#endif // DEBUGint T;scanf("%d", &T);while (T--) {int n;long long a,b;cin >> n >> a >> b;Solution slu;auto res = slu.Ans(n, a, b);for (auto i : res){std::cout << i << " ";}std::cout << std::endl;}return 0;
}

单元测试

		void Check(vector<int>& res,int N,long long a,long long b) {set<int> s(res.begin(),res.end());bool b2 = s.size() == N;Assert::IsTrue(b2);Assert::AreEqual(1, *s.begin());Assert::AreEqual(N, *s.rbegin());const int M = N / 2;const auto a1 = accumulate(res.begin(), res.begin() + M, 0LL);const auto b1 = accumulate(res.begin() + M, res.end(), 0LL);Assert::IsTrue(a1 >= a);Assert::IsTrue(b1 >= b);}TEST_METHOD(TestMethod11){		auto res = Solution().Ans(6, 16, 1);AssertEx(vector<int>{-1}, res);}TEST_METHOD(TestMethod12){auto res = Solution().Ans(6 ,1, 16);AssertEx(vector<int>{-1}, res);}TEST_METHOD(TestMethod13){Test(4);}TEST_METHOD(TestMethod14){Test(6);}TEST_METHOD(TestMethod15){Test(8);}TEST_METHOD(TestMethod16){Test(10);}TEST_METHOD(TestMethod17){Test(12);}TEST_METHOD(TestMethod18){Test(14);}TEST_METHOD(TestMethod19){Test(100);}void Test(int N) {const long long M = N / 2;long long x1 = (1 + M) * M / 2;long long x2 = (M + 1 + 2 * M) * M / 2;for (long long a = x1-1; a <= x2; a++) {auto res = Solution().Ans(N, a, 1);Check(res, N, a, 1);}}		

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87313.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87313.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87313.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多路I/O转接服务器(select、poll、epoll)

多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是&#xff0c;不再由应用程序自己监视客户端连接&#xff0c;取而代之由内核替应用程序监视文件。 IO 多路转接方式比较&#xff1a; 常见的 IO 多路转接方式有&#xff1a;select、poll、epoll&#xff0c;他…

最新临时文件快传系统源码 轻量化 带后台

简介&#xff1a; 最新临时文件快传系统源码 轻量化 带后台 首发 轻松上传文件并生成提取码分享给他人&#xff0c;无需注册&#xff0c;方便快捷。 图片&#xff1a;

MyBatis多数据源动态连接工具类实现

这个DatabaseService工具类提供了动态创建MyBatis SqlSession的能力&#xff0c;可以灵活地连接到不同的数据库&#xff0c;非常适合需要动态切换数据源的场景。 package com.cmes.immp.device.utils;import lombok.SneakyThrows; import org.apache.commons.dbcp2.BasicDataS…

用亮数据 MCP 驱动 Trae 智能体:打造高效亚马逊商品采集与分析助手

本文适合希望快速构建数据驱动型智能体的开发者、数据工程师及 AI 产品设计者阅读 并非广告&#xff0c;希望本文可以帮助有需求的同学&#xff0c;祝大家天天开心 在数字时代&#xff0c;数据是决策与洞察趋势的关键。但移动互联网数据获取不易&#xff0c;传统爬虫技术面对复…

如何降低AIGC生成内容的重复率?五种免费降AI率的方法 (25年更新)

随着AI生成内容&#xff08;AIGC&#xff09;的普及&#xff0c;越来越多的学术写作依赖AI工具来生成论文和文章。然而&#xff0c;AI生成内容的查重率常常偏高&#xff0c;导致很多论文无法通过学术查重系统。为了解决这一问题&#xff0c;以下是五种有效的免费降AIGC率的方法…

小米YU7使用UWB技术,厘米级定位精准迎宾,安全防破解无感控车

当您双手抱着快递走向爱车时&#xff0c;车门自动解锁&#xff1b;当您站在前备箱前稍作停留&#xff0c;箱盖优雅升起——这不是科幻电影&#xff0c;而是小米YU7搭载UWB技术带来的真实体验。在2025年5月的小米15周年战略新品发布会上&#xff0c;雷军揭晓了这项革命性技术&am…

WPF学习(动画)

文章目录 一、图像变换 RenderTransform1、常见变换类型2、RenderTransform 的核心作用3、RenderTransform 的使用方式4、与 LayoutTransform 的对比5、在动画中的应用 二、 滚动的椭圆三、Storyboard放置位置1. **元素的 Resources 集合**2. **控件模板&#xff08;ControlTem…

Crossbar结构的排队策略

目录 一、概述 二、排队策略 三、输入排队结构(IQ) 3.1 结构特点 3.2 改进方案 四、输出排队结构&#xff08;OQ&#xff09; 五、输入输出联合排队结构(CIOQ) 六、输入交叉节点联合排队结构(CICQ) 一、概述 Crossbar是一种全连接的交换结构&#xff0c;由 MN 个交叉…

状态模式 - Flutter中的状态变身术,让对象随“状态“自由切换行为!

订单状态流转/播放器控制/游戏角色行为…一个模式搞定所有状态驱动型逻辑&#xff01; 经典场景&#xff1a;订单状态管理 假设你在开发一个外卖App&#xff0c;订单有以下状态&#xff1a; 等待接单已接单配送中已完成已取消 每个状态下&#xff1a; 显示的UI不同可执行的…

数据库9:数据库字符编码调整与校队(排序)规则

一.常用字符编码 1.ASCII编码 用一个字节表示一个字符 2.ANSI编码 每个国家为了显示本国的语言而对ASCII码进行了拓展 用两个字节表示一个汉字&#xff0c;中国的ANSI编码是GB2312编码&#xff08;简体&#xff09;&#xff0c;日本的ANSI编码是JIS编码&#xff0c;台湾的A…

人脸活体识别4:Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测)

人脸活体识别4&#xff1a;Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测) 目录 人脸活体识别4&#xff1a;Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测) 1. 前言 2.人脸活体识别方法 &#xff08;1&#xff09;基于人脸动作的检测​​ &#xff08;2&…

DAY1-Linux操作系统1

文章参考【黑马程序员Python教程_600集Python从入门到精通教程&#xff08;懂中文就能学会&#xff09;】 https://www.bilibili.com/video/BV1ex411x7Em/?p40&share_sourcecopy_web&vd_source263bbee2ddeb835c3ab6d9d3c80e0f7c 一.常用命令简单介绍 使用软件 虚拟机…

第十二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 两种权限控制方式(附前后端代码)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

华为云Flexus+DeepSeek征文 | 华为云 ModelArts Studio 赋能 AI 法务:合同审查与法律文件生成系统

一、引言 在法律行业数字化转型的浪潮中&#xff0c;AI 技术正重塑法律服务的流程与效率。本文介绍如何利用华为云 ModelArts Studio 构建一套完整的 AI 法务系统&#xff0c;实现合同审查、法律文件生成、法律咨询与风险识别的智能化解决方案。 二、系统架构设计 &#xff0…

SQL的底层逻辑解析

SQL的底层逻辑涉及数据库管理系统(DBMS)如何解析、优化和执行SQL查询&#xff0c;主要包括以下几个层面&#xff1a; ​查询处理流程​ 解析器(Parser)&#xff1a;将SQL语句转换为语法树查询优化器(Optimizer)&#xff1a;基于统计信息和成本模型生成最优执行计划执行引擎(Exe…

深入剖析AI大模型:PyTorch 技术详解

今天说一说PyTorch。作为一名python程序员&#xff0c;可能对它了解起来还是很快的。在人工智能浪潮席卷全球的当下&#xff0c;深度学习作为其核心技术&#xff0c;被广泛应用于图像识别、自然语言处理、语音识别等多个领域。而在深度学习的开发框架中&#xff0c;PyTorch 凭借…

物联网架构:定义、解释和实例

物联网&#xff08;IoT&#xff09;架构是一个复杂且多维度的概念&#xff0c;构成了物联网系统的核心框架。它是勾勒物联网设备、应用程序和技术如何相互交互以实现预期功能的蓝图。物联网架构并非 “一刀切” 的模型&#xff0c;而是会根据相关物联网系统的具体需求而有所不同…

拿到一台新服务器,怎么跑AI项目

公司新采购一台AI服务器&#xff0c;花大本钱装了个A6000显卡&#xff0c;今天来记录下新服务的使用步骤。 1、查看系统。 这台服务器预装了Ubuntu20.04系统。 lsb_release -a 查看下cpu、内存情况 top 看着还行。 再看下硬盘空间 df -h 空间不算小&#xff0c;2T。 2、…

IO--进程实操

1.创建一个进程扇 #include <051head.h> int main(int argc, const char *argv[]) {pid_t pid;for(int i0;i<4;i){pidfork();if(pid-1) //父进程{ERRLOG("fork error..\n");} else if(pid0) //这是子进程{ …

模型预测控制(MPC)概览

模型预测控制&#xff08;Model Predictive Control, MPC&#xff09; 一、理论基础与发展脉络 1. 历史起源 20世纪70年代起源于工业过程控制&#xff08;如化工领域的动态矩阵控制DMC、模型算法控制MAC&#xff09;&#xff0c;由Richalet、Mehra等学者提出&#xff0c;核心…