1 条题解
-
1
其实可以不转45度直接设一次方程解
这里有 sub2 sub3 sub4的全部做法。
#include<bits/stdc++.h> using namespace std; #define int long long int aBs(int x){ if (x<0) return -x; return x; } int n,m; struct node{ int x,y; }a[1000006]; void main_solve1(){ //sub2 int anss=m+1; for (int s=1;s<=m;s++){ int l=1,r=m,ans=m+1; while (l<=r){ int mid=(l+r)>>1; int L=1,R=m; for (int i=1;i<=n;i++){ if (aBs(a[i].x-a[i].y)<=mid) continue; int diss=mid-aBs(s-a[i].x); L=max(L,a[i].y-diss); R=min(R,a[i].y+diss); } if (L<=R) r=mid-1,ans=mid; else l=mid+1; } anss=min(anss,ans); } printf("%d\n",anss); return; } void main_solve2(){ //sub3 int ans=(aBs(a[1].x-a[2].x)+aBs(a[1].y-a[2].y)-1)/2 +1; ans=min(ans, aBs(a[1].x-a[1].y)); ans=min(ans, aBs(a[2].x-a[2].y)); printf("%lld\n",ans); return; } void main_solve(){ //正解 int l=1,r=m,ans=m+1; while (l<=r){ int mid=(l+r)>>1; int xmin=0xc0c0c0c0c0c0c0c0,xmax=0x3f3f3f3f3f3f3f3f; int ymin=0xc0c0c0c0c0c0c0c0,ymax=0x3f3f3f3f3f3f3f3f; for (int i=1;i<=n;i++){ if (a[i].y-a[i].x<=mid) continue; ymax=min(ymax, a[i].x-a[i].y+mid); ymin=max(ymin, a[i].x-a[i].y-mid); xmax=min(xmax, a[i].x+a[i].y+mid); xmin=max(xmin, a[i].x+a[i].y-mid); } if (xmin<=xmax && ymin<=ymax){ r=mid-1; ans=mid; } else{ l=mid+1; } } printf("%lld\n",ans); return; } signed main(){ // freopen("A.in","r",stdin); scanf("%lld%lld",&n,&m); for (int i=1;i<=n;i++){ scanf("%lld%lld",&a[i].x,&a[i].y); if (a[i].x>a[i].y) swap(a[i].x,a[i].y); } if (n==2){ main_solve2(); return 0; } if (n<=1000 && m<=1000){ main_solve1(); return 0; } main_solve(); return 0; }
信息
- ID
- 807
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 42
- 已通过
- 3
- 上传者