标签:相交 内存 pac ring lse 限制 hide 提前 大于
平面上有一个大矩形,其左下角坐标(0,0),右上角坐标(R,R)。大矩形内部包含一些小矩形,小矩形都平行于坐标轴且互不重叠。所有矩形的顶点都是整点。要求画一根平行于y轴的直线x=k(k是整数) ,使得这些小矩形落在直线左边的面积必须大于等于落在右边的面积,且两边面积之差最小。并且,要使得大矩形在直线左边的的面积尽可能大。注意:若直线穿过一个小矩形,将会把它切成两个部分,分属左右两侧。
1000 2 1 1 2 1 5 1 2 1
5
1 while(l<=r){ 2 mid = md; 3 ll ant = fid(mid);//左边小矩形的面积 4 if(ant<vsum-ant) l = mid+1; 5 else r = mid-1; 6 } 7 ll cnt = fid(l); 8 while(cnt==fid(l)&&l<=n) l++;
while(l<=r){ mid = md; ll ant = fid(mid);//左边小矩形的面积 if(ant<vsum-ant) l = mid+1;//在while中 l 是一直满足这个的 fid(l)<= key else r = mid-1; }//二分结束 l,r 的位置关系变成 r,l 这时 l 刚好不再满足while内的关系
//所以此时 l 刚好 > key 所以 r 为 <= 最右端的值
最后再讲一下这题的坑 long long
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cmath> 6 #include <map> 7 #include <set> 8 #include <algorithm> 9 #define ll long long 10 #define md l+(r-l>>1) 11 #define max(a,b) (a<b?b:a) 12 #define min(a,b) (a<b?a:b) 13 using namespace std; 14 const int maxn = 1e5+500; 15 struct node{ 16 ll L,H,x; 17 }mp[maxn]; 18 int n,m; 19 ll vsum; 20 bool cmp(node a,node b){ 21 return a.x<b.x; 22 } 23 ll fid(ll t){ 24 ll sum = 0; 25 for(int i=0;i<m;++i){ 26 if(mp[i].x<t){//左边在 27 if(mp[i].x+mp[i].L<=t) sum+=mp[i].H*mp[i].L;//右边 28 else sum+=mp[i].H*(t-mp[i].x); 29 } 30 else break; 31 } 32 return sum; 33 } 34 int main(){ 35 while(~scanf("%d%d",&n,&m)){ 36 vsum = 0;int t; 37 for(int i=0;i<m;++i){ 38 scanf("%lld%d%lld%lld",&mp[i].x,&t,&mp[i].L,&mp[i].H); 39 vsum += mp[i].L*mp[i].H; 40 } 41 sort(mp,mp+m,cmp);//以小矩形的左纵边x 42 ll l=0,r=n,mid; 43 while(l<=r){ 44 mid = md; 45 ll ant = fid(mid);//左边小矩形的面积 46 if(ant<vsum-ant) l = mid+1; 47 else r = mid-1; 48 } 49 ll cnt = fid(l); 50 while(cnt==fid(l)&&l<=n) l++; 51 printf("%d\n",l-1); 52 } 53 return 0; 54 }
标签:相交 内存 pac ring lse 限制 hide 提前 大于
原文地址:https://www.cnblogs.com/DeadWooder/p/9526856.html