【牛客訓練記錄】2024牛客國慶集訓派對day2

MNNUACM_2024ZY發表於2024-10-02

賽後反思

只開出來兩題,好像水平就這樣了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;
}

相關文章