Day -30
什么? NOIP死掉了? (话说我才知道)
后来看了一篇博文,发现好多大佬都在纪念NOIP。
说实话吧,我一点也不伤心
Day -1
早上复习内容:
(1)并查集 (2)快速幂 (3)Dijkstra+Heap
(4)SPFA+Heap (5)线性筛素数 (6)最小生成树
(7)堆 (8)快速排序 (9)字符串哈希(顺便也复习了set)
(10)单调队列 (11)滑动窗口
中午复习内容: 复习了考试规则(话说就是啥也没干)
下午复习内容:
(12)树状数组 (13)线段树
(14)逆元(扩欧&&费马&&阶乘&&线性)
(15)矩阵加速 (16)差分
话说我就不信会考提高组的芝士~~(侥幸)~~
Day 0
昨天把滑动窗口写砸了,又写了两遍
然后忍不住打了一场CF的模拟赛,接着就是休息……
哦,还拜了拜菩萨!!!
Day 0.5
早早去了考场,幸亏没有堵车。
然后趴在电脑旁边打了一遍LCA,渐渐适应了键盘。
然后开始猜题:
①水题
②需要码力的模拟或需要剪枝的搜索
③较为简单的dp或较为坑人的二分
④树/图论
话说我都猜对了(套路)。
阳光还是比较明媚的,希望能够RP++!
Day 1
T1
万万没有想到T1是这么水。
只需要读入字符串并数一数"1"的数量即可。
注意: 千万不要秀(一些人直接输出模9的值);因为,要争取的是分数,秀只会让AC变得不确定。
做题时间: 1min
T2
这题……不是很简单吗?
然后5分钟打完代码,接着开始debug……
接着可怜的我竟然发现不了问题,连C++调试器都用上了。我的目光在来回徘徊,心情从开心到恐惧到有些自闭。听着听着别人猛烈的打键盘的声音,我感觉自己就是一个SB。
#include <bits/stdc++.h>
using namespace std;
int opt,n,t[100001],p[100001],ans,top,m=1,yh[100001],sj[100001],k;
bool r[100001];
int main()
没有问题!
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>opt>>p[i]>>t[i];
if (opt==0)
{
yh[++top]=p[i];
sj[top]=t[i];
ans+=p[i];
}
这就是输出与基本操作,没有问题!
else
{
k=0;
for (int j=m;j<=top;j++)
{
if (r[j]) continue;
if (t[i]-sj[j]>45) m=j;
else if(yh[j]>=p[i])
{
k=j;
r[k]=false;
break;
}
}
if (!k) ans+=p[i];
}
貌似没有问题……
我的目光久久地停留在那个r[k]=false上,猛然发现了错误! 这里表示该地铁卡已经用过了,应该是r[k]=true啊!
于是改掉之后,样例1与样例2就轻松过去了。
抑制住疯掉的心情(话说才做两题就这么开心? 省一都没),开始看第三题。咕咕咕~
做题时间: 53min
T3
根据上文的猜测,我知道本题要么是dp要么是二分;但是很明显不是二分,那么就是dp啦!
动规题都有一种通用做法,即从一维开始加维,如果状态转移方程推出来了就停止加维。由于本题与一个二维矩阵有关,所以状态设计至少为2维。然后开始推!
①二维: dp[i][j]表示到看到第i天的第j个物品时的钱。
但是,很明显不存在状态转移,因为缺少很多信息(买多少?什么时候卖?)。
②三维: 设计不出来……
因为本题是有好多种数种情况的,即需要思考该纪念品什么时候卖。如果是第二天卖就好了……
但是能不能强制第二天卖掉呢?
所以……哦哦啊啊哦哦啊!
若将一个纪念品在i天买入,第j天卖出,就相当于在第i天买入,第i+1天卖出,第i+1天买入,第i+2天卖出……第j-1天买入,第j天卖出。
也就相当于,每看到一个物品都可以思考将它第二天卖掉。每个物品都有一个重量与价值——即其该天的钱数与第二天的钱数减去它的钱数。
就是这么简单。那么状态设计就出来了:
dp[i]: 看到第i天
dp[j][k]: 看到该天前j种物品,总重量为j时的最大价值和。
但是明显会MLE,即需要开到dp[105][105][10005]。接着猛然想到,这种无限背包可以压缩到一维的! 所以二维就可以啦。
开始打代码。代码十分简易,没有debug就直接过了样例1与样例2。
300分到手,就没必要紧张啦,咕咕咕~
T4
递归一波(40分),写在Subtask1中。无奈复杂度上天。
接着,我开始想正解。
于是开始思考是否与图论中的一些东西有关:
①最小生成树: 明显不是
②并查集: 貌似有些像啊。但是这样找祖先会复杂度上天!
③最短路: 貌似有些像啊,试一试!
最短路的做法不能再显然了。如果要判断i号工人做第j阶段的零件是否需要1号工人给源材料,要看他是否与1号有长度为j的路径。
发现,如果u与v之间存在长度为x的路径,当且仅当u与v之间的最短路径与x同奇同偶。
那么,我们就跑两遍Dijjkstra,分别看第i号工人与第1号工人的最短路径能否为奇数与能否为偶数。接着,如果x为奇且存在奇数路径就OK,如果x为偶且存在偶数路径也OK。
但是,接着发现,如果x大于j,那么这项工程就与1号工人无关,就当然不会轮到他来做原材料;这种情况要特别判断。
然后开始打细节多且坑人的代码。经过了长时间的调试后做出来了,长度162行(如果递归不超时就用递归)。
做题时间: 48min(调试的时间没有编码的时间长)
那么我D1……哦不,整场比赛就AK了?
把四题都对拍了一波,没有问题!
哈哈哈啊哈哈
Day 1.5
与几位大佬谈论了一波正解,发现:
①第一题一些人真的秀了一波;
②第二题他们都秒掉,我真的太弱了;
③第三题他们好多都没想出来,都夸我大佬;
④第四题他们做的比我快一些,我真是小蒟蒻。
但是,正解都差不多,唯一希望最后一题的Dijkstra+Heap不要写砸了。
回家Happy一波走起。
2019.11.16
上洛谷测试(话术我还是格外紧张的),前三题全部AC。
然后进入第四题准备提交,结果给弄WA了!!!
???
40分……就我递归写对了,Dijkstra真TM写砸了。
心态差点崩溃。但是已经考完了,我TM还能怎么样呢?
好吧,340分,应该就是了……
公布分数
预计分数: 100+100+100+100=400
实际分数: 100+100+100+40=340(我太难了)
奖项: 安慰自己的吧
2020.4.12
今天突然想起来写这次游记,主要是想回顾一下自己的历史
希望今年,NOIP重生的一年,愿我能够凯旋而归!
AC大声吼,WA已送走;
爆0不可能,AK请跳舞!
彩蛋:事实上本蒟蒻初赛没有过o(╥﹏╥)o qwq,是在洛谷上打的模拟赛然后340分;这是洛谷模拟赛的游记,并非官方比赛的游记。
以上情节纯属虚构,若有雷同纯属巧合……