zoukankan      html  css  js  c++  java
  • Constant Palindrome Sum(贪心*RMQ)

    传送门

    怎么说呢,想了几个小时没做出来实在可惜。

    (color{Red}{首先肯定想到暴力嘛!但是x定值有那么多值可以取,怎么办呢?})

    但是题目中有一个很关键的条件

    [a[i]>=1&&a[i]<=k ]

    所以,在最坏情况下我们的答案会是(n/2-s.(s为frac{n}{2}对数中和为k+1的总数))

    (color{Purple}{为什么?因为不管怎样,对于所有的frac{n}{2}对数,我都可以改变一个数使得定值变成K+1.})

    [若改变一个值使得和最小,必定把最大值改为1,此时和为L=min(a,b)+1 ]

    [若改变一个值使得和最大,必定把最小值改为k,此时和为R=max(a,b)+k ]

    (显然怎么取极值都可以改变一个数到达k+1.)

    (还想缩小答案怎么办?那么定值只有frac{n}{2}种选法,也就是把已有的和当作定值。)

    如果不是这样,每对数至少要改变一次,还不如上面的决策优秀。

    (这样一来,我们可以打出一个暴力代码。期望复杂度O(n^2))

    暴力代码

    但是上面说了那么一大堆,其实代码根本过不了哈哈(折磨一下你),卡死在了最后一个数据点。

    (color{Orange}{--------------------(●ˇ∀ˇ●)我是一条分割线--------------------------})

    那怎么另辟蹊径呢?其实做法和上面也没差太多。

    (注意到,定值可能取[2,2*k](当然根据上面的暴力分析可以缩小范围,不过没必要))

    而且,对于任意的一组(a[i],a[n-i+1])来说无非三种情况。

    (Ⅰ.改变一个数达到定值)

    (Ⅱ.改变两个数达到定值)

    (Ⅲ.不需要改变达到定值)

    (现在令sumn=a[i]+a[n-i+1],x为定值,L,R(L和R的含义上面有分析))

    (color{Red}{对于第一种情况,当x>=L&&x<=R&&x!=sumn时,所有满足条件的x操作数加1})

    (color{Purple}{对于第二种情况,当x<L|| x>R时,所有满足条件的x操作数加2})

    (color{Pink}{对于第三种情况,当x==sumn时满足,操作数不变})

    那么我们完全可以维护每个数作为定制的操作数。

    (上面这些不都是区间加法吗?树状数组?线段树?差分?随便你辣!!)

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=4*1e5+9;
    int t,n,k,a[maxn],vis[maxn];
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		memset(vis,0,sizeof(vis));
    		cin>>n>>k;
    		for(int i=1;i<=n;i++)	cin>>a[i];
    		for(int i=1;i<=n/2;i++)
    		{
    			int l = min(a[i] , a[n-i+1])+1;
    	        int r = max(a[i] , a[n-i+1])+k;
    	        int sumn = a[i] + a[n-i+1];
    	    	vis[2]+=2,vis[l]-=2;//no.1 
    	    	vis[l]+=1,vis[r+1]-=1;//no.2
    	    	vis[r+1]+=2,vis[2*k+1]-=2;//no.3
    	    	vis[sumn]--,vis[sumn+1]++;//sumn在前面no.2多加了,减回来 
    		}
    		int ans=1e9;
    		for(int i=2;i<=2*k;i++)
    		{
    			vis[i]+=vis[i-1];
    			ans=min(ans,vis[i]);
    		}
    		cout<<ans<<endl;
    	}
    }
    
  • 相关阅读:
    <!DOCTYPE html>的重要性!
    ibatis 常用标签
    string.match(RegExp) 与 RegExp.exec(string) 深入详解
    JavaScript RegExp.$1
    JavaScript RegExp.exec() 方法
    正则表达式常用符号说明
    正则表达式中/i,/g,/ig,/gi,/m的区别和含义
    JavaScript Math.floor() 方法
    JavaScript RegExp.test() 方法
    js日期格式化 扩展Date()
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12787138.html
Copyright © 2011-2022 走看看