首页 > 其他分享 >NFLS 省选模拟 序列

NFLS 省选模拟 序列

时间:2024-02-26 21:00:52浏览次数:15  
标签:pre ch 前缀 省选 NFLS int v3 序列

题面

Link

给定一个长度为 \(n\) 的序列 \(a\),可以进行无限次下列操作:

对于 \(i\in [2,n-1]\)依次执行(而不是择一执行)

\[a[i-1]+=a[i] \\ a[i+1]+=a[i] \\ a[i]=-a[i] \]

求最小的 \(\max^n_{i=1} |a[i]|\)

思路

考虑一次操作对于序列前缀和的影响,对于 \(x,y,z\),其前缀和为 \(x,x+y,x+y+z\),一次操作后原序列变为 \(x+y,-y,z+y\),其前缀和变为 \(x+y,x,x+y+z\),相当于对于任意连续的三个元素做一次操作,等价于前两个元素前缀和互换。而我们又知道,对于一个数列,相邻元素交换,最终可以构成任何这些元素的排列。因此题目转化为:重新排列前缀和数组 \(pre\) 的 \([1,n-1]\) 区间(由上述推论可知 \(pre[n]\) 永远不会被交换),使得 \(pre\) 两两元素之差尽可能小(包括 \(pre[1]\) 与 \(0\) 之差和 \(pre[n-1]\) 与 \(pre[n]\) 之差)。

可以构造出最优排列方案:

  • 第Ⅰ段:取所有小于 \(0\) 的 \(pre[i]\),逐渐递减再递增,具体实现即为从大到小依次左边放一个右边放一个直至放完(参见注意事项)

  • 第Ⅱ段:取所有大于等于 \(0\) 小于 \(pre[n]\) 的 \(pre[i]\),直接从小到大排列

  • 第Ⅲ段:取所有剩下的大于 \(pre[n]\) 的 \(pre[i]\),逐渐递增再递减,具体实现即为从小到大依次右边放一个左边放一个直至放完

参见示意图:

具体证明:

  • 对于Ⅱ段,显然
  • 对于Ⅰ、Ⅲ段
  • 若交换对象在同一递增/递减区间,交换后打破了单调性,差值只会变高,不优
  • 若交换对象在不同单调性区间,交换后即使未打破单调性,也造成一边差值更小一边差值更大的不平衡情况,不优

注意事项

  1. 需要注意判断Ⅰ段与Ⅲ段长度的奇偶,处理落单的数

  2. 第Ⅰ段开头需要与 \(0\) 做差而结尾需要与后面大于 \(0\) 的数做差,为使答案最优,应该从大到小左边开始左右依次放,反之第Ⅲ段需要从小到大右边开始

  3. \(pre[n]\) 为负时,为了方便处理,需要将 \(pre\) 全部取反,由于答案是绝对值,因此不影响答案

代码

#include<bits/stdc++.h>
using namespace std;
template<class T>inline void rd(T &x){
    T res=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1; ch=getchar();}
    while(isdigit(ch)){res=res*10+ch-'0';ch=getchar();}
    x=res*f;
}
template<class T>inline void wt(T x){
    if(x<0){x=-x;putchar('-');}
    if(x>9) wt(x/10);
    putchar(x%10+'0');
}
const int MAXN=3e5+5;
typedef long long LL;
int n,a[MAXN];
LL pre[MAXN],ans[MAXN];
vector<LL>v1,v2,v3;
int main(){
    freopen("seq.in","r",stdin);
    freopen("seq.out","w",stdout);
    int t;
    rd(t);
    while(t--){
        pre[0]=0;ans[0]=0;
        v1.clear();v2.clear();v3.clear();
        rd(n);
        for(int i=1;i<=n;i++){
            rd(a[i]);
            pre[i]=pre[i-1]+a[i];
        }
        if(pre[n]<0){
            for(int i=1;i<=n;i++){
                pre[i]=-pre[i];
            }
        }
        for(int i=1;i<n;i++){
            if(pre[i]<0) v1.push_back(pre[i]);
            else if(pre[i]<pre[n]) v2.push_back(pre[i]);
            else v3.push_back(pre[i]);
        }
        sort(v1.begin(),v1.end(),greater<LL>());
        sort(v2.begin(),v2.end());
        sort(v3.begin(),v3.end());

        int l=1,r=v1.size();
        for(int i=0;i<v1.size() && l<r;){
            ans[r]=v1[i];r--,i++;
            ans[l]=v1[i];l++,i++;
        }
        if(l==r){//v1长度为奇数
            ans[l]=v1[v1.size()-1];
        }

        for(int i=0;i<v2.size();i++){
            ans[v1.size()+1+i]=v2[i];
        }

        l=1,r=v3.size();
        for(int i=0;i<v3.size() && l<r;){
            ans[v1.size()+v2.size()+l]=v3[i];l++,i++;
            ans[v1.size()+v2.size()+r]=v3[i];r--,i++;
        }
        if(l==r){//v3长度为奇数
            ans[v1.size()+v2.size()+l]=v3[v3.size()-1];
        }

        ans[n]=pre[n];
        LL maxx=-1e10;
        for(int i=1;i<=n;i++){
            maxx=max(maxx,abs(ans[i]-ans[i-1]));
        }
        wt(maxx);
        putchar('\n');
    }
    return 0;
}

启示

遇到对序列比较复杂、涉及多个元素的操作时,可以尝试研究操作对于序列前缀和、差分等的影响,将操作的影响简化,由此找到更优异的性质。

标签:pre,ch,前缀,省选,NFLS,int,v3,序列
From: https://www.cnblogs.com/SkyNet-PKN/p/18035150

相关文章

  • 91st 2024/2/26 省选联赛训练-1st
    迟来的新年快乐!这次的机会挺难得的,初三了,好说歹说从学校里跑出来训练了,就一定要珍惜时间进入正题今天的比赛难度高,但也没有省选那么难属于是思路比较难想那类T1题目有些疑惑,但总体表达还可,应该是太久没接触这种表达较专业的题目而一时难以适应看题需要认真且专心调代码时状......
  • AC475A 2024省选联测26 博弈
    题意两个人在一张DAG上移动棋子,每个格子的颜色为黑/白。每次操作可以移动一个格子颜色和自己相同的棋子。不能走的人输掉游戏。先手为白色,问所有放棋子的\(2^n\)种方案,先手必胜有多少。Sol不难发现,自己颜色内的棋子不会被对方偷走,也就是说,想控制所有棋子使得对方判负,......
  • 省选 数学
    直接对除法取模会出错,需要变成\(((a\modp)\times(\frac{1}{b}\modp))\modp\)的形式。性质:两个对\(p\)同余的数加减乘上同一个数后依然对\(p\)同余。矩阵乘法:\(c_{i,j}=\sum\limits_1^ka_{i,k}\timesb_{k,j}\)。单位矩阵:对角线上为\(1\)的矩阵。注意,只有\(n\time......
  • [DotnetSec]XmlSerializer 反序列化 分析
    Dotnet-XmlSerializer反序列化序列化和反序列化的演示Demo参考微软的文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.xml.serialization.xmlserializer?view=net-5.0XmlSerializer命名空间:System.Xml.Serialization程序集:System.Xml.XmlSerializer.dll演示......
  • STEP: 用于多变量时间序列预测的预训练增强时空图神经网络《Pre-training Enhanced Sp
    2023年12月27日,看一篇老师给的论文。论文:Pre-trainingEnhancedSpatial-temporalGraphNeuralNetworkforMultivariateTimeSeriesForecasting或者是:Pre-trainingEnhancedSpatial-temporalGraphNeuralNetworkforMultivariateTimeSeriesForecastingGitHub:https:......
  • 省选2024
    作为一个高二且NOIP只有300分的江苏oier,压力还是有点大的。Day-?得知noip只占30%,但是省队名额只有12个。算了一下,大概我考的和去年水平一样,应该就差不多了,其实可以对标一下ybw。虽然自己水平提高确实很多,但是还是感觉很没底。毕竟去年感觉自己打的很爆炸,结果后来发现我只......
  • 代码随想录 day60 回文子串 最长回文子序列
    回文子串dp[i][j]:[i,j]范围内为回文子串递推式分三种情况①:ij相等显然是回文②:j-i<1且s[i]==s[j]显然是回文③:j-i>1且dp[i+1][j-1]为true也就是当前两端元素相同看元素内部是否是回文如果是显然是ij范围内是回文初始化必须初始化falset......
  • powershell 获取 CPU RAM DISK 序列号
    PowerShell中获取CPU序列号可以通过WMI(WindowsManagementInstrumentation)来实现。下面是一个示例代码,演示如何在PowerShell中获取CPU序列号:powershellCopyCode#使用WMI获取CPU信息$cpu=Get-WmiObject-ClassWin32_Processor|Select-ObjectName,Processo......
  • 最长不下降子序列nlogn做法及其拓展
    最长不下降子序列nlogn做法及其扩展前言&nlogn做法LIS表示最长不下降子序列考虑设\(f_i\)表示LIS长度为i的最小值(具有单调性),对于每个新的x,二分出最大的满足\(f_i\)小于等于x的位置w,更新w+1还有一种单调栈理解法,假若已经维护了一个LIS在单调栈里,对于一个新的x,二分出最大的满足......
  • 20240223【省选】模拟
    挂30分,还有40分不好说。T2挂的10分应该是字符串常数大,以及那个求LCA珂以优化掉但我人傻没搞。T3的20分就是纯粹脑抽。以后少用stringT1结论题,想错了以为很简单,实际上也很简单,但是我菜。设\(f(x)\)为\(x\)的期望质量,打表使用大眼观察法猜不出这个性质:如果\(x\)为一些质数......