CSP 2019游记&&题解

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分;这是洛谷模拟赛的游记,并非官方比赛的游记。
以上情节纯属虚构,若有雷同纯属巧合……

原创文章 19 获赞 27 访问量 1950

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/105464536
今日推荐