NOIP2018游记
NOIP2018游记
似乎是一些奇怪的东西
没想到我竟然更博了!虽然今天是\(11.20\)了。
emmmm,为啥是今天呢?因为咕咕F本来说昨天出成绩的,所以本来是昨天更的,然而咕咕F咕了,所以我也咕了,所以就今天更了。
然而NOIP似乎也已经过去了\(10\)天了,所以可能记忆会有些混乱了,就不要太在意了QwQ。
Day-3~Day0
\(Day-4\)考了大聚聚cx233666的题目,因为他的题目有着种种奇奇怪怪的各种各样的神仙部分,所以我就懒得说了,只在这里说一句cx233666吃枣药丸。
因为大聚聚的题目就是最后一场考试了,所以从\(Day-3\)到\(Day0\)这段时间我决定把\(NOIP\)从\(10\)年开始的题目重新做一遍,然后\(mona\)发现了就和我一起做了一遍。
然后感觉?意外的不难,似乎去年做了很久的,或者很让我崩溃的题目都很快就过了?
这样子翻过一年再看总能看出自己有很大的进步呢QwQ。
\(Day0\)下午放学之后就回家了,晚上\(11\)点就睡了,期望明天能够考一个好成绩吧QaQ。
Day1
\(7:20\)在校门口集合,我踩着时间到的,似乎我都是最后一个了。坐下来之后从包里翻出了\(ipad\),然后一群人就借过去打卡了,然后不出所料的“宜:参加NOIP”,无论怎么样,至少洛谷的迷信还是做的很好的(逃
路上跟周围的同学聊了会儿天,也就到了考场。考点永远都是理工大学,熟悉的考点,总让人回想起过去,也让我想到了去年联赛的失利,总是让我心中充斥着一种说不清道不明的小紧张。
下了车,天空中飘落着小雨,不像以往来的时候都出了太阳。考场的外面的那片空地也似乎在修理,拉上了线,总觉得,今年有些不同呢?或许是高一到高二不能再失败的心态的变化,身份的转变必定会带来心态上的转变啊。深吸了一口气,放空了自我,把杂念抛到脑后,既然来了,那就只能全力以赴了。大概到了\(8:15\)就跟着大部队走上了\(4\)楼。
不得不承认所有的这一切咕咕F还是越做越好了,今年进场还要安检?进来考场,我坐第一排?左边是过道,右边是一个一中的小哥。再仔细看了看这个机房,总觉得很熟悉呢!突然想起来省选的时候也是在这个机房颁奖,却突然发现这都是\(7\)个月前的事情了。两个监考老师也很眼熟,似乎是我省选的时候的监考老师。恩,不管啦,沉住气,把分数拿稳就好了。
诶?说好了不能动键盘呢?然而老师让我们自己检查一下电脑有没有什么问题,那就对不起啦,把\(emacs\)的配置打完,写了一份简单的模板,望着\(home\)下的\(day1\)发着呆。没多久屏幕上就公布了密码,解压完了就开始看题。
先把题目读一遍,再把暴力写了,再开正解。我在心里想着。
\(\mbox{T1?}\)你确定这玩意不是“积木大赛”那道原题?我抄我自己?不管了,先看遍题再说。
\(\mbox{T2?}\)看了一眼感觉一定是选择给定集合的子集,再稍微想想发现显然是这个样子的,数据范围这么小?那不是直接暴力跑一遍背包就做完了?
那不今天就只要想想\(T3\)怎么做了?这才过去\(5\)分钟啊。
\(\mbox{T3?}\)看一眼题目凸优化?假的!二分之后直接设\(f_i\)表示\(i\)这个点能够往上延伸的最大长度,每次贪心的匹配每个点的子树延伸上来的链,再把剩下的最长的那根接上去就好了。
行?我今天能\(AK\)?
\(T1,T2\)顺手写完了,代码都是\(15\)行以内,大样例也没问题。这才过去\(15\)分钟?逗我呢?这么简单吗?
开始码\(T3\),二分、\(dfs\)、排序、贪心。\(30min\)的时候码完了,小样例没锅,大样例....诶\(WA\)了,怎么小了啊。emmmm,程序没有问题啊。
仔细想了想,忽然发现我贪心策略假了,怎么能拿最大值去匹配较小的值啊?显然拿较小值去往大的匹配啊!排个序,把指针改成并查集,\(multiset\)太丑了,随便贪心一下,跑小样例,过了,大样例,过了。
行,那我今天不是\(AK\)了?这才\(1\)个小时啊。一定是假的,检查检查。
\(T1\)不会假装是一个原题实际上是坑你的吧,不会是一个环吧?手玩了一下环,发现小样例都是假的,那题目没看错啊,不会真的是原题吧。没错啊,恐怕真的是原题吧。。。真的。。。真的没错啊,那就是原题吧。题目应该没看错,行,来拍一下,写了一个按照最小值的分治做法,一下就拍上了。
\(T2\)做法应该是对的吧,仔细想了想似乎没有错,发现我不会写暴力,咕了,不拍了,自信点。
\(T3\)似乎也没法拍啊,写了一个求树的直径拍上了,再写了一个求最小边也拍上了。
这才\(1.5h\)啊。
行,睡觉吧。
菊开\(12:00\)就走了,然而我接着趴在桌上。
中间重复了若干遍看题——不会真的是原题吧——真的是原题啊的过程,就不写了。
考完出来似乎大家都\(AK\)了,他们跟我说\(T3\)是菊开讲过的题目?想了想似乎还真是这么一回事,反正做出来了,无所谓啦。
老邬在考完之后关切的问了一下我们怎么样,zsy说:“Day1没有AK的人都退役了”
中午大家一起吃了饭,中间看各个群里面开喷原题大赛,洛谷甚至把积木大赛那题直接加上了一个\(2018\)的\(tag\)。
下午在家里睡觉,起来之后拿着数据全身发抖的交到了洛谷上,看到了满屏的绿色就安心多了。晚上随便翻了翻博客也就睡了。希望\(Day2\)也能这么顺利吧。
Day2
比昨天早点到了车上,一路上大家似乎都有点心事,车上很安静。
中间的过程似乎也没有什么好说的了。
还是比\(30\)早了一会儿还是写配置,\(30\)就开始了。
先大概把题目看了一遍,感觉今天比昨天难多了。
先开\(T1\),首先一棵树的直接贪心就好了,肯定没错。基环树呢?手玩了一下样例,再深思熟虑了一波,觉得应该只需要选一条环边断开再跑树就行了,这样子复杂度也是\(5000\)能够跑的。写完之后看了一眼时间,已经过去\(30min\)了,还有两题!
\(T2\),看了看\(2\ 2\)的样例,感觉按照副对角线分层之后,只需要保证一个副对角线上的格子从下往上保证是一个先是一段\(1\)再全是\(0\)的序列就好了。
这样子手玩一下发现\(2\ 2\)全是没错。再手算了一下\(3\ 3\),发现算出来是\(144\)?比答案大了。卡住了,先跳。
\(T3\)看了一眼,这不是\(ddp\)吗?我曾经无数次点开\(ddp\)想学一学,\(dkw\)也问过我洛谷上有没有\(ddp\)的题目,然后洛谷上的那道模板题也是\(dkw\)上传的,然而我却并不会\(ddp\)。印象里?似乎是把转移写成矩阵,然后树链剖分之后轻链的贡献直接计算,重链从下往上因为\(dfs\)序连续,所以只需要用线段树维护就好了?似乎是这样子的,但是——我!不!会!啊!
顺手打了\(44\)分的暴力,推了推矩阵,发现我还是不会\(ddp\)。不行啊,\(zsy\)一定切了这题了,我怎么说今天也要切两题吧。于是决定弃掉这题开\(T2\)。
\(T2\)先想了想为啥我的想法跑出来比答案大了,突然发现这个东西并不具有阶段性,一旦两条没有比出大小的路径相交了,就会影响后面的所有部分。
想清楚了之后写了个爆搜,用前面的\(01\)段的想法剪枝,跑出来\(3\ 3\)果然是\(112\)。
看了看部分分,首先\(2\)的因为即使相交了也对于后面没有影响,所以只需要不断乘\(3\)就好了。
那么\(3\)呢?\(3\ 3\)是\(112\),\(3\ 4\)是\(336\),那不会也是乘三吧?爆搜跑了跑果然是这样子,于是把\(n=3\)的写完了。
那是不是只要乘三就好了啊?
跑了跑\(4\ 4\),\(4\ 5\),不是乘\(3\)?完了,今天要凉了。不行不行,深吸了一口气,抛开一些奇怪的想法,继续分析。
怎么样把\(8\ 8\)以内的写完就有很多分了,先把表打完。
一打\(4\ 6,4\ 7,4\ 8\)似乎又变成乘\(3\)了,有点意思了。
跑了跑\(5\ 5,5\ 6,5\ 7,5\ 8\),发现除了\(m=5,6\)之间不是乘三,其他的都是乘三。
诶,没问题了,那就是这样子了。
打表打了\(6\ 6,6\ 7,6\ 8\),果然除了\(m=6,7\)之间不会乘三,其他的都是乘三。
然后跑\(7\ 7\)......卡死了,前面跑\(n=6\)的时候\(m\)大,也跑得很慢,那么是不是\(n\)和\(n+1\)之间也有规律啊。
看了看,似乎都是\(n\)从\(n-1\)大概乘了一个\(8\)倍再减了一个什么数,拿计算器算了算这个差,诶?\(160,320,640...\),于是我大胆的猜了一下\(7\ 7\)的值,然而爆搜还是没有跑出来。
再看了看\(m=n,n+1\)之间虽然不是三倍,但是是三倍差了一点。
我又拿出了计算器做了个差,诶\(48,96,192......\),妙啊。
这个时候\(7\ 7\)跑了出来了,果然和我推的值是一样的。woc,那我是不是这题切了啊?打表大法好啊!
把\(T2\)写完了,赶紧看看\(T3\)的部分分,是一条链?似乎可以写,维护前缀后缀合并一下就好了。
还有高度小于\(100\),不是只修改链就好了吗?
看了一眼时间,还有\(10min\)。恩,我\(NOI\)的时候\(10min\)都能\(Rush20pts\)出来,再试一次。
然而到了下考前\(1min\)高度小于\(100\)都还没有调出来。
叹了口气,摇了摇头,今天要被吊打了。
问了问\(zsy\),他果然切了\(T3\),果然是\(ddp\),诶,要是我会\(ddp\)多好啊。然后\(Despair\)也切了\(T3\),看起来我要被吊打了。
出门之后李姐姐问我们今天写了多少,我说\(244\),\(zsy\)说\(265\),果然技不如人,只能被吊打啊。
中午还是一起吃了个饭,下午回去睡觉。
晚自习就到教室补语文课去了QwQ。
Ending
今天出结果了。看这样子\(zsy\)是\(565pts,HN-01\)了,鸡贼是\(552pts,HN-02\)了。我们学校似乎这次考得意外的好?
不管结果如何,也只能再接再厉,继续往前看了。
大家加油吧!
upd:
行吧,把我\(D2T2\)代码放这里,一些注释掉的东西就删掉了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int n,m,ans,sum;
int main()
{
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
if(n==1)
{
ans=1;
for(int i=1;i<=m;++i)ans=(ans+ans)%MOD;
printf("%d\n",ans);return 0;
}
if(n==2)
{
ans=4;
for(int i=1;i<m;++i)ans=3ll*ans%MOD;
printf("%d\n",ans);return 0;
}
else if(n==3)
{
ans=112;
for(int i=4;i<=m;++i)ans=3ll*ans%MOD;
printf("%d\n",ans);return 0;
}
else if(n==4)
{
if(m==4)ans=912;else ans=2688;
for(int i=6;i<=m;++i)ans=3ll*ans%MOD;
printf("%d\n",ans);return 0;
}
else if(n==5)
{
if(m==5)ans=7136;else ans=21312;
for(int i=7;i<=m;++i)ans=3ll*ans%MOD;
printf("%d\n",ans);return 0;
}
else if(n==6)
{
if(m==6)ans=56768;else ans=170112;
for(int i=8;i<=m;++i)ans=3ll*ans%MOD;
printf("%d\n",ans);return 0;
}
else if(n==7)
{
if(m==7)ans=453504;else ans=1360128;
for(int i=9;i<=m;++i)ans=3ll*ans%MOD;
printf("%d\n",ans);return 0;
}
else if(n==8)
{
if(m==8)ans=3626752;else ans=10879488;
for(int i=10;i<=m;++i)ans=3ll*ans%MOD;
printf("%d\n",ans);return 0;
}
return 0;
}