noip2017总结

来源:互联网 发布:苹果安装什么软件 编辑:程序博客网 时间:2024/05/17 09:27

游记:
周五(距noip2017还有0天):早上在家睡到10点,毕竟没怎么睡好觉,然后洗洗吃吃收拾收拾,就坐上大巴了,之前还问了数学组一道构造题,人家随便答了两句,提供了一个大致思路,然后我想一想,果然有道理。
坐在车上,教练坐在自己身边,似乎不能继续吃吃了,打开电脑复习了几场模拟赛。然后睡了一觉,到了。在合肥一中的拍照片的时候,觉得合肥一中是青色的,毕竟,附中红嘛,极为映衬。准备走的时候,朝着教学楼还摔了一跤,>.<,就当积攒rp啦,问dalao们准备敲什么板子,大家都要敲fft,于是我考虑了一下,随便打一些吧,试一下新学的linux下对拍:

while truedo./gen./test./test_bfdiff test.out test_bf.out || breakprintf "AC\n"doneprintf "WA\n"

printf后有空格,为此请dyj来帮忙看一下。试机还是很顺利的,就是没见到宋公大娟还有他,小小的遗憾。
想着明天就是双十一,晚上吃饭还被高三的一对撒了狗粮,^.^。作为一个bits选手,在房间里的时候狂背头文件和各种图论代码。晚上教练开会,虽然发生了一些不愉快的事,但教练还是叮嘱我们要稳,心态要平。是啊,我不会的大家也不会,就看能否打好暴力了。于是洗洗睡了。
周六(11.11):我的位子左边是没有人的,这让我非常自然。去考场的时候,坚决不带吃的,就怕分心。算了,直接写拿到题吧。
三道题,看得我有点心慌。
T1:两个数所不能表示的最大数。因为知道是见过的,而且觉得是O(1)的一个满足对称的式子,但是不太记得了,就有点紧张。
T2:裸地simulation,就有一种错觉,swap(T2,T1),题目是模拟循环,问循环是否合法和复杂度。发现比较难写,好的,对我来说是拿分题,一定要写对!
T3:有向图中小于等于最短路长度+k的路径条数。不太会耶,30分可做,有时间写写50分也行。
我努力告诉自己不要慌,还借去洗手间为名,溜达了一圈平复心态。先去看看T1,T2吧,T1打了个表,似乎extgcd可做?然后发现那东西用循环节证一下,出来了个式子,a*(b-1)-b,拍了几组,都是对的,吁,好在弄粗来了。
T2真是尴尬,写了半个小时,对着大样例改了一个半个小时。不得不说大样例真良心,所有情况都几乎包含了。非常有信心写对。
T3匆忙打个暴力,随手测了几组数据。毕竟不会,这样已经很好了。
考完的时候,有三个人和我对T1答案,a*b-a-b,(a-1)*(b-1)-1,(a-1)*b-a。然后发现不对,他们都觉得自己错了,^o^,太紧张了吧,分明一个式子啊。似乎dalao们沉迷于T3卡常,静静地听。
回到宾馆,整理一下,考过了数论,图论,还有dp,数据结构等吧,可是day1如此简单怕不是明天会很难?似乎没什么办法复习,再背一背代码吧。然后出去溜达一圈了,吃了顿烧烤,嘻嘻。(^__^)。晚上睡得早。
周日(noipday2):
一切的一切,毁灭只因心态。
我的左边有人!还是我认识的,因为自己的机子坏了,坐在我左边。我有点不自然了。
T1有点像计算几何,看一看不需要了,直接dfs or 并查集,选择dfs。
T2
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了n个深埋在地下的宝藏屋,也给出了这n个宝藏屋之间可供开发的m条道路和它们的长度。
小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多。
小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。
在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路 所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。
新开发一条道路的代价是:L×K
L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。
请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代 价最小,并输出这个最小值。n<=12

n<=12状压?不太会做啊,想了10分钟,知道不会。转向n<=8,8!*8*8会的,写完了之后,大样例一测,WA了,而且似乎会T,,,试了几个小的,都是对的,可是不巧,还有一个多小时(先写完T3,30分暴力),没有办法,写了一个20分的暴力,把两个合在一起。看rp拿分吧。然后想写一写T3,奈何时间不多,线段树是肯定写不完了的。还是去改T2吧。
粗来的时候,还是非常遗憾的,T2,70分,还是可以写好的,问题就在于认为T3是lzz的题,想做一做,想一想,两题交杂在一起,而且都是不怎么会的,就比较茫然,无从下手。因而打乱了阵脚。

分数:
day1:100+100+30;
day2:100+40+30;
本以为自己380,没想到居然上400了。
高三的学姐405,D2t2似乎直接做45?,,,围观dalao分数:
总分 math complexity park treasure phalanx cheese
585 100 100 100 100 85 100
570 100 100 70 100 100 100
560 100 100 70 100 90 100
省排名26,不慌不忙,虽然有遗憾,但保住了女一。欣喜有畏惧的是,安徽普及组有女生ak啦。

赛后分析:编程能力还要练,day1如果早早写完t2,t3还是可以想想满分算法。至少50分可以拿的。
遇到不会的题时,坚决不要打乱阵脚,先把自己会的确定好,迅速写完,然后再去想想别的做法。要多做些难点的,思维度高的题啦。

附题解(转自NiroBC):
day1
T1:math A*B-A-B。
T2:complexity用栈模拟,模拟时记下所有未被销毁的名字集合,以及当前层的复杂度的维数。注意细节。
我写的:

#include<bits/stdc++.h>using namespace std;struct node{    int x,p;};int t,l,w;int alp[30];char ch;stack<node> sta;int au[105];void work(int L,int W){    memset(alp,0,sizeof(alp));    while(!sta.empty())sta.pop();    int ans=0,uk=0,ann=0,A=0;    if(L%2==1){if(A==0)puts("ERR");A=1;}    for(int i=1;i<=L;i++){        ch=getchar();        if(ch=='E'){            if(sta.size()){                node sa=sta.top();                sta.pop();                alp[sa.x]--;                ann=max(ans,ann);                if(sa.p==0)uk--;                if((!uk)&&sa.p==2)ans--;            }            else {if(A==0)puts("ERR");A=1;}            scanf("\n");        }        else{            node as;            scanf(" %c ",&ch);as.x=ch-'a';            int x=0,y=0;            ch=getchar();            while(!((ch>='0'&&ch<='9')||(ch=='n')))ch=getchar();            if(ch=='n') x=101,ch=getchar();            else{while((ch>='0'&&ch<='9')){x=x*10+ch-'0';ch=getchar();}}            while(!((ch>='0'&&ch<='9')||(ch=='n')))ch=getchar();            if(ch=='n') y=101,ch=getchar();            else{while((ch>='0'&&ch<='9')){y=y*10+ch-'0';ch=getchar();}}            if(alp[as.x]==1){if(A==0)puts("ERR");A=1;}            alp[as.x]=1;            if(x>y)as.p=0,uk++;            else{                if(x==y)as.p=1;                else if(y==101)as.p=2;                else as.p=1;            }            sta.push(as);            if(!uk) if(as.p==2)ans++;        }    }    if(!sta.empty()){if(A==0)puts("ERR");A=1;}    if(A==1)return ;    if(ann==W){puts("Yes");return ;}    else {puts("No");return ;}}int main(){    freopen("complexity.in","r",stdin);    freopen("complexity.out","w",stdout);    scanf("%d\n",&t);    while(t--){        scanf("%d O(",&l);        scanf("%c",&ch);        if(ch=='1')scanf(")\n"),w=0;        else scanf("^%d)\n",&w);        work(l,w);    }    return 0;} 

T3:park用dijkstra预处理出dis(1,i), dis(i,N)。一条从u到v的长为len的有向边可能出现在答案的路径中,当且仅当dis(1,u)+len+dis(v,N)<=dis(1,N)+K。删无用,每条边都有可能出现在答案中。将每条从u到v的长为len的有向边的长度替换成len-dis(1,v)+dis(1,u)后,问题变成了:“求从1到N的,长度<=K的路径的条数。”因为把没用的边删去后,每条边都有可能出现在答案中,所以,如果此时仍然有仅由长度为0的边构成的环,答案一定是无穷大(判-1)。然后dp,dp[i][j]表示从1到j的长度为i的路径的数量。顺序:先枚举i再枚举j,i的顺序从小到大,j的顺序可以是任意一个由长度为0的边构成的DAG的拓扑序。时间复杂度O((N+M)*(K+logN))。
day2
T1:cheese 并查集or bfs
T2:O(n * 3^n):dp(i,s)表示,已经确定了所有距离根节点不超过i的边,与根距离不超过i的点的集合为s,此时所有已经确定的边的贡献和的最小值。进行转移。
T3:phalanx考虑n=1时的简化版本。一个长度为n的序列,每次选出一个人,把它删掉,它右边的人都朝左挪一格,最右边空出来的一格填上一个新的人,问每次出列的人的序号。线段树,树状数组都能做。
推广到这道题上怎么做呢?独立维护:第1行的前m-1个第2行的前m-1个…第n行的前m-1个以及,最后一列。对这n+1个子问题独立计算出答案。每行的前m-1个的子问题中,右边新补的人来自最后一列。最后一列的子问题中,下面新补的人是(x,y),是答案。

后期计划:
联赛考完,大神们就开始议论冬令营了,时间的确不多了,我还没怎么学。
考虑接下来的学习状态和方法目标:
*好好休息!!不休息精力似乎真的减退,智商也下降了。
*多写一些带log数据结构,练熟平衡树吧。
*适当的调整自己写代码习惯,不要一写,就常数巨大。
*好在有dalao支持,多和他们交流,还可以多打一打cf,提高反应力和写代码速度。
*练好英文阅读能力,学算法的时候多多留意单词,以及一些计算机专用术语。
*考虑学好解析几何,线性代数,数论,数据结构。前两个爱好,后两个薄弱。
*多练一些poj的题,既有英文,又对夏令营有帮助。

PS:分析的粗粗糙糙,却句句在理。愿乘万里风破万里浪。待得回头,不负当时韶华。