[考試反思]1009csp-s模擬測試66:依舊


依舊是好一場爛一場。

依舊是那么菜。

依舊是難止頹廢。

依舊是在此方仰望,幻想?

 

上面這段中二的東西是為了防止Parisb說我的標題與內容無關而diss我莫名其妙115的語文。

 

但是菜是的確是菜。。。

這次沒改題就來寫博是因為考場心態稍炸,想稍微寫一下。

考前日常毒奶:

我看了下總刷題排行榜,Dybala699,Mr_zkt598。

我想讓他們湊個整,我就說zkt要A2個,Dybala要A1個。

然后兩個都說中了。。。我並不知道這次T2可以那樣AC。

然后我就被Dybala良心譴責了(他T2小問題打飛了本來能AC的)啊啊啊我沒臉我錯了

然而反正我自己也就A了一個。。。

回歸正題:

上來看題,都不會。

然后T1可以打表找規律,26分鍾搞定,高精數組開的20,WA60。

然后看T2,不會,看了一個小時,不會,去廁所,聽Parisb說Dybala切題好快,心態稍炸。

突然發現自己電腦底下的有3盒空的百醇,以及一大堆零食袋子,心煩。

又怕自己被冤枉於是這次考試很短時間就去了3次廁所,每次都用演算紙包着零食的盒子怕被其他老師看見。

往廁所運了3次之后總算清干凈了,舒坦一些,然后關上櫃子,忽然又一盒空百醇掉到了我的腳上。

后來又運了一趟。。。

另外我這一個小時沒碰鼠標鍵盤,而Yu-shi在我旁邊一直碼一直碼碼了一個半小時。。。心態更崩了。

打了半個正解,TLE40。

然后這邊的人開始問T3的樣例的時,坐在角落聽不清他們在說什么,只聽到T3balabalaT3balabala

意思就是他們都進T3了,我T2動還沒動呢

心理壓力更大了。

然后又看了一個小時,想到了題解里的那個正解(不是bitset)但不會證明,把int數組寫成char數組,RE30。

其實復雜度算錯了,一看n3會死就又沒想bitset。一直在想n2

然后自己不會證也沒什么想法,進T3,樣例鍋了,發大樣例。

大樣例暴力跑不出來,小樣例暴力輸出不對。

這是考場心態。

然后T3亂打暴力就扔了,過會T1發現數組鍋了,改正。結束。

算復雜度時要考慮bitset的1/32的常數。

穩住心態!穩住心態!穩住心態!盡量不要受周圍人的干擾。

按照自己的步調來,不管什么分數都是自己考的,沒有人為你負責。

抗干擾能力還是要練,至少現在不會被LNC***鍵盤而干擾過甚。(雖然能聽出來他要AK了)

但是問題還是很多。環境的改變不是理由因為你的確不能改變csp的考場。。。

啊。。。收到一個信息奧賽三調進步獎,真是諷刺。

從好變菜再變得稍微不那么菜就能拿進步獎。。。

算了吧。

穩住心態。

加油吧。。。

 

T1:棋盤

打表找到的式子,還不會證:

f[i]=f[i-1]*i+(-1)i

轉自skyh。我菜雞就不寫了。

 1 #include<cstdio>
 2 struct bigint{
 3     int ws,a[10000];
 4     void operator++(){
 5         a[1]++;
 6         for(int i=1;a[i]>=10000;++i)a[i]-=10000,a[i+1]++;
 7         if(a[ws+1])ws++;
 8     }
 9     void operator--(){
10         a[1]--;
11         for(int i=1;a[i]<0;++i)a[i]+=10000,a[i+1]--;
12         if(!a[ws])ws--;
13     }
14     void operator*=(int k){
15         for(int i=1;i<=ws;++i)a[i]*=k;
16         for(int i=1;i<=ws;++i)a[i+1]+=a[i]/10000,a[i]%=10000;
17         if(a[ws+1])ws++;
18     }
19     void print(){
20         printf("%d",a[ws]);
21         for(int i=ws-1;i;--i)printf("%04d",a[i]);
22         puts("");
23     }
24 }ans;
25 int main(){
26     int n;scanf("%d",&n);
27     if(n==1){puts("0");return 0;}
28     for(int i=2;i<=n;++i){
29         ans*=i;
30         if(i&1)--ans;
31         else ++ans;
32     }
33     ans.print();
34 }
View Code

 

T2:傳遞

用bitset的做法我就不說了。雖然我考場上沒想到。

題解的結論僅在競賽圖下成立:

考慮兩個點u,v。

如果P中存在路徑由u到v,那么就必須有一條P邊由u到v

1)如果同時Q中存在路徑由v到u,那么就必須有一條Q邊由v到u,與上面矛盾。

此時PQ的邊都建出來的話會形成經過uv的環。

2)如果同時Q中存在路徑由u到v,那么就必須有一條Q便又u到v,與上面矛盾

此時P與Q的反邊都建出來的話也會形成經過uv的環。

所以只要把P所有邊建出來,Q邊正着建后判個環,Q邊反着建后再判個環,就好了。

拓撲。數組不要開成char。

因為是競賽圖,所以每兩個點之間都有一條單向邊,所以上述判斷條件就是充分必要條件了。

 1 #include<cstdio>
 2 int n,deg[2019],q[2019];char m[2019][2019];
 3 int main(){
 4     int t;scanf("%d",&t);
 5     while(t--){
 6         scanf("%d",&n);char T=1;
 7         for(int i=1;i<=n;++i)scanf("%s",m[i]+1);
 8         for(int i=1;i<=n;++i)deg[i]=0;
 9         for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(m[i][j]!='-')deg[i]++;
10         int t=0;
11         for(int i=1;i<=n;++i)if(!deg[i])q[++t]=i;
12         for(int h=1;h<=t;++h)for(int i=1;i<=n;++i)if(m[i][q[h]]!='-'){
13             deg[i]--;
14             if(!deg[i])q[++t]=i;
15         }
16         if(t!=n){T=0;goto output;}
17         for(int i=1;i<=n;++i)deg[i]=0;t=0;
18         for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
19             if(m[i][j]=='P')deg[i]++;
20             else if(m[i][j]=='Q')deg[j]++;
21         //for(int i=1;i<=n;++i)printf("%d ",deg[i]);
22         for(int i=1;i<=n;++i)if(!deg[i])q[++t]=i;
23         for(int h=1;h<=t;++h)for(int i=1;i<=n;++i)if(m[i][q[h]]=='P'||m[q[h]][i]=='Q'){
24             deg[i]--;//printf("%d->%d\n",q[h],i);
25             if(!deg[i])q[++t]=i;
26         }
27         if(t!=n)T=0;
28         output:puts(T?"T":"N");
29     }
30 }
View Code

 

T3:異或

不會。注意d要小於min(ai)而不是小於等於。

 


免責聲明!

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



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