训练情况
赛后反思
B题二分没有考虑到细节情况
A题
我们构造垂直并且要最长,我们只需要取长宽的较小值,然后一个正方形,左上到右下,左下到右上即可。
#include <bits/stdc++.h>
#define int long longusing 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 longusing 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;
}