【CodeForces训练记录】Educational Codeforces Round 171 (Rated for Div. 2)
训练情况
赛后反思
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;
}