賽後反思
只開出來兩題,好像水平就這樣了TAT
I 題
給定一個排列,對於每項可以選擇+1或者不加,求逆序對對數最小
我們可以思考一下什麼情況下可以減少最後答案的逆序對,對於 \([4,3]\) 或者 \([2,1]\) 這種情況,將第二個元素+1才能對答案的減少做出貢獻,所以只要判斷某一位的後面是否有那一位 -1 的數即可,將其 +1 就行
對於求逆序對當然使用歸併排序 \(O(nlogn)\)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 3;
int a[N],c[N];
bool vis[N];
int ans = 0;
void msort(int l,int r){
if(l == r) return;
int m = l + r >> 1,i = l,j = m + 1,k = l;
msort(l,m); msort(m + 1,r);
while(i <= m && j <= r){
if(a[i] <= a[j]) c[k++] = a[i++];
else c[k++] = a[j++],ans+=m-i+1;
}
while(i<=m) c[k++] = a[i++];
while(j<=r) c[k++] = a[j++];
for(int i = l;i<=r;i++) a[i] = c[i];
}
void solve(){
int n; cin>>n;
for(int i = 1;i<=n;i++){
cin>>a[i];
if(vis[a[i] + 1]) a[i]++;
vis[a[i]] = 1;
}
msort(1,n);
cout<<ans<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
F 題
正如題目所述,這真tm是詐騙題,每次我們都可以選擇刪一條邊,或者刪一個聯通塊,我們可以發現(很難發現)一個有趣的點就是,每次刪除操作,兩種操作均會使 \(n+m\) 的奇偶性發生改變,刪一條邊,邊數 \(-1\),刪一個大小為 \(i\) 的聯通塊,點數減 \(i\),邊數減 \(i-1\),所以我們直接對 \(n+m\) 的奇偶性進行判斷即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n,m; cin>>n>>m;
if((n+m)&1) cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}