鏈接:題目
賽後總結
Codeforces Round #652 (Div. 2)
A.FashionabLee
題意:能不能構造多邊形和x軸,y軸同時平行
思路:邊數得是偶數的同時,同時滿足(n-2)/2爲奇數
int main(){
int _;
for(scanf("%d" , &_); _ ; _ --){
int n ;
scanf("%d" , &n);
if(n % 2)no;
else {
if(((n - 2) / 2) % 2 == 1 )yes;
else no;
}
}
return 0;
}
B.AccurateLee
題意:對於每一個1,0都可以任意刪除一個
思路:第一個1後面的所有0都可以刪掉,但是最後一個0刪掉就不行了,然後從後往前第一個0前面的1都可以刪掉
int a[N];
int vis[N];
int main(){
int _;
for(scanf("%d" , &_); _ ; _ --){
int n ;
scanf("%d" , &n);
int num[2] = {0 , 0};
for(int i = 1;i <= n ; i ++){
scanf("%1d" , &a[i]);
vis[i] = 0;
}
int flag = 1;
for(int i = n ; i >= 1;i --){
if(a[i] == 1){
if(flag)continue;
else vis[i] = 1;
}
else flag = 0;
}
flag = 0;
for(int i = 1;i <= n ;i ++){
if(a[i] == 0){
if(flag) vis[i] = 1;
else continue;
}
else flag = 1;
}
for(int i = n ; i >= 1;i --){
if(a[i] == 0){vis[i] = 0;break;}
}
for(int i = 1;i <= n ; i++){
if(vis[i])continue;
printf("%d",a[i]);
}
puts("");
}
return 0;
}
C. RationalLee
題意:每一個朋友要wi個快樂值,其中只有最大最小值有貢獻,讓你最大化這個貢獻
思路:對於只要求一個快樂值得,肯定給他最大的快樂值,其他兩個以上得要求都是等價的,但是要求把每個最大快樂值都取到,剩下的所有快樂值都依次取最小,很簡單的貪心。
LL a[N] , b[N];
int vis[N];
int main(){
int _;
for(scanf("%d" , &_); _ ; _ --){
int n ,k ;
scanf("%d %d" , &n , &k);
for(int i = 1;i <= n ; i ++){
scanf("%lld" ,&a[i]);
}
for(int i = 1; i <= k ; i ++){
scanf("%lld",&b[i]);
}
sort(b + 1, b + k + 1);
sort(a + 1, a + n + 1);
int l = 1, r = n ;
LL ans = 0 ;
for(int i = 1;i <= k ; i ++){
if(b[i] == 1){
ans += 2*a[r];
r --;
}
}
for(int i = k ;i >= 1; i --){
if(b[i] > 1){
ans += a[r];
ans += a[l];
l += b[i] - 1;
r --;
}
}
printf("%lld\n",ans);
}
return 0;
}
D. TediousLee
題意:對於一棵構造樹
找到爪子形的樣式就算一次貢獻,問你x層的最大貢獻是多少?
思路:這題算是比較優秀的題吧,我當時思考的過程我覺得對自己還是挺有參考價值的。因爲對於一個獨立節點每一次形成爪子都需要經歷兩步,也就是說兩步以後每一個獨立節點一定會形成一個爪子,於是我們可以先維護出每一層新生成的獨立節點,這個還是很好求的:
a[i] = (a[i-2] * 2 % mod + a[i-1] % mod) % mod
接下來每一層的爪子就是上兩層的獨立節點:
b[i] = a[i-2]
然後就是貪心隔兩層的前綴和
f[i] = (f[i-3]%mod + b[i]%mod)%mod;
於是整體就可以維護出來了,當然題解上說的那個1e18,用的那個公式我還不太會。暫時先這樣。
LL f[N];
LL a[N];
LL b[N];
int main(){
int _;
a[1] = 1;
a[2] = 1;
for(int i = 3; i <= M ;i ++){
a[i] = (a[i-2] * 2 % mod + a[i-1] % mod) % mod ;
}
/**
b[3] = 1;
b[4] = 1;
b[5] = 3;
b[6] = 5;
**/
b[1] = 0;
b[2] = 0;
for(int i = 3 ; i <= M; i ++){
b[i] = a[i-2];
}
f[1] = 0;
f[2] = 0;
f[3] = 1;
f[4] = 1;
f[5] = 3;
for(int i = 5;i <= M; i ++){
f[i] = (f[i-3]%mod + b[i]%mod)%mod;
}
for(scanf("%d" , &_); _ ; _ --){
int n;
scanf("%d",&n);
printf("%lld\n",(f[n]*4)%mod);
}
return 0;
}
E. DeadLee
題意:每人都會喫一盤最喜歡的食物,問你最後他能喫完生成的序列。
思路:類拓撲排序,反相思維
int a[N], vis[N],in[N] , n ,m;
vector<PII> G[N];
int main(){
while(~scanf("%d %d", &n ,&m)){
for(int i = 1;i <= n ; i ++){
scanf("%d" ,&a[i]);
in[i] = 0,vis[i] = 0;
G[i].clear();
}
for(int i = 1;i <= m ; i ++){
int x,y;
scanf("%d %d" ,&x,&y );
G[x].pb({y,i});
G[y].pb({x,i});
a[x] --; a[y] --;
}
queue<int> q;
for(int i = 1;i <= n ;i ++){
if(a[i] >= 0) q.push(i),in[i]=1;
}
VI ans;
while(q.size()){
int x = q.front();
q.pop();
for(auto y:G[x]){
if(!vis[y.se])vis[y.se] = 1, ans.pb(y.se);
if(!in[y.fi]){
a[y.fi] ++;
if(a[y.fi] >= 0){
in[y.fi] = 1;
q.push(y.fi);
}
}
}
}
reverse(ans.begin(),ans.end());
if(SZ(ans) == m){
puts("ALIVE");
for(auto x:ans)cout << x <<" ";
puts("");
}
else puts("DEAD");
}
}
小總結
這一次整體做的十分流暢,可能是才睡了一覺的緣故 ,重要的還是這一場帶來的經驗,冷靜思考,沉着應對吧,這一次的E題大約是有點小自滿,剛開始覺得是一個2-SAT或者二分圖,(當然這是我接下來打算跟進的知識點)我覺得自己不太會這類型的題,後來賽後發現竟然是個拓撲排序,難度簡直就是while(1) s–;這說實話同樣提醒着我,在icpc區域賽中其實經常也會出現這樣的情況,就是這一道題其實你能做,但是你不去開。當然現在還是得好好補習自己關於區域賽類型的題,不然到時候只有被虐和拖隊友後腿的情況了。題解還是要堅持寫的。題還是要快快補的。