訓練情況
賽後反思
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;
}