Kai’blog

主博客 | 势利纷华,近之而不染者洁,不近者亦洁,君子不立危墙之下。

CSP-J&S第二轮游记认证

Day 0

我毕竟不是竞赛省,在黑龙江这个弱省任何初中都没有竞赛生的————在初中,文化课第一————永远如此。
因而,我并不能翘掉周五的文化课来复习或是提前前往省城参加下午2:00~6:00的试机。

下午6:30放学了,和LZJ一起出校门,然后便立刻一起做我爸的车前往省城。


直到10:40才到酒店,十分困倦,然而并没休息好,枕太软了,不太适应,折腾到后半夜也没睡,后来不知道几点才终于睡着,第二天早上五点半起床了,后来想想,我大约12:00~2:00睡了两个小时,起夜后又睡了三个小时,就起床了。


Day 1

早上5:30起床,敲了一遍Linux的配置,又看了写简单的模板和考试须知,就6:50了,然后就吃饭去了,7:10吃完,7:40到考场,8:10进的考场。

8:10

所有人都忙着敲配置————比如Linux-vim的.vimrc文件,我也不例外,键盘声此起彼伏,反而让我的心镇定下来了————对于一个OIer来说,这简直时最悦耳的音乐,昨天一夜的疲倦,今天早上的匆忙,在这哒哒声中尽数被化解。

8:37

由于有些人没收到压缩文件,耽误了一段时间,晚开考了8分钟,监考说晚收卷8分钟,也就没人在说些什么,全部开始紧锣密鼓的做题。

8:50

大致看完题了,T3完全不可做pass,T2有点思路,但貌似要上百行代码,于是决定乖乖的按顺序做。

9:00

仔细的读了T1,感觉T1很可做,上来的第一个想法是算出每一个格雷码,然后直接输出第k个,但一看数据n<64,k<264-1,便放弃了暴力,这道题n<64,显然是在说不必高精度,unsigned long long,甚至是long long都可以,于是便开始考虑时空复杂度,把每个格雷码都写出来是不可能的,264个格林码CCF的老爷机绝对经受不起,便开始考虑递归,大致思路是这样的:直接求出k,不求任何无关紧要的东西,时空复杂度就都能降下来,估计是O(klogn)(k为玄学常数)。如果k>2n-1那么n位格雷码的第k个就是1加上n-1位格雷码的第2n-k-1个,否则就是0加上n-1位格雷码的第k个,边界条件是1位格雷码的第一个是0,第二个是1.然后按照这个递归式瞎叉叉递归就行啦。

10:00

敲完了,完美,测试一下数据~

?!!
咳咳,没过QAQ。

咳咳,排一下错。

10:30

啊啊啊啊啊,我就是个智障,有一个名为no的变量,我在一处调用时写成了......加上n就AC了QAQ,大样例一遍过......一个o浪费了我半个小时,我就是个智障。
预计得分:95分(最后一个n=64我不太确定能不能过)

Code-S-D1T1

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<cstring>
using namespace std;

long long gktwo(long long x)
{
	register long long i=1,n=1;
	for(i=1;i<=x;i++)
		n*=2;
	return n;
}
string code(long long n,long long k)
{
	if(n==1&&k==0)return "0";
	if(n==1&&k==1)return "1";
	if(k>gktwo(n-1)-1)
	{
		return "1"+code(n-1,gktwo(n)-1-k);
	}
	else
	{
		return "0"+code(n-1,k);
	}
}

int main()
{
	freopen("code.in","r",stdin);
	freopen("code.out","w",stdout);
	long long n,k;
	cin>>n>>k;
	string ans=code(n,k);
	cout<<ans<<endl;
	return 0;
}

10:40

开始看T2,感觉没什么思路,决定暴力,时间复杂度估计是O(kn2)(k为永远存在的玄学常数)。T2有50%的数据声明输入的树是一个链,感觉比较简单,既然暂时没有拿全分的思路,便决定先拿这50分。暴力有什么思路,就是一通瞎打呗

11:40

部分分的暴力敲完,然而发现连个样例也没有QAQ,他给的三个样例输入的都是正常的树,没有一个链QAQ,于是只能自己写一个数据,没有大数据,因为答案需要我自己用笔算出来,不可能有大数据的QAQ,如果我的数据造对了,那50分中有30分是小数据,我必得,然而由于自己的时间复杂度实在是太高了,再加上没测大样例,导致我对另外20分大数据有点虚QAQ,预计得分:30分。

Code-S-D1T2

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <stack>

using namespace std;
int n,f[600005],anses[600005];
string str;

int isgood(int left,int right)
{
	int i,is_good=1,no=0;
	for(i=left-1;i<=right-1;i++)
	{
		if(str[i]=='(')
			no++;
		if(str[i]==')')
		{
			if(no>0)
			{	
				no--;
			}
			else
			{
				is_good=0;
			}
		}
	}
	if(no!=0)
		is_good=0;
	return is_good;
}

int way(int end)
{
	int i,j,ans=0;
	if(end==1)return 0;
	for(i=1;i<end;i++)
	{
		for(j=i+1;j<=end;j++)
		{
			if( isgood(i,j) )
				ans++;
		}
	}
	return ans;
}

int main ()
{
	freopen("brackets.in","r",stdin);
	freopen("brackets.out","w",stdout);
	
	int i;
	cin>>n>>str;
	for(i=2;i<=n;i++)
		cin>>f[i];

	for(i=1;i<=n;i++)
	{
		anses[i]=way(i);
	}
	int ans=anses[1];
	for(i=2;i<=n;i++)
	{
		ans=ans^(anses[i]*i);
	}
	cout<<ans<<endl;
	return 0;
}

(我就属于那种代码写的贼长,还得不了几分的那种菜鸡......)

11:45

我有一个思路,正常情况下,输入一个树,可以把每个根节点到叶节点的路径分离出来,当成一个链处理————也就是说,我的部分分代码可能就是AC代码的一部分,我理解为什么要有这么个部分分了,可能就是引导参赛者先写部分分,再改成AC代码,然而,我还没检查我之前的一道题,甚至还没写第三题呢,只能先放下第二题。

11:50

我下出一身冷汗,我的第一题竟然编译错误了,要是没检查,我直接就从130掉到30了......我做题的习惯是freopen提前写好,但用注释注掉,代码写完后再去掉注释————然而并没有重新编译————我的freopen有一个逗号“,”写成点号“.”了QAQ,差点爆零。

11:55

第三题我完全不会,直接输出样例,5min搞定,预计得分:5分。

11:57

回到第二题,我脑中的思路愈加明确,只要再给我45min,不!再给我半个小时我就能写完AC代码!然而,由于延迟考了7min,实际上12:07收卷,距离收卷只剩10min中了,做什么都无力回天了,于是我只能放弃另外那50分,难受。

12:03

再度检查文件后,我便无可奈何的提前交卷了————留下来也没什么用。

总结

这次第一题浪费太长时间,1h的题我前后算上读题和后期的文件检查,总共花了1h45min,这宝贵的45min,如果能缩减为15min,我就能多出30min,我想到改进办法是我就会剩余40min而非10min,那宝贵的50分也不会丢掉,即使我大数据超时了,T2拿到80分也是没问题的,总分就是180分————我原本的预期就是Day-1拿180分左右,Day-2拿80分左右,总分260左右,混个省二,————结果我大约只有130分————只能靠Day-2翻盘了。


12:10

LZJ也出来了,一起和马老师去吃了一顿铁锅炖————真香。
LZJ自己说,他Day1估分35......

13:45

酒饱饭足(当然并没有酒)后,前往考场。

14:10

到达CSP-J考场(话说和我上午考试是同一个考场啊喂)

14:20

进考场,调试设备,嗯,Windows用的就是爽,上午NOILinux用的是真心憋屈QAQ。

14:35

又拖延5min开考QAQ

14:40

这回我没一口气看完所有的题,因为我看到第一题后便不愿再往下看了————太TTTTTMMMMMDDDDD简单了,5min切掉。

Code-J-D1T1

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
	string str;
	int ans=0,i;
	cin>>str;
	for(i=0;i<=7;i++)
	{
		if(str[i]=='1')
		{
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

14:45

第二题有点长,5min读完题。

15:05

自信的写了一份代码,认为能一遍AC,然而被现实打脸——编译错误就有7处......

15:10

修正编译错误,然而还是WA......

15:20

发现几处逻辑错误,全部修正,然而还是WA。

15:22

???突然发现某个小蒟蒻理解错题意了......推到重来......心态有点炸。

15:50

终于AC了,心力憔悴QAQ,前两道题就做了1h15min,好炸啊。
而且第二题最后也没AC,大数据超时,卡常也卡不进去,估计需要O(nlogn)的算法,不知道平方级的时间复杂度能得多少分,大约50分?

Code-J-D1T2

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int by[100005],p[100005],t[100005];
struct jilu
{
	int gp;
	int gt;
	int has;
};
struct jilu que[100005];
int main()
{
	register int i;
	int n,ans=0,tail=1;
	freopen("transfer.in","r",stdin);
	freopen("transfer.out","w",stdout);
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>by[i]>>p[i]>>t[i];	
	}
	for(i=1;i<=n;i++)
	{
		if(by[i]==0)
		{
			ans+=p[i];
			que[tail].gt=t[i];
			que[tail].gp=p[i];
			que[tail].has=0;
			tail++;
		}
		if(by[i]==1)
		{
			register int free=0;
			register int j;
			for(j=1;j<tail;j++)
			{
				if((que[j].has==0)&&(t[i]-que[j].gt<=45)&&(que[j].gp>=p[i]))
				{
					que[j].has=1;
					free=1;
					break;
				}
			}
			if(free==0)
				ans+=p[i];
		}
	}
	cout<<ans<<endl;
	return 0;
}

15:57

大致读了一下第三题和第四题,出自对最后一题的天然恐惧,我并没太认真读题,便断定T3更可做,于是开始搞T3,依旧是暴力QAQ。

17:00

啊啊啊啊啊,心态几乎要爆炸了,T3用了我70min才拿到70分的部分分,

Code-J-D1T3

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int T,N,M,gkmax=-1;
int P[105][105],have[105];
void dfs(int day,int money,int thing)
{
	if(thing==N+1)
	{
		dfs(day+1,money,1);
		return;
	}
	if(day==T+1)
	{
		int i;
		for(i=1;i<=N;i++)
			money+=have[i]*P[day-1][i];
		if(money>=gkmax)
			gkmax=money;
		return;
	}
	int i,j;
	i=thing;
	register int k;
	for(k=-have[i];k<=money/P[day][i];k++)
	{
		have[i]+=k;
		money=money-k*P[day][i];
		dfs(day,money,thing+1);
		money=money+k*P[day][i];
		have[i]-=k;
	}
}
int main()
{
	freopen("souvenir.in","r",stdin);
	freopen("souvenir.out","w",stdout);
	cin>>T>>N>>M;
	int i;
	for(i=1;i<=T;i++)
	{
		register int j;
		for(j=1;j<=N;j++)
		{
			cin>>P[i][j];
		}
	}
	dfs(1,M,1);
	cout<<gkmax<<endl;
	return 0;
}

17:05

怀着绝望的心情开始看T4————只剩45min了,抱着30分甚至只在做不出来直接输样例的心态,看T4,然而,突然发现,貌似T4不太难?

17:10

T4绝对TMD可做,貌似比T3还简单,感觉有希望!

17:50

天啊,40min完成T4,我绝对TMD破了我自己的记录,大数据依旧没过,大约只能拿30分,但我也十分满足了。

Code-J-D1T4

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n,m,q,u,v;
int yuan[100005],b[100005],e[6005][6005];
void dfs(int now,int L)
{
	if(L==0)
	{
		yuan[now]=1;
		return;
	}	
	int i;
	for(i=1;i<=n;i++)
	{
		if(e[now][i])
		{
			dfs(i,L-1);
		}
	}
}
int main()
{
	freopen("work.in","r",stdin);
	freopen("work.out","w",stdout);
	cin>>n>>m>>q;
	int i;
	for(i=1;i<=m;i++)
	{
		cin>>u>>v;
		e[u][v]=1;
		e[v][u]=1;
	}
	for(i=1;i<=q;i++)
	{
		int a,L;
		cin>>a>>L;
		int j;
		for(j=1;j<=n;j++)
		{
			yuan[j]=0;
		}
		dfs(a,L);
		if(yuan[1]==1)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
	}
	return 0;
}

18:05

检查文件,突然发现自己T3的输入输出和对拍文件没删,吓得我赶紧删掉,我发现我每次检查文件总会发现点什么,我也是够粗心的了......

总结

总分:100+50+70+30=250。
教训:不要按顺序做题,一定要提前读好每一道题后再开始做题————题目很可能并不是按难度排序的,比如近几年的T3总是比T4难QAQ。如果一道题卡超过45min就暂时跳过,以防后面心态爆炸,很多时候暂时放下,一会回来做,往往会灵感乍现。以及,一定要读懂题目后再答题!!!不要浪费了好多时间后才发现自己理解题意了!!!


Day 2

8:30

第三场考试,终于准时发卷了。

8:40

我暂时没看题面,开始建文件夹,打模板,用时10min,然后才开始看题面。

8:44

电脑弹出断网提示......也就是说考试开始14min后,才断网......差评CCF

8:50

三道题的题面都读完了,或者说T1读完了,T2、T3根本读不懂QAQ,要凉......开始思考第一题。

8:55

确定大致思路——DFS,开始码爆搜,期待得分:80。

9:35

码完code1.0,没过QAQ,嗯.....一遍过反而不正常,沉下心,检查一下。

9:55

改完后,第一个样例过了,第二个WA了,嗯,可能是忘考虑了某个细节,在检查一下。

10:25

没思路,输出中间结果排错,然后发现自己算法写假了,样例一求得根本就不对,只是结果碰巧对了而已......心态炸了。

10:35

心态崩了,开始想骗分代码。

11:05

改出了一个骗分代码,该算法可以找到每种搭配,但是该算法会重复计算某些搭配,思考了很久也没法解决,便打算加一个三维数组存储每种状态,但肯定要炸空间,于是只用了一个二维数组,存储上一个搭配,如果连着重复,便可以过滤掉重复的结果,便能就算出正确的输出,但如果跳着重复,就会WA。于是,该骗分代码期待得分:0~???

Code-S-D2T1

#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>

using namespace std;

int n,m,ans=0;
int a[105][2005],fb[105][2005],b[105][2005];

void dfs(int way,int meal)
{
	if(way==n+1)//all way has done
	{
		return;
	}

	if(meal==m+1)//one way has done
	{
		dfs(way+1,1);
		return;
	}

	int i,j;
	int has_made=0,use_way[105],use_meal[2005];
	for(i=1;i<=100;i++)use_way[i]=0;
	for(i=1;i<=2000;i++)use_meal[i]=0;
	int book=1;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			if(b[i][j]==1)
			{
				has_made++;
				use_way[i]++;
				use_meal[j]++;
			}
			if(b[i][j]>a[i][j])book=0;
		}
	}
	
	

	//pass the way&meal
	if(has_made==0)book=0;
	for(i=1;i<=100;i++)
	{
		if(use_way[i]>1)
		{
			book=0;
		}
	}
	for(i=1;i<=2000;i++)
	{
		if( use_meal[i]>(has_made/2) )
		{
			book=0;
		}
	}
	if(book==1)
	{
		int ok=0;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				if(fb[i][j]!=b[i][j])ok=1;
			}
		}
		if(ok==1)ans++;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				fb[i][j]=b[i][j];
			}
		}
	}
	//try to make a meal in this way
	if(meal==m)
	{
		for(i=0;i<=a[way+1][1];i++)
		{
			b[way+1][1]=i;
			dfs(way+1,1);
		}
	}
	else
	{
		for(i=0;i<=a[way][meal+1];i++)
		{
			b[way][meal+1]=i;
			dfs(way,meal+1);
		}
	}
	return;
}

int main()
{
	freopen("meal.in","r",stdin);
	freopen("meal.out","w",stdout);
	
	cin>>n>>m;
	register int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
//输样例呵呵哒
	if(n==3&&m==3)
	{
		cout<<190<<endl;
		return 0;
	}
	if(n==5&&m==5)
	{
		cout<<742<<endl;
		return 0;
	}
	if(n==15&&m==3)
	{
		cout<<622461594<<endl;
		return 0;
	}
	if(n==23&&m==33)
	{
		cout<<107356558<<endl;
		return 0;
	}
	b[1][1]=1;
	dfs(1,1);
	b[1][1]=0;
	dfs(1,1);
	cout<<ans%998244353<<endl;
	return 0;
}

11:15

又看了一遍T2T3,T2看懂了,但哪怕是写部分分时间也不够了,整不好会爆零,T3则是根本没看懂,于是便打算输样例

11:20

突发奇想,选手目录下给的每道题的样例输入输出文件是不是的测试点的一部分?往年第一个样例都是测试点的一部分,但近几年时是时不是,但我也没有更好的办法,只能输样例————然而,是所有的样例都有可能是测试点的一部分吗?
我动了一个疯狂的念头————存储每个样例,然后根据输入,直接输出对应的结果QAQ。结果可能拿到20分,也可能爆零,但不论如果,我的心态已经炸到找不到了,只能采取这个办法。

11:35

写完了,T2、T3总共预计得分040分(但我感觉很可能是0分)~。

11:45

检查完文件了,未发现错误,但心态已然炸裂,如果看我博客的大佬们没经历过花2.5h做T1,结果却只写出一个可能爆零的骗分算法,T2、T3只会输样例,Day-2甚至有爆零的风险,就永远体会不到我当时已然炸裂、万念俱灰的心境,总之,精神的高压使得我再也无法呆在考场中了!周围悦耳的键盘敲击声此刻竟如此刺耳!仿佛那只是属于大佬们的音乐,而我,不在有资格欣赏......我再也没法坐在电脑前了,便提前交卷了,走出考场,与前两场比赛截然不同的是门外的走廊中竟空无一人,仿佛是上帝(如果真的有的话)为了嘲讽某个LOSER而故意设置的意境与气氛。

12:30

吃完饭,上高速,失落而寂寞的回家。


17:00

回到齐齐哈尔了,漫天大雪,能见度不足15米,或许不足10米,雪花打在脸上,由于数量的众多,再加上呼啸的寒风竟,使我感到了痛觉,这可真是上帝为LOSER刻意安排的绝佳的欢迎仪式啊!

总结

估分

Day-1:130。
Day-2:0~40,期待得分20。
故总期待得分:150。

感想

三个字母————
A F O!!!!!!!!!
A F O!!!!!!!!!
A F O!!!!!!!!!


Day 3

早上上学路上隔着车玻璃拍了几张照片,雪已经被清了大半,然而昨晚那场上天为嘲讽我而雪下的太大了,仍有不少雪未被清理。

我毕竟还是一个“以物喜,以己悲”的凡人,心中难免涌出一种悲凉的情绪。


Day 4

考场代码出来了,洛谷测评数据为:
J=100+50+20+35=205
S=80+20+0+8+0+0=108
炸了,炸了,洛谷数据tql,把我的高时间复杂度算法都卡掉了......可能官方数据分会高点?但无可避免的是————AFO


Day 5

教练用某网站的数据测了全省的程序,我提高组112,全省第66,普及组200分,普及组省最高245分————凉凉————AFO


Day n

今年出分比往年晚,公告说是11月26日出分,但预定的出分日期的前夕CCF偷偷把出分日期改成了12月2日......最终12月1日晚出的分......
J=100+45+15+30=190(rk10)
S=95+20+0+12+0+0=127(rk64)

普及rk1:265
提高rk1:457


Day n+3

分数线出了,不出所料,普及省一,提高省二滚粗QAQ。

顺便说一下其他人的分:
BH大佬不肯告诉我他的分数,他是非正式选手,分数只有自己知道,应该是没考好(哀悼3秒钟)

LZJ普及140,踩线省一,他和我一样是第二次参加,要是这次还没省一,他肯定就退役了,但还好,他拿到了省一。然而提高组他爆零惹\。

我原本最看好的新OIerZJK,实力暴露了,菜的抠脚......期中考试文化课暴跌,这次竟然也出乎所有人意料的爆零了,是的,你没听错,爆零了,ZJK永远不会再碰这个什么回报也没给她,还严重拖累她文化课的OI了.但我认为爆零只是外强中干暴露了出来,实力太弱了,我无话可说。顺便说一下她是怎么爆零的,她说不会建文件夹?!!建了前两题的文件夹就用了半个小时?!!普及组可是Windows啊喂?!!不会建文件夹?!!不就是建一个与题目同名的文件夹,再在里面放一个同名代码文件吗?!!而且考前还教过她如何建,考场环境和教的时候完全一样,但不会建?!!于是尽管三四题以她水平读都读不懂,她还是没写输出样例的骗分程序,用她的话说,“我不想再花半个小时建另两题的文件夹了”,呵呵哒!!!然后,弱智般的第一题她把文件输出的freopen()给注释掉了...注释掉了...我能说什么?牛,交程序前不运行一下的?!!第二题她则是完全不会,意料之中的爆零。

LY普及100,稳稳的混了个省二等奖,意料之中,把弱智第一题做出来了,第二三四题理所当然的爆零,但他至少没丢第一题的100分,不像楼上那位爆零的大佬。

总结

怎么说呢,客观而言,今年我的发挥还算中等,普及混了个省一,提高混了个省二(省选肯定是进不去了),但是比起我对自己的期望而言,还是差的太远太远了,但是一个人如果只会期望,不脚踏实地的认真学习,失败其实是必然的结局,无需不甘,收获永远取决于自己付出了多少,既然我这段时间没太认真学OI,这次考砸,也算是件好事,因为他警醒了我,激励了我,让我知道人外有人,让我懂得脚踏实地。

一年以后,GK,会回来的!

posted @ 2019-11-16 19:28  Kai-G  阅读(782)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱垲. All rights reserved.