【CodeForces訓練記錄】Educational Codeforces Round 171 (Rated for Div. 2)

MNNUACM_2024ZY發表於2024-10-29

訓練情況

賽後反思

B題二分沒有考慮到細節情況

A題

我們構造垂直並且要最長,我們只需要取長寬的較小值,然後一個正方形,左上到右下,左下到右上即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int x,y,k; cin>>x>>y>>k;
	cout<<0<<" "<<min(x,y)<<" "<<min(x,y)<<" "<<0<<endl;
	cout<<0<<" "<<0<<" "<<min(x,y)<<" "<<min(x,y)<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

B題

我們觀察到二分單調性,考慮進行二分答案,我們相鄰的進行配對,比如 \(i=1,2\)\(i=3,4\) 這樣,不合法的情況為兩兩相減的值 \(> k\),但是這僅限於偶數情況,要是奇數情況會多出來一個,此時就需要分奇偶考慮,對於奇數情況需要刪掉一個點再兩兩相減,列舉去掉的那個點即可,偶數直接兩兩相減即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e3 + 3;

int n;
int a[N];

bool pd(int x){
	if(n&1){
		int ans = 0;
		for(int i = 1;i<=n;i++){
			vector<int> b(N+1);
			for(int j = 1;j<=n;j++) b[j] = a[j];
			b.erase(b.begin() + i);
			for(int j = 2;j<=b.size();j+=2){
				if(b[j] - b[j-1] > x){
					ans++;
					break;
				}
			}
		}
		if(ans == n) return false;
		else return true;
	} else {
		for(int i = 2;i<=n;i+=2){
			if(a[i] - a[i-1] > x) return false;
		}
		return true;
	}
}

void solve(){
	cin>>n;
	for(int i = 1;i<=n;i++) cin>>a[i];
	int l = 1,r = 1E18,m;
	while(l<r){
		m = l + r >> 1;
		if(pd(m)) r=m;
		else l=m+1;
	}	
	cout<<l<<endl;
}

signed main(){
	int T; cin>>T; while(T--)
	solve();
	return 0;
}

相關文章