Constant Palindrome Sum

本文介绍了一种利用差分数组解决特定数列问题的方法,针对数列中元素与其对应位置上的配对元素之和固定的情况,通过巧妙的数据结构简化求解过程。文章详细解析了如何使用差分数组来计算最少替换次数,以达到预定的目标和。

**

Constant Palindrome Sum

**
传送门
需要知识:差分数组

题意:对于数列,使a[i]+a[n-i+1]=x,用[1,k]之间任意一个数替换a[i]或者是a[n-i+1],求出替换最小的次数。
这道题用的是差分数组,用差分数组维护x=[2,2k]的次数。这道题我是没有想出来,看了题解才知道,而且差分我也很少运用,算是盲区了

对于每对a[i]+a[n-i+1],设置sum=a[i]+a[n-i+1],minn=min(a[i],a[n-i+1]),maxx=max(a[i],a[n-i+1]).

当x=[2,minn]时,两个数必须都修改,因为a[i]最小为1嘛.

当x=[minn+1,sum-1],[sum+1,maxx+k],修改一个数

当x[maxx+k+1,2k]修改两个数

最后的出来的是次数,而不是那个数字,所以用差分还是很好做的

import java.util.*;
public class pd{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		while(t-->0){
			int n = sc.nextInt();
			int k = sc.nextInt();
			int[] a = new int[n];
			int[] cnt = new int[2*k+1];
			int[] pref = new int[2*k+2];
			for(int i=0;i<n;i++){
				a[i]=sc.nextInt();
			}
			for(int i=0;i<n/2;i++){
				cnt[a[i]+a[n-i-1]]++;
			}
			for(int i=0;i<n/2;i++){
				//int l1=a[i]+1;
				//int r1 = a[n-i+1]+1;
				//int l2 = a[i]+k;
				//int r2 = a[n-i+1]+k;
				int l = Math.min(a[i],a[n-i-1])+1;
				int r = Math.max(a[i],a[n-i-1])+k;
				pref[l]++;
				pref[r+1]--;
			}
			for(int i=1;i<=2*k+1;i++){
				pref[i]+=pref[i-1];
			}
			int ans = Integer.MAX_VALUE;
			for(int sum=2;sum<=2*k;sum++){
				ans = Math.min(ans,pref[sum]-cnt[sum]+(n/2-pref[sum])*2);
			}
			System.out.println(ans);

		}
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值