首页 > 其他分享 >NOIP 历年真题 贪心

NOIP 历年真题 贪心

时间:2023-11-26 16:00:26浏览次数:40  
标签:pre NOIP 真题 res LL 贪心 末尾 define

数据范围较小时,可以考虑 dp。设 \(f(i,j)\) 表示当前段末尾为 \(i\),上一段末尾为 \(j\) 的最小代价。转移为:

\[f(i,j)= \min _{s_i-s_j \ge s_j-s_k}f(j,k)+(s_i-s_j)^2 \]

时间复杂度 \(O(n^3)\)。

不难想到一个性质:要使得 \(f(i,j)\) 最小,上一段末尾 \(j\) 要尽可能靠后。这样就能保证 \((s_i-s_j)^2\) 每次都比较小。

有了这个贪心结论,重新定义 dp 状态,省去第二维。假如现在有决策点 \(j\),要求划分合法,则需要 \(s_i-s_j\ge pre(j)\),\(pre(j)\) 表示上一段末尾为 \(j\) 的总和。移项,\(s_j+pre(j) \le s_i\)。

不难发现,\(s_j+pre(j)\) 满足单调性,因此可以二分 \(j\),或者直接使用单调队列。

注意:本题内存紧张,需要尽可能地省去无用的数组,比如说,\(f(n)\) 其实可以倒推得到。同时注意 __int128

// Title:  划分
// Source: CSP-S2019
// Author: Jerrywang
#include <bits/stdc++.h>
#define rep(i, s, t) for(int i=s; i<=t; ++i)
#define F first
#define S second
#define pii pair<int, int>
#define ll long long
#define LL __int128
#define debug(x) cout<<#x<<":"<<x<<endl;
const int N=40000001;
using namespace std;

inline void write(LL x)
{
    if(x<10)
    {
        putchar(x+48); return;
    }
    write(x/10), putchar(x%10+48);
}

int n, type, b[N], q[N], pre[N], hh, tt;
ll a[N];
inline ll d(int i) {return a[i]-a[pre[i]];}

int main()
{
    scanf("%d%d", &n, &type);
    if(type==0)
    {
        rep(i, 1, n) scanf("%lld", a+i), a[i]+=a[i-1];
    }
    else
    {
        int x, y, z, m; scanf("%d%d%d", &x, &y, &z);
        scanf("%d%d%d", b+1, b+2, &m);
        rep(i, 3, n)
            b[i]=((ll)x*b[i-1]+(ll)y*b[i-2]+z)%(1<<30);
        int p1=0;
        while(m--)
        {
            int p, l, r; scanf("%d%d%d", &p, &l, &r);
            rep(i, p1+1, p) a[i]=b[i]%(r-l+1)+l, a[i]+=a[i-1];
            p1=p;
        }
    }
    rep(i, 1, n)
    {
        int j;
        // s[i]-s[q[hh]]>=d[q[hh]]
        while(hh<=tt && a[q[hh]]+d(q[hh])<=a[i])
            j=q[hh++];
        pre[i]=j;
        while(hh<=tt && a[q[tt]]+d(q[tt])>=a[i]+d(i)) tt--;
        q[++tt]=i;
    }
    LL res=0; int i=n;
    while(i) res+=(LL)d(i)*d(i), i=pre[i];
    write(res);

    return 0;
}

标签:pre,NOIP,真题,res,LL,贪心,末尾,define
From: https://www.cnblogs.com/jerrywang2009/p/17857384.html

相关文章

  • NOIP 2023 游记
    在长郡考试,爽!开场开T1,码上去发现大样例挂了,然后发现题看错了,然后过了五十分钟才过T1大样例。开T2感觉像是建图,建了半天啥都没建出来(没观察样例的后果),此时想了半个多小时了,感觉得跑路了,打了\(40\)跑路。(\(60\)分不知道为啥挂了)开T3感觉暴力都不会,自闭了,然后开T4,然后......
  • 86th 2023/11/18 NOIP Day1
    已经过去了,总结得写赛前没什么,直接入题T1一眼了,T2看了看,手模了一下,觉得非常麻烦,难以处理T3看一眼认为不太能做,后来还剩0.5h时开了它,发现可以拿分T4看出了暴力,发现有一当应该是DP的部分分然后去推T2,然后很自信地认为,按它特殊数据给的数量,可以拿80分然后20min切了T1后,开始码T2......
  • 85th 2023/11/17 NOIP Day0
    明天就要在楼下的考场打了老师今天给了一整天的自主做题时间,初中生是做题,而高中就是复习了话不多说直接来到今天的归纳:斜率优化,要敢于把i,j移动至转移方程的左右,最后归纳为一次函数的形式,并观察需要去最值的东西,凸包似乎挺好维护关于区间:包含,相交,不相交,三种要考虑全,如:[P5464......
  • 84th 2023/11/16 NOIP Day-1
    一场模拟赛,下去试机了T1有正解思路,但思路混乱打不出来,主要是最后输出不是很懂如何处理T3没能完全想出正解,这个去重的思路挺有意思的主要是通过排序,预处理找到下一个重复位置,然后区间赋值来处理在一个位置即将重复时删除上一个即可T2T4待补......
  • 83rd 2023/11/15 NOIP Day-2
    早上回学校参加国标了,晚上继续停课训练思考了今天上午其他学校人打的模拟赛,T3是很有意思的网络流建图T1是一道贪心策略题,思路认真推之下应该能够想出老师讲了面对比赛应有的态度,是的,应该全力以赴面对这场难得的机会再补一下短板吧,DP、贪心和网络流建图(虽说不一定用得上),但万无......
  • NOIP 2023比赛报告
    第一题比赛情况$100$分,耗时$1$小时。题解对于$1\lei\len$,比较$w_i$字典序最小的字符$a_i$与每个$w_j(i\nej)$字典序最大的字符$b_j$。如果有$b_j\lea_i$,则$w_i$不能成为字典序最小的单词,反之可以。代码第二题比赛情况$100$分,耗时$2$小时。题解......
  • NOIP2023游记
    Day-INF在考前几天补了往年NOIP的题,信心++。下午到了开发区,由于雪太大,晚上就没去酒店找其他队友,摆了一会然后稍微看了一眼题就睡了。Day1进入考场。听CCF的广播说禁止在考前写代码,啊?开始后经典的只有压缩包密码没有PDF密码,mnt+=2。看了一眼四道题,T1感觉桶排就能过,T......
  • NOIP2023游记
    之前忘写了现在忘了(雾)Day0在七高考。欣赏了一会走廊边上的展示柜。进考场。印象里是圆桌,结果还是常规的几排。(好像各个考场不一样……?)开考之后因为键盘的奇怪手感而奇怪了很久。一行头文件打了半天,,。P.S.之前同学说过七高键盘难用,然而没当回事TAT。T1有点水……但是还是......
  • NOIP2023 退役记
    省流:爆单了。\(\rmDay\0\)中午感觉身体发冷,有一种不详的预感。下午润去看病,好像寄了。做了甲流的检测,不过好像要考\(\rmNOIP\)时才能出结果。吃了退烧药,但还是\(\rm38\)度多。没有胃口吃晚饭。晚上到了杭州稍微好了一点,喝了一点粥。\(\rmDay\1\)早上一测温度还......
  • CSP2023+NOIP2023邮寄
    本文同时发表在个人洛谷博客。CSPDay-1上午打德文布置的毒瘤信心赛,据说请了一个D类金验题,没有成功ak。打完没信心了。下午去下沙。有点像小县城。晚饭在下沙天街,好评。颓废。Day0上午打J。开场3分钟没过T1,然后发现次数是\(\log\)级别的,无脑暴力。菜死了。菜死了。菜......