CSUST 08 03 組隊訓練

2021-09-25 21:06:49 字數 4231 閱讀 6656

a - zero array gym - 101853a

題意:兩個操作,第乙個操作單點更新。第二個操作是選乙個非0數,所有非0數減去這個數,問最少多少次這樣的操作可以把所有數字變成0.

思路:一開始還以為是線段樹(隊友bb待修改莫隊),因為有單點更新,有區間相減。但是仔細理解題目,會發現乙個推理的的過程 --> 不考慮0,重複的數字可以縮點,假設從小到大數字為a b c d選乙個最小的數字實行一次2操作,會得到0 b - a c - a d - a。再一次忽略0選最小的數字進行2操作會得到 0 c - b d - b 。。。也就是說沒進行一次而操作可以減少一種數字。那麼我們只要計算除0外的數字種類就可以了。map存一下

ps:維護過程還是有點小問題的,map.size()所有開闢過記憶體的下標(只要訪問過,不管有沒有賦值),而修改過程又可能造成額外的訪問,所以維護數字個數可以開乙個變數而不需要用map.size();

b - new assignment gym - 101853b

思路:網路流??不會

c - intersections gym - 101853c

題意:相同數字連線問連線多少交點

思路:考慮什麼情況會出現交點;假設第一排數字是有序的,下面兩個點下標分別為i,j.那麼出現交點的條件是i < j 且a[i] > a[j],這正好是逆序對的定義。

題意:多少個非0數字

e - maximum sum gym - 101853e

題意:乙個矩陣,每選乙個數則相鄰的數都不能選,問最大所選的數和。

思路:狀態壓縮,首先列舉出每一行的所有合法狀態,也就是沒有相鄰數字。dp[i][j]的狀態定義是第i行為j狀態時候的值。轉移方程為 dp[i][j] = max(dp[i-1][q] + val(i,j) ,dp[i][j]);

#include

#include

#include

using

namespace std;

int state[

1<<20]

,dp[20]

[1<<20]

;int val[20]

[20];

int n;

intjudge

(int x)

intjudge2

(int x,

int y)

intgetval

(int i,

int x)

}return ans;

}int

main()

}int cnt =0;

for(

int i =

0;i

<< n)

;i++)}

int ans =0;

for(

int i =

0;i < cnt;i++

)for

(int i =

2;i <= n;i++)}

ans =

max(dp[i]

[state[j]

],ans);}

}printf

("%d\n"

,ans);}

}

f - working time gym - 101853f

題意:問時間差大小。

g - hard equation gym - 101853g

題意:y^x=z(mod p) 求x,bsgs。貌似缺數學選手。。。以後再補吧

h - cube gym - 101853h i - circles gym - 101853i

水過~~

j - smallest difference gym - 101853j

題意:選出相差小於等於1的最大序列長度。

思路:注意是序列,而不是串,一上來就寫了個單調佇列,wa到懷疑人生。。

錯誤**

單調佇列

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1e4+8;

int val[maxn]

;int q_max[maxn]

,q_min[maxn]

;int

main()

q_max[

++l1]

= i;

while

(h2 < l2 && val[q_min[l2]

]> val[i]

) q_min[

++l2]

= i;

while

(val[q_max[h1 +1]

]- val[q_min[h2 +1]

]>1)

else

} ans =

max(ans,i - last);}

printf

("%d\n"

,ans);}

return0;

}//2 8 8 9 0

純暴力列舉

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1e4;

int a[maxn]

;int

main()

int x =

0,y =0;

int ans =0;

for(

int i =

1;i <= n;i++

)else

if(i >

1&& a[i -1]

- a[i]==1

)else

if(a[i]

== a[i -1]

&& i >1)

}// printf("%d %d\n",x,y);

int num_x =

0,num_y =0;

for(

int i =

1;i <= n;i++

)else

if(a[i]

== y)

if(a[i]

- y ==1)

else

if(x - a[i]==1

) ans =

max(num_x + num_y,ans);}

printf

("%d\n"

,ans);}

return0;

}

ac**

#include

#include

#include

using

namespace std;

const

int maxn =

1e4+7;

int a[maxn]

;map<

int,

int>mp;

intmain()

int ans =0;

for(

int i =

0;i < maxx;i++

)printf

("%d\n"

,ans);}

return0;

}

k - citations gym - 101853k

題意:字串處理,抽出括號裡的字元並輸出

思路:卡getline,得用fgets。而且注意publisher後面沒有逗號,而其他的行是有逗號的嗎,就是這個點卡了3h,醉了。

CSUST2019 08 05組隊訓練

a multiplication dilemma b updating the tree c shortest path d wooden fence 簽到題e stupid submissions f i m bored g minimax h beautiful substrings i sec...

04 18組隊訓練 2 ZOJ 4028 LIS

題目速遞 題意 原始陣列a,f i 定義為以a i 結尾的最長上公升子串行的長度。現a陣列遺失,已知l i a i r i 要求還原a陣列,當答案有多個時,輸出其中任意乙個即可。題解 假定下標i,j i a j 若f i 1 f j 則a i 注意 若對於j,前面存在不止乙個的下標i,使得f i 1...

0002組隊參賽規則

quote 乙個參賽隊伍不能超過三人,可以擁有乙個替補。包括替補在內任何參賽隊員必須為高中畢業五年內,才可以參賽,也就是說研究生一年級的學生還可以參加。現在的問題是給你乙個隊伍,請判斷這個隊伍是否合法。輸入資料 輸入資料報括若干組,每一組包括有若干行,第一行為乙個整數n,為這個隊伍的人數,接著有n行...