题目链接:https://cn.vjudge.net/problem/UVALive-7261
题意:输入r,即给定一个正方形r*r,然后输入n个绿洲,参数为l,t,w,h,分别为左上角坐标与宽和高;现需要按照下面条件画一条垂直于x轴的线将土地分为两半;
条件:1.左边绿洲的总区域大于右边,差距尽量小; 2.左边的土地尽量大,再不违反条件1的情况下;
思路:扫描线就是垂直与x轴的一条线,从左到右扫过去记录线之前所有绿洲的面积;
对每个绿洲进行标记,开头+=h,结尾-=h。
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long c[2000001];
int main()
{
int T;
scanf("%d",&T);
while(T>0)
{
T--;
memset(c,0,sizeof(c));
int r,n;
scanf("%d%d",&r,&n);
long long sum=0;
for(int i=1;i<=n;i++)
{
int l,t,w,h;
scanf("%d%d%d%d",&l,&t,&w,&h);
sum+=(long long)w*(long long)h;
c[l]+=h;
c[l+w]-=h;
}
sum=(sum+(long long)1)/(long long)2;
long long dx=c[0],ss=0;
int ans;
for(int i=1;i<=r;i++)
{
ss+=dx;
if(ss>=sum)
{
ans=i;
dx+=c[i];
while(dx==0&&ans<r)
{
ans++;
dx+=c[ans];
}
break;
}
dx+=c[i];
}
printf("%d\n",ans);
}
return 0;
}