Minimize Equal Sum Subarrays

Minimize Equal Sum Subarrays

题面翻译

最小化相等和子数组

题目描述

已知 农夫约翰喜欢排列,我也喜欢它们!

给定一个长度为 n n n 的排列 p p p

找到一个长度为 n n n 的排列 q q q,使得以下条件下的对数最小化:对所有 1 ≤ i ≤ j ≤ n 1 \leq i \leq j \leq n 1ijn,使得 p i + p i + 1 + … + p j = q i + q i + 1 + … + q j p_i + p_{i+1} + \ldots + p_j = q_i + q_{i+1} + \ldots + q_j pi+pi+1++pj=qi+qi+1++qj

:一个长度为 n n n 的排列是一个包含 1 1 1 n n n n n n 个不同整数的数组。例如,[2, 3, 1, 5, 4] 是一个排列,但 [1, 2, 2] 不是一个排列(数字 2 在数组中出现了两次),而 [1, 3, 4] 也不是一个排列( n = 3 n=3 n=3,但数组中有 4)。

输入格式

第一行包含一个整数 $ t$ ( 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1t104) — 测试用例的数量。

每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \leq n \leq 2 \cdot 10^5 1n2105)。

接下来一行包含 n n n 个空格分隔的整数 p 1 , p 2 , … , p n p_1, p_2, \ldots, p_n p1,p2,,pn( 1 ≤ p i ≤ n 1\leq p_i \leq n 1pin) — 表示长度为 n n n 的排列 p p p

保证所有测试用例中 n n n 的总和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105

输出格式

对于每个测试用例,输出一行包含任意长度为 n n n 的排列 q q q,使得 q q q 最小化满足条件的对数。

提示说明

对于第一个测试用例,存在唯一一对 ( i , j ) (i, j) (i,j) ( 1 ≤ i ≤ j ≤ n 1 \leq i \leq j \leq n 1ijn) 使得 p i + p i + 1 + … + p j = q i + q i + 1 + … + q j p_i + p_{i+1} + \ldots + p_j = q_i + q_{i+1} + \ldots + q_j pi+pi+1++pj=qi+qi+1++qj,即 ( 1 , 2 ) (1, 2) (1,2)。可以证明,没有这样的 $ q $ 使得不存在满足条件的对。

样例输入 #1

3
2
1 2
5
1 2 3 4 5
7
4 7 5 1 2 6 3

样例输出 #1

2 1
3 5 4 2 1
6 2 1 4 7 3 5

代码内容

// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll N=2e5+10;
ll a[N];

void solve()
{
    ll n;
    cin>>n;

    for(ll i=0;i<n;i++)
        cin>>a[i];

    cout<<a[n-1];
    for(ll i=0;i<n-1;i++)
        cout<<" "<<a[i];
    cout<<endl;
}

int main()
{
    ll t;
    cin>>t;

    while(t--) solve();

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pretty Boy Fox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值