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

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

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;
}

解题套路:

暂定名为:

简单方案

通过操作让数组序列呈现某种规律,非递增,非递减,

还有此类提示:请注意,您不必最小化此任务中的操作数。

一般会存在某个值,数组里的某些元素可以全部修改为这种值,使得数组有规律。


目录
相关文章
|
7月前
|
SQL 分布式计算 数据挖掘
从湖仓分离到湖仓一体,四川航空基于 SelectDB 的多源数据联邦分析实践
川航选择引入 SelectDB 建设湖仓一体大数据分析引擎,取得了数据导入效率提升 3-6 倍,查询分析性能提升 10-18 倍、实时性提升至 5 秒内等收益。
515 63
从湖仓分离到湖仓一体,四川航空基于 SelectDB 的多源数据联邦分析实践
|
11月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
194 1
|
11月前
|
缓存 关系型数据库 MySQL
MySQL执行计划深度解析:如何做出最优选择
【10月更文挑战第23天】 在数据库查询性能优化中,执行计划的选择至关重要。MySQL通过查询优化器来生成执行计划,但有时不同的执行计划会导致性能差异。理解如何选择合适的执行计划,以及为什么某些计划更优,对于数据库管理员和开发者来说是一项必备技能。
704 2
|
弹性计算 分布式计算 分布式数据库
ECS网络问题之访问网站失败如何解决
ECS(Elastic Compute Service,弹性计算服务)是云计算服务提供商提供的一种基础云服务,允许用户在云端获取和配置虚拟服务器。以下是ECS服务使用中的一些常见问题及其解答的合集:
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用问题之在安装GMS时遇到Docker,该如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
data——watsh
data——watsh
209 0
|
Linux 网络安全
linux配置IP访问权限
linux配置IP访问权限
215 1
|
弹性计算 运维 持续交付
基于资源编排服务(ROS)实现存量资源的IaC化
如果您需要一种简单而有效的方法来管理大量云资源并实现自动化部署,推荐使用阿里云的资源编排服务ROS(Resource Orchestration Service)。ROS能够将存量资源转化为IaC(基础设施即代码),通过资源场景创建、模版生成和资源栈导入等功能,实现资源的统一管理和自动化部署。这不仅提高了资源管理的效率,还降低了成本。如果您想了解如何更轻松地管理云资源并加速部署流程,ROS是一个值得深入了解的工具。
|
消息中间件 缓存 NoSQL
详细讲解服务幂等性设计
在日常工作中的一些技术设计方案评审会上,经常会有提到注意服务接口的幂等性问题,最近就有个同学就跑到跟前问我,幂等性到底是个啥?
详细讲解服务幂等性设计
|
NoSQL Cloud Native 关系型数据库
从传统数据库到云数据库演进(二)
从传统数据库到云数据库演进(二)
147 0