NOIP2025游记

该如何开头。

12/5

现在是每天作业写到11点的文化课生了。头昏昏沉沉,不想干别的了。这就是初三生活么。空虚 ━┳━ ━┳━empty~

这一个赛季结束了,以一种出乎意料的结果结束了。

我好累啊。

12/6

把T2改完了。

考场上我是拼尽全力去想T2的m=2那个点的,但是因为自己还是不擅长做这种题然后导致统计答案多算了一些。首先是正难则反,考虑不合法情况。根据样例能发现,当最大值为maxx时,如果直接给他定价1元,那么剩下的咋填都是合法的。而给它定为2元时,就会出现一种情况:一个数x,满足1/2*maxx<x<maxx(即会先选x),那如果后面还存在一个定价为1的数,且这个数和x的原价之和比maxx小,它就是不合法的。

uqd on:12/10

然后对于每一个>1/2*maxx的a[i]来说,比maxx-a[i]小的a[j]选1选2都可以,剩下的都必须填2。那么分别统计方案数即可。考场上我非常傻的枚举了i和j,然后再统计比j小的数的方案数。。。诶不对啊我的思路tm不是对的吗啊啊啊??

10 minutes later...

完蛋了,发现一个很严重的问题,就是考场上的我没想到排序!然后就有一种情况就是两个数相同,那么统计答案只需统计在他后面的即可,但我没有排序只比较大小所以会有重复计算的,不能保证相同的数统计和它相同的数的个数是递减的!!(你能读懂吗,不要试图理解了)反正就是因为排序这种sb问题导致我m=2挂了,我好无语啊。明明可以写出来的。然后附赠的m=2n-1和m=2n-2其实都非常好写这8分可以说是白送的。那么此题的暴力最高可获52pts。很高了呀111

好好好,我们继续看正解T^T(正解是学洛谷上的,有点改动,但尊重原作者orz)

先从大到小排个序。

首先有一个要明确的事情就是m≠2的情况其实就是m=2的扩展,m=2仅存在于其他情况最后 3个选的数 的决策,上述的maxx就是选的最小的2,i和j就是选的最小的两个1,然后有一个非常显然又重要的性质就是:

性价比高于所选性价比最低的 2 的 2 都必选,性价比高于所选性价比最低的 1 的 1 都必选。

那么它大致就是这么一个样子(记最小的2为i,倒数第二小的1为j,最小的1为k,有1/2*a[i]<a[j]<a[i]):

a: .....i...j...k
........ 2..1..1

那么i前面的无论定价时1或2都会选,i到j之间的1也都会选。贪心的选法是选1-i-1,i+1-j-1的1,j,k(可能没有),正确的选法是1-i,i+1-j-1的1。会发现如果确定下i和j了,k就是一段后缀,和m=2一样,它的方案数是\(2^{n-k+1}\)(k下标最小),那么现在的问题就是求前面的方案数了。

前面的方案数用正确的定价方案来算。具体地,设i前面为定价为2的有c个,从i-1里选c个就不用说了,然后拿m减去前i位的定价和(注意i的定价是2),那么i+1-j-1中选的1的和为m-2-(i-1+c),组合数乘起来,最后带上2的幂次,就完了。k拿指针维护一下即可。复杂度是O(Tn^2)的。


然后我T3是真改不动了,关键是它是一个dp,像我这种状态都想不出来的部分分也根本打不出来。而且又臭又长。暂时不改了吧。

T4能和蔼一点(其实也是压根儿不会改),但我会改部分分!拜谢云斗学院给我学习他人的机会!!

  • 15pts

这个其实非常好写。但我没想到的很重要的一点就是:要反向思考。就是你不要正者想每一位的合法区间的最大值是多少,而是去想每一个合法区间能给这里面的点多少贡献。枚举区间左端点i,因为题目里有个l,r,就相当于[i,i+l-1]...[i,i+r-1]这些区间是合法的。首先拿一个数组算出[i+l-1,i+r-1]这些点从i开始的前缀和,[i,i+l-2]赋为极小值。然后再从i+r-1到i倒着跑一遍,每次和它后一位取max(相当于后面的能够覆盖),此时的答案就是[i,i+l-1]...[i,i+r-1]给它贡献的最大值。每次取max即可。

然后还有一个单调队列(单调栈单调队列我一生的痛啊)做法,比较重要,而且也是此题正解的一部分。

枚举长度。用单调队列求出每个点在此长度下的最大答案。单调队列维护答案从大到小的右端点位置,然后每次取队首即可。

(写法看了dzb大佬的,请见谅ooooooooorz)(让我再一次深刻体会到单调队列的魅力了555)

点击查看代码
int head=1, tail=0, pos=len;//pos是右端点位置 
int q[maxn]={0};//q维护答案从大到小的右端点位置 
for(int i=1;i<=n;i++)
{
	if(pos<=n&&pos<=i+len-1)
	{
		while(head<=tail&&sum[q[tail]]-sum[q[tail]-len]<=sum[pos]-sum[pos-len]) tail--;
		q[++tail]=pos;
		pos++;
	}
	while(head<=tail&&q[head]<i) head++;
	ans[i]=max(ans[i], sum[q[head]]-sum[q[head]-len]);
}
  • 40pts

其实就是拼了A性质和B性质。

如果光写单调队列就有25pts。B性质提前与处理出来每个点不同长度范围的答案即可。查询O(qn)完成。

就有40pts啦。


至此我把自己范围内的分数改完啦。

如果算上能差不多自己写出来的部分分,100+52+8+40=200,是一个非常可观的分数了。(但显然我不可能考场上超常发挥)

我特么整整写了两周才改完,已经泡在文化课的苦海里奄奄一息了o(TヘTo)


下面是正片哦。

11/29

早上很早就到附中了。然后一直在车上睡觉了。后来有人在群里催了才匆匆忙忙进考场(8:05),鉴于以前考过一次,对于机房的键盘和位置也没什么可喷了。正前方就是监考老师。还有这个位置是什么意思,为什么我周围3个人全是机房的??

板子都没打就开始考试了。没有密码哈哈哈。先看T1,题面好长啊,但是手模一下就能推出一个假贪心。快速写完之后发现一堆大样例都没过。挑了一个100的再手模一下,想出一个正确的贪心。40分钟就写完了。这是我打这么多场模拟赛里切掉T1最快的一次了。信心++

T2也好难读懂啊,发现它就是一个找贪心正确解数的东西。把暴搜和m=n-1打完了。(话说我当时怎么没去想m=n-2??气)因为样例给的是m=2的,然后就发现它不合法的大概就是一个数比最大数的一半大且比最大数小的样子??然后就一直在猛推,期间尝试了很多种猜想但和正确答案仍然差得很大,觉得自己思路正确又不知道哪儿错了,急。最后到了10点理智告诉我要开始看T3T4了(其实继续干T2可能分还会更高一点)读了半小时题不知道有什么可以打出来的,真的好绝望啊。最后1h糊了两个暴力上去,完全不带脑子了。

然后最后大约还剩25分钟,填完考场信息记录表后又回去看T2,到最后5分钟不得已才放弃,当时真的想不通自己哪里错了,晕(+﹏+)~

最后又是罚坐40min,然后发现5楼其实是有厕所的只不过实在是太破了。

走之前领到一包零食好评(我的午饭啊)。

后话

考完试没吃午饭就去看电影啦。疯狂动物城2还是好看的,只不过没1那么有深度了。狐兔依然是好嗑的,只不过我当时真的很困回家倒头就睡了。第二天又开始补文化课模式。想死的心都有了。

12/13

3号出成绩了。100+28+8+5=141,超出预期了9分。虽然不是很满意但知足就好了。

13号出榜了。好消息是过了省一线,ngoi也拿到了省一。(但话说那个工大的女生怎么比我高28pts啊)这算是提前达到目标了吗?接下来该怎么办呢?(°ー°〃)

好好刷题吧。


该如何结尾。

posted @ 2025-12-14 14:38  zhouyiran2011  阅读(5)  评论(2)    收藏  举报