D. Constant Palindrome Sum(差分数组维护)

该问题描述了一个在给定数组中通过限定操作使特定条件满足的算法题目。数组长度为n,每次操作可以将一个数变为[1,k]范围内的数,目标是使得a[i]+a[n-i+1]=x,其中1≤i≤n/2。解决方案涉及差分数组,通过枚举数组对,计算x的可能范围和所需操作数,最终得出最少操作次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem - D - Codeforces

题意:给定长度为n的数组,每次操作可以选择一个数令a[i]变成[1,k]范围内的一个数,问最少需要多少次操作可以让a[i]+a[n-i+1]==x (1<= i <= n/2)满足。

思路:利用差分数组d[i]表示x取i需要的总操作数。

枚举每一对数,计算x的取值范围及所需的操作数

记mi=min(a[i] , a[n-i+1])

ma=max(a[i] , a[n-i+1])

sum=a[i] + a[n-i+1]

修改一个数时,x取值范围为[mi+1, ma+k];修改两个数时,x的取值范围为[2,2k]

所以当x∈[mi+1, ma+k],为达到x需要修改一次,即让[mi+1, ma+k]范围内的数都+1

当x∈[2,mi+1)∪(ma+k, 2k],为达到x需要修改两次,即让[2,mi+1)∪(ma+k, 2k]范围内的数都+2

注意当x==sum时,不要操作

#include <bits/stdc++.h>
#define lowbit(x) x&(-x)
#define ios cin.sync_with_stdio(false)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;

using namespace std;
int n,k;
int a[N],d[N];
void solve()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];

    for(int i=0;i<=2*k;i++) d[i]=0;
    for(int i=1;i<=n/2;i++)
    {
        int mi=min(a[i],a[n-i+1]);
        int ma=max(a[i],a[n-i+1]);
        int sum=a[i]+a[n-i+1];
        d[2]+=2;
        d[mi+1]--;

        d[sum]--;
        d[sum+1]++;
        
        d[ma+k+1]++;
        d[2*k+1]--;
    }
    for(int i=1;i<=2*k;i++)
        d[i]+=d[i-1];
    int ans=inf;
    for(int i=2;i<=2*k;i++)
        ans=min(ans,d[i]);
    cout<<ans<<'\n';
}
signed main()
{
    //ios;
    int _t=1;
    cin>>_t;
    while(_t--) solve();
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值