cf1653c通过操作让数组序列呈现某种规律 C. Differential Sorting

news/2024/11/29 8:39:10/

G

题面

1635/c
Problem - 1635c - Codeforces
给你一个数组a
的n个
元素的数组。

你可以执行以下操作,但不超过n
次: 选择三个指数x,y,z
(1≤x<y<z≤n)
并将ax
替换为 ay-az
. 操作后,|ax|
需要小于1018
.

你的目标是使得到的数组不递减。如果有多种解决方案,你可以输出任何一种。如果不可能实现,你也应该报告。

输入
每个测试包含多个测试案例。第一行将包含一个单一的整数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)

  • 你所执行的操作的数量。

然后,下面的第i
-行中的第i
行应该包含三个整数x、y、z
(1≤x<y<z≤n)

  • 对第i
    -的操作。

如果有多个解决方案,你可以输出任何一个。请注意,在这个任务中,你不需要将操作的数量降到最低。

例子
输入复制
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]
在第二次操作后变成[-6,-4,-3,-1,2]。

在第二个例子中,不可能在任何操作序列后使数组排序。

在第三个例子中,数组已经被排序,所以我们不需要进行任何操作。

1 2 3
3 2 -3- 2

1


切入点

(1≤x<y<z≤n)

思路:

分析切入点得到后两个元素无法被修改,所以后两个元素a[n],a[n-1]必定非递减才有解。
如果递减就直接输出-1;
再分析非递减情况下,
操作是把a[i] 变成 a[x] - a[y],x < y
数组中目前只有a[n]和a[n-1]的大小关系是通过分析可以确定的,所以
a[x] 和a[y]第一波操作肯定要用a[n] 和a[n-1],
a[n-1] - a[n]由于a[n] 可能是负数。
运算结果要分类讨论:
a[n] >= 0时
由于a[n-1] < a[n]
会得到一个小于等于a[n-1]的负数,满足非递减,直接让前面的数全部变成这个值就行。
a[n] < 0时:
由于a[n-1] < a[n]
会得到一个大于a[n-1]的负数,不满足非递减,此时没有一种特殊的方法可以使数组变成非递减形式,所以只有当数组一开始就满足条件时才能够有解为0

第一反应比较棘手的操作是如何判断数组非递减

稍作思考发现原来遍历一遍就可以判断了,一点也不棘手


做这道题之前必须拥有的思路,
也就是

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5 + 10;
int ar[N];
int main(){int T;cin >> T;while(T--){int n;scanf("%d",&n);for(int i = 1;i <= n;i++){scanf("%d",&ar[i]);}if(ar[n] < ar[n-1]) printf("-1\n");else{if(ar[n] >= 0){int ans  = 0;for(int i = 1;i <= n-2;i++){ar[i] = ar[n-1] - ar[n];ans++;}printf("%d\n",ans);for(int i = 1;i <= ans;i++){printf("%d %d %d\n",i,n-1,n);}}else{bool  flag = 0;for(int i = 1;i <= n-1;i++){if(ar[i] > ar[i+1]) flag = true;}if(flag) cout << -1 << endl;else cout << 0 << endl;}}}return 0;
}

解题套路:

暂定名为:

简单方案

通过操作让数组序列呈现某种规律,非递增,非递减,
还有此类提示:请注意,您不必最小化此任务中的操作数。
一般会存在某个值,数组里的某些元素可以全部修改为这种值,使得数组有规律。


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

相关文章

JavaWeb——TCP协议的相关特性

目录 一、TCP 1、特性 2、确认应答 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、原理 &#xff08;3&#xff09;、接收缓冲区 3、超时重传 &#xff08;1&#xff09;、丢包 &#xff08;2&#xff09;、定义 &#xff08;3&#xff09;、分类 二、…

ONVIF协议介绍

目录标题 一、 ONVIF协议简介&#xff08;Introduction to ONVIF Protocol&#xff09;1.1 ONVIF的发展历程&#xff08;The Evolution of ONVIF&#xff09;1.2 ONVIF的主要作用与优势&#xff08;The Main Functions and Advantages of ONVIF&#xff09; 二、 ONVIF协议的底…

SpringBoot整合ClickHouse

目录 1 ClickHouse准备操作2 使用jdbc方式操作ClickHouse3 SpringBoot的整合ClickHouse 1 ClickHouse准备操作 使用的JDBC方式操作clickhouseclickhouse与springboot的整合使用 提前创建一张表&#xff0c;并为该表插入一些实验数据 create table t_order01(id UInt32,sku_id…

图的存储(邻接矩阵邻接表)

图的存储 文章目录 图的存储1 邻接矩阵1.1 邻接矩阵存储结构定义1.2 完整代码应用 2 邻接表2.1 邻接表存储结构定义2.2 完整代码应用 1 邻接矩阵 A [ i ] [ j ] 1 A[i][j]1 A[i][j]1 表示顶点i与顶点j邻接&#xff0c;即i与j之间存在边或者弧。 A [ i ] [ j ] 0 A[i][j]0 A…

计算机图形学(5):OpenGL光照

参考 介绍 现实世界中的光照是极其复杂&#xff0c;难以计算的&#xff0c;因此OpenGL的光照使用的是简化的模型&#xff0c;其中一个模型被称为冯氏光照模型(Phong Lighting Model)。 冯氏光照模型的主要结构由三个分量组成&#xff1a; 环境(Ambient)光照 漫反射(Diffuse)…

【C/C++】结构体对齐详解

文章目录 结构体内存对齐原则结构体对齐方法结构体对齐意义 结构体内存对齐原则 结构体内存对齐是由编译器自动完成的&#xff0c;编译器会按照一定的规则将结构体成员按照一定的字节对齐方式排列在内存中。不同的编译器可能会有不同的对齐规则&#xff0c;但通常都遵循以下几…

第三章 作业(7BF)【计算机系统结构】

第三章 作业&#xff08;7BF&#xff09;【计算机系统结构】 前言推荐第三章 作业&#xff08;7BF&#xff09;71115鲲鹏流水线调研华为鲲鹏处理器ARM体系的总体思想ARM的流水线结构 最后 前言 2023-4-10 18:49:41 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐…

瀚高股份吕新杰:创新开源双驱动 躬耕国产数据库

近年来&#xff0c;国际形势不断变幻&#xff0c;也给人们带来巨大警示&#xff1a;关键核心技术是买不来、讨不来的&#xff0c;中国科技企业需寻找研发自强之路。 瀚高基础软件股份有限公司&#xff08;简称瀚高股份&#xff09;专注数据库十八年&#xff0c;始终以“振兴民…