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行...