牛客IOI周赛19-普及组 B-小y的序列

小y的序列

https://ac.nowcoder.com/acm/contest/7780/B

小y的序列

  • 分析

    我这个不是正解。根据题目中的定义,我们很容易想到O(n^2)循环,即以每个a[i]为标准,求出要修改多少个。进而,

    我们可以先预处理出对于一个位置 i ,可以扩展的合法区间,然后在这些区间之间循环,减小时间复杂度。最重要的

    一步便是怀揣梦想(看代码就知道了)

  • 代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;

int n,ans=1e9;
int tu=0;
ll a[N],to[N],l[N];

int main()
{
    scanf("%d",&n);
    for (ll i=1;i<=n;i++) scanf("%lld",&a[i]);
    int now=2,las=1;
    while(now<=n)
    {
        if(a[now]-a[now-1]!=(now-1))
        {
            to[las]=now-1;
            las=now;
        }
        now++;
    }to[las]=n;

    for (int i=1;i<=n;i=to[i]+1)
    {
        int num=l[i];ll ok=to[i]-i+1;

        for (ll j=i+1;j<=n;j=to[j]+1)
            if(a[j]-a[i]!=((j-i)*(i+j-1)/2))
            {
                tu++;
                num+=(to[j]-j+1);
                l[j]+=ok;
            }

        ans=min(ans,num);

        if(tu>=20000000) break;//人没点梦想还怎么活下去?
    }

    printf("%d\n",ans);

    return 0;
}
比赛题解 文章被收录于专栏

牛客IOI周赛,团队赛,练习赛,挑战赛,各种模拟赛的部分题解

全部评论

相关推荐

双尔:你就写拥有ai开发经历,熟练运用提示词,优化ai,提高ai回答质量
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务