专栏文章

题解:CF549G Happy Line

CF549G题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioakd2y
此快照首次捕获于
2025/12/02 16:03
3 个月前
此快照最后确认于
2025/12/02 16:03
3 个月前
查看原文

题意

给定一个长度为 nn 的整数序列 aa。对于任意一对相邻元素 (ai1,ai)(a_{i-1},a_i),若 ai1>aia_{i-1}>a_i,则可以执行以下操作:
  1. ai1a_{i-1}11aia_i11
  2. 交换 ai1a_{i-1}aia_i 的位置。

思路

通过分析可以发现,每次操作虽然会改变元素的 值和位置,但每个元素的 a[i]+i 的值始终保持不变。
这样我们可以将问题转化为对辅助数组 b[i]=a[i]+i 的排序问题:首先计算 aa 数组每个元素的 a[i]+ia[i]+i 的值存入 bb 数组并排序,然后通过 a[i]=b[i]-i 还原出最终序列,这样得到的序列自然满足操作后的数值关系。
但还需要验证两个关键条件:
  1. 所有还原后的元素必须非负。
  2. 还原后的序列必须是非降的。
如果这两个条件都满足,则输出最终序列。否则说明无法通过操作使序列有序,输出 :(

代码

CPP
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],b[N],n;
int main(){
    cin>>n; 
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i]=a[i]+i;//计算辅助数组。
    }
    sort(b+1,b+n+1);//排序辅助数组。
    for(int i=1;i<=n;i++){
        a[i]=b[i]-i;//计算最终序列。
        //检查是否非负且非降。
        if(a[i]<0||(i>1&&a[i]<a[i-1])){
            cout<<":(";
            return 0;
        }
    }
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...