P8976 「DTOI-4」排列题目背景Update on 2023.2.1新增一组针对 yuanjiabao 的 Hack 数据放置于 #21。Update on 2023.2.2新增一组针对 CourtesyWei 和 bizhidaojiaosha 的 Hack 数据放置于 #22。构造一个排列p pp使得下标为奇数的项之和 ≥ a 且下标为偶数的项之和 ≥ b 。 \small\color{white}{下标为奇数的项之和 \geq a 且下标为偶数的项之和 \geq b。}下标为奇数的项之和≥a且下标为偶数的项之和≥b。题目描述小 L 给你一个偶数n nn和两个整数a , b a, ba,b请你构造一个长为n nn的排列p pp使得其满足∑ i 1 n 2 p i ≥ a \displaystyle\sum_{i 1}^{\frac{n}{2}} p_i \geq ai1∑2n​​pi​≥a且∑ i n 2 1 n p i ≥ b \displaystyle\sum_{i \frac{n}{2} 1}^{n} p_i \geq bi2n​1∑n​pi​≥b。输入格式本题有多组测试数据。第一行一个整数T TT表示数据组数。对于每组数据一行三个整数n , a , b n, a, bn,a,b。输出格式对于每组数据如果无解输出− 1 -1−1否则输出一行n nn个整数表示你构造出的排列p pp。如有多解输出任意一组均可。输入输出样例 #1输入 #12 6 6 12 6 8 14输出 #11 6 2 5 3 4 -1说明/提示本题开启 Special Judge。Subtask \textbf{Subtask}Subtaskn nna , b a, ba,b分值1 112 ≤ n ≤ 10 2 \leq n \leq 102≤n≤10无特殊限制20 pts ⁡ 20 \operatorname{pts}20pts2 22无特殊限制a b 0 a b 0ab010 pts ⁡ 10 \operatorname{pts}10pts3 33同上a 0 a 0a0或b 0 b 0b010 pts ⁡ 10 \operatorname{pts}10pts4 44同上无特殊限制60 pts ⁡ 60 \operatorname{pts}60pts对于100 % 100\%100%的数据2 ≤ n , ∑ n ≤ 10 5 2 \leq n, \sum n \leq 10^52≤n,∑n≤1050 ≤ a , b ≤ n ( n 1 ) 2 0 \leq a, b \leq \frac{n(n 1)}{2}0≤a,b≤2n(n1)​1 ≤ T ≤ 10 1 \leq T \leq 101≤T≤10n nn为偶数。C实现#includebits/stdc.h#defineintlonglongusingnamespacestd;constintN1e55;intt;signedmain(){intt;cint;while(t--){intn,a,b;cinnab;intsum(1n/2)*n/4;if(suma){//a选择1~n/2if((1n)*n/2-sumb)printf(-1\n);else{for(inti1;in;i)printf(%d ,i);printf(\n);}continue;}intmovnum(a-sum)/(n/2);//增加n/2的次数if(movnumn/2||(movnumn/2(a-sum)%(n/2))){//总操作次数不能大于n/2printf(-1\n);continue;}boolvis[N]{};//标记哪些数属于前半部分intsuma0;for(inti1;i(n/2)-movnum;i)sumai,vis[i]1;suma(n/2)-movnum(a-sum)%(n/2);vis[(n/2)-movnum(a-sum)%(n/2)]1;for(inti(n/2)-movnum1;in/2;i)sumain/2,vis[in/2]1;if((1n)*n/2-sumab)printf(-1\n);else{for(inti1;in;i)if(vis[i])printf(%d ,i);for(inti1;in;i)if(!vis[i])printf(%d ,i);printf(\n);}}return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容