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都可以,於是便開始考慮時空復雜度,把每個格雷碼都寫出來是不可能的,2 64個格林碼CCF的老爺機絕對經受不起,便開始考慮遞歸,大致思路是這樣的:直接求出k,不求任何無關緊要的東西,時空復雜度就都能降下來,估計是O(klogn) (k為玄學常數)。如果k>2 n-1那么n位格雷碼的第k個就是1加上n-1位格雷碼的第2 n-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總共預計得分0~40分(但我感覺很可能是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,會回來的!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM