赞
踩
a数组是b数组的前缀和
b数组是a数组的差分
前缀和与差分两者互为逆运算
a[i]=a[i-1]+b[i]
我们可以得出a[i]就是b数组的前i项之和。
b[i]=a[i]-a[i-1]
我们可以得出b[i]就是a[i]与a[i-1]的差。
前缀和可以将数组区间的求和运算从O(n)级别降低到O(1)级别
差分可以将一个区间的增加与减少运算从O(n)级别降低到O(1)级别
每次判断当前数目可变的区间与变化个数,对区间进行差分运算
package C636; import java.util.*; public class D { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int t=sc.nextInt(); while(t-->0){ int n=sc.nextInt(),k=sc.nextInt(); int arr[]=new int[n]; int c[]=new int[2*k+1]; for(int i=0;i<n;i++){ arr[i]=sc.nextInt(); } for(int i=0;i<n/2;i++){ int x=i,y=n-i-1; int min=Math.min(arr[x], arr[y])+1; int max=Math.max(arr[x], arr[y])+k; int mid=arr[x]+arr[y]; c[1]+=2; c[min]--; c[mid]--; if(mid!=2*k){ c[mid+1]++; } if(max!=2*k){ c[max+1]++; } } int ans=2*n; for(int i=1;i<=2*k;i++){ c[i]+=c[i-1]; ans=Math.min(ans, c[i]); } System.out.println(ans); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。