思路:用cnt[i]记录i-1~i的单位宽度上的绿洲面积,然后从左边开始找直到左边绿洲的面积>=绿洲总面积的一半(如果后面cnt还是0就找到不是0为止)。
比赛期间最开始处理cnt时把条件写成了j<l+w&&j<=r,然后无尽的wa无尽的魔改,结果到时间了还没找出bug来。赛后看到一个思路和我差不多的同学的代码,但他写的是j<=r-1,改动了这个地方之后过了。觉得自己好傻逼......太难受了,很bad,对不起我的队友T T
#include <iostream>
#include <string.h>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
const int N=1000000+10;
long long cnt[N];
int main()
{
ios::sync_with_stdio(false);
int ct;
cin>>ct;
int r,n;
while(ct--)
{
memset(cnt,0,sizeof(cnt));
cin>>r;
cin>>n;
long long total=0;
for(int i=0;i<n;i++)
{
long long l,t,w,h;
cin>>l>>t>>w>>h;
total+=(w*h);
for(int j=l;j<l+w&&j<=r-1;j++)
cnt[j]+=h;
}
total=(total+1)/2;
long long sum=0;
int loc=-1;
for(int i=0;i<=r;i++)
{
if(sum==total&&sum+cnt[i]>total)
{
loc=i;
break;
}
else if(sum<total&&sum+cnt[i]>total)
{
loc=i+1;
break;
}
sum+=cnt[i];
}
if(loc==-1)
cout<<r<<endl;
else
{
while(cnt[loc]==0&&loc<=r)
loc++;
if(loc==r+1)
loc--;
cout<<loc<<endl;
}
}
return 0;
}
/*
*/