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
",ans);return 0;
}
if(n==2)
{
ans=4;
for(int i=1;i<m;++i)ans=3ll*ans%MOD;
printf("%d
",ans);return 0;
}
else if(n==3)
{
ans=112;
for(int i=4;i<=m;++i)ans=3ll*ans%MOD;
printf("%d
",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
",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
",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
",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
",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
",ans);return 0;
}
return 0;
}