「Codeforces」C. Differential Sorting

news/2024/12/29 13:37:34/

C. Differential Sorting

https://codeforces.com/contest/1635/problem/C

题目描述

你有一个大小为 n n n 数组,可以选择 3 个索引 x , y , z x,y,z x,y,z 1 ≤ x < y < z ≤ n 1\leq x \lt y \lt z \leq n 1x<y<zn),并将 a x a_x ax 替换为 a y − a z a_y-a_z ayaz ,并且 ∣ a x ∣ ≤ 1 0 18 |a_x| \leq 10^{18} ax1018。你最多可以操作 n n n 次,操作完后使数组不递减。

输入描述

每个测试包含多个测试用例。 第一行将包含一个整数 t (1≤t≤10000)——测试用例的数量。 然后是 t 个测试用例。

每个测试用例的第一行包含一个整数 n (3≤n≤2⋅105) — 数组 a 的大小。

每个测试用例的第二行包含 n 个整数 a1,a2,…,an (−109≤ai≤109),即 a 的元素。

保证所有测试用例的 n 之和不超过 2⋅105。

输出描述

对于每个测试用例,如果没有解决方案,则在一行中打印 -1。 否则在第一行你应该打印一个整数 m (0≤m≤n)——你执行的操作数。

那么接下来的 m 行中的第 i 行应该包含三个整数 x,y,z (1≤x<y<z≤n)——第 i 次操作的描述。

如果有多个解决方案,您可以输出任何一个。 请注意,您不必最小化此任务中的操作数。

样例

#1

3
5
5 -4 2 -1 2
3
4 3 2
3
-3 -2 -1
2
1 2 3
3 4 5
-1
0

提示

在第一个示例中,数组变为
[−6,−4,2,−1,2] 在第一次操作之后,
[−6,−4,−3,−1,2] 在第二次操作之后。
在第二个示例中,不可能使数组在任何操作序列之后排序。
在第三个示例中,数组已经排序,所以我们不需要执行任何操作。

解析

x , y , z x,y,z x,y,z 1 ≤ x < y < z ≤ n 1\leq x \lt y \lt z \leq n 1x<y<zn)这个条件可知:

  1. 一定存在 a n ≥ a n − 1 a_n \ge a_{n-1} anan1 ,若不存在则此序列无解,因为无法找出满足条件的 3 个索引,因此无法处理这种关系。
  2. 在满足上面的条件的前提下,若 a n ≥ 0 a_n \ge 0 an0 则前面的所有数字都可以使用 a x = a n − a n − 1 a_x = a_n - a_{n-1} ax=anan1 来修正(修正为同一个数值,题目没说严格递增,因此可行)。
  3. a n < 0 a_n < 0 an<0 且此序列非升序,则此序列无解。
  4. a n < 0 a_n < 0 an<0 且此序列升序,则此序列有解。

证明: a n < 0 a_n < 0 an<0 且此序列非升序,则此序列无解。(我本人也只是个学渣,也不知道算不算证明,仅供参考哈)

假设该序列为 a i ≥ a i + 1 ≤ ⋯ ≤ a n − 1 ≤ a n a_i \ge a_{i+1} \leq \dots \leq a_{n-1} \leq a_n aiai+1an1an ,存在 a i ≥ a i + 1 a_i \ge a_{i+1} aiai+1 ,从右向左看,你需要修改 a i a_i ai a i + 1 a_{i+1} ai+1 其中一个,使其满足 a i ≤ a i + 1 a_i \leq a_{i+1} aiai+1 ,因为 a n < 0 a_n < 0 an<0 ,为了保证整个序列不降(即保证升序),所以整个序列都是负数。根据负数减负数的性质可知,当 − a − ( − b ) -a-(-b) a(b) − b -b b 的值越小,则结果越大,反之越小。假设修改 a i + 1 a_{i+1} ai+1 ,后面的值是越来越大, a x = a y − a z a_x = a_y - a_z ax=ayaz 最终的值必然越来越小。

AC Code

public class Main {static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));public static void main(String[] args) throws Exception {int T = nextInt();while(T-- != 0) {int n = nextInt();int[] A = new int[n+1];for(int i = 1; i <= n; i++) A[i] = nextInt();if(A[n] < A[n-1]) {out.println(-1);continue;}if(A[n] < 0) {boolean flag = false;for(int i = 1; i < n; i++) {if(A[i] > A[i+1]) {flag = true;break;}}if(flag) out.println(-1);else out.println(0);continue;}out.println(n-2);for(int i = 1; i < n - 1; i++) {out.printf("%d %d %d\n", i, n-1, n);}}out.flush();}public static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}public static String nextStr() throws Exception {st.nextToken();return st.sval;}
}

http://www.ppmy.cn/news/61150.html

相关文章

【关于C++中----异常】

文章目录 一、C语言中处理错误的方式二、C异常概念三、异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 四、自定义异常体系五、C标准库的异常体系六、异常的优缺点 一、C语言中处理错误的方式 C语言中常见的错误类型包括&#xff1a;语法错误、逻…

【Linux】Linux下的基本指令

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 人生就是这样&#xff0c;要耐的住寂寞&#xff0c;才守得住繁华。 —— 七堇年 目录 Linux的基本命令(常用)&#xff1a; ls 指令&#xff1a; pwd指…

模拟银行账户转账业务

文章目录 一、需求分析二、核心代码1. 业务层添加 Spring 事务管理2. 配置类中设置事务管理器3. 开启注解式事务驱动 三、相关截图 一、需求分析 需求&#xff1a; 实现任意两个账户间转账操作&#xff0c;要求当转账过程出现异常时&#xff0c;转账方与被转账方的转账操作同时…

vue组件通信方式汇总

之前学习了组件通信的6中方式1-props&#xff1a;使用场景&#xff1a;【父组件给子组件传递数据】 传递数据类型&#xff1a; 可能是函数&#xff1a;实质是子组件想给父组件传递数据&#xff1b; 可能不是函数&#xff1a;实质就是父组件给子组件传递数据 特殊情况&#xff1…

springboot的创建和使用

目录 1.springboot的优点 2.springboot项目创建 2.1使用idea创建 2. 2 ⽹⻚版创建 3.项⽬⽬录介绍和运⾏ 3.1运行项目 3.2输出hello world 4.注意事项 1.路径 2.约定大于配置 spring的诞生为了简化java程序,springboot的诞生为了简化spring程序开发 1.springboot的优点…

ChatGLM-6B模型微调实战(以 ADGEN (广告生成) 数据集为例,序列长度达 2048)

kingglory/ChatGLM-6B 项目地址 1 介绍 对于 ChatGLM-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%&#xff0c;再通过模型量化、Gradient Checkpoint 等方法&#xff0c;差不多需要 7GB或则8GB 显存即可运行。 2 环境 2.1 python …

删除游戏-类似打家劫舍

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 1 熟悉打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被…

openEuler之上的K3s ARM64集群管理

K3s是CNCF认证的轻量级Kubernetes发行版&#xff0c;在全球拥有广泛的安装量&#xff0c;主要由SUSE工程师在开源社区维护。K3s除了可以单独部署外&#xff0c;也可以通过Kubernetes管理软件Rancher进行管理。SUSE中国团队与欧拉社区合作&#xff0c;以RFO SIG协作方式推动Ranc…