1 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define int long long struct point{ int x,y; bool operator < (const point &p)const{ return y<p.y; } }; vector<point>p1,p2,p3; multiset<int>s1,s2; bool check1(int mid){ multiset<int>s=s1; for(point &t:p1){ int a=(t.y-mid)/t.x; auto k=s.upper_bound(a); if(k==s.begin())return 0; k--; s.erase(k); } return 1; } bool check2(int mid){ multiset<int>s=s2; for(point &t:p2){ int a=(t.y-mid)/t.x; auto k=s.lower_bound(a); if(k==s.end())return 0; s.erase(k); } return 1; } void clear(){ p1.clear(),p2.clear(),p3.clear(); s1.clear(),s2.clear(); } signed main(){ int T; scanf("%lld",&T); while(T--){ clear(); int n,x1; scanf("%lld%lld",&n,&x1); for(int i=1;i<=n;i++){ int y1,x2,y2; scanf("%lld%lld%lld",&y1,&y2,&x2); p1.push_back({x2,y1}); p2.push_back({x2,y2}); p3.push_back({x1,y1}); p3.push_back({x1,y2}); } for(int i=1;i<=4*n;i++){ int a; scanf("%lld",&a); if(a>0)s1.insert(a); else s2.insert(a); } if(s1.size()<n||s2.size()<n){ printf("-1\n"); continue; } sort(p3.begin(),p3.end()); int cnt=n; for(point t:p3){ if(cnt<s2.size())p2.push_back(t),cnt++; else p1.push_back(t); } for(point i:p1)printf("(%d,%d)\n",i.x,i.y); int r=p3.back().y,l=-1e18,mx,mi; while(l<=r){ int m=l+r>>1; if(check1(m)){ mi=m; l=m+1; } else r=m-1; } r=1e18,l=p3[0].y; while(l<=r){ int m=l+r>>1; if(check2(m)){ mx=m; r=m-1; } else l=m+1; } //printf("%lld %lld\n",mx,mi); printf("%lld\n",mx-mi); } }
- 1
信息
- ID
- 7654
- 时间
- 2500ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 40
- 已通过
- 5
- 上传者