hiho 1249 Xiongnu's Land

原创 2015年11月18日 20:34:22

分割线要满足三个条件:

1. 左边的绿洲面积要大于等于右边的绿洲面积。

2.两边的面积的差值要尽可能的小。

3.左边的总面积要尽可能的大于右边。

思路:先二分答案求出条件一和二满足的最左边的分割线,然后二分答案满足条件最右边的分割线。

本来写了一发线段树的,结果写搓了。。。。

#include<iostream>
#include<set>
#include<map>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn = 1000100;
int l[maxn], t[maxn], w[maxn], h[maxn], n;
/*void pushup(int cnt)
{
    sum[cnt] = sum[cnt<<1] + sum[cnt<<1|1];
}
void pushdown(int cnt, int len)

{
    if(mark[cnt])
    {
        int m = len / 2;
        mark[cnt<<1] += mark[cnt];
        mark[cnt<<1|1] += mark[cnt];
        sum[cnt<<1] += mark[cnt<<1] * (len - m);
        sum[cnt<<1|1] += mark[cnt<<1|1] * m;
        mark[cnt] = 0;
    }
}
void update(int nowl, int nowr, int l, int r, int c, int cnt)
{
    if(nowl>=l && nowr<=r)
    {
        sum[cnt] += (nowr - nowl + 1)*c;
        mark[cnt] += c;
        return ;
    }
    pushdown(cnt, nowr - nowl +1);
    int m = (nowr+nowl)>>1;
    if(l<=m)
        update(nowl, m, l, r, c, cnt<<1);
    if(r>m)
        update(m+1, nowr, l, r, c, cnt<<1|1);
    pushup(cnt);
}
ll query(int nowl, int nowr, int l, int r, int cnt)
{
    if(nowl>=l && nowr<=r)
    {
        return sum[cnt];
    }
    pushdown(cnt, nowr - nowl +1);
    int m = (nowl+nowr)>>1;
    ll sum = 0;
    if(l<=m)
        sum += query(nowl, m, l, r, cnt<<1);
    if(r>m)
        sum += query(m+1, nowr, l, r, cnt<<1|1);
    pushup(cnt);
    return sum;
}*/
ll get(int x)
{
    ll sum = 0;
    for(int i = 1; i<=n; i++)
    {
        sum += (ll)h[i]*(max(min(x-l[i], w[i]), 0));
    }
    return sum;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        ll s = 0;
        int r;
        scanf("%d", &r);
        //memset(a, 0, sizeof(a));
        scanf("%d", &n);
        //  memset(mark, 0, sizeof(mark));
        //  memset(sum, 0, sizeof(sum));
        for(int i = 1; i<=n; i++)
        {
            scanf("%d%d%d%d", &l[i], &t[i], &w[i], &h[i]);
        }
        s = get(r);
        int right = r, left = 1, mid;
        while(left<=right)
        {
            mid = (right+left)>>1;
            ll sum =get(mid);
            if(sum >= s-sum)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }
         //cout<<left<<endl;
        ll ans = get(left);
        right = r, left = 1;
        //  cout<<ans<<endl;
        while(left <= right)
        {
            mid = (right+left)>>1;
            ll sum = get(mid);
            if(sum > ans)
            {
                right = mid-1;
            }
            else
            {
                left = mid+1;
            }
        }
        cout<<right<<endl;
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hihocoder 1249 Xiongnu's Land

题目链接:A题题目大意:给你一个长宽都为k的矩阵,现在给了你一些小矩阵的绿化地带,现在要求你用平行于y轴的线分割这个矩阵为左右两部分,要求: 一、是左边的绿化地带必须大于等于右边的地带,并且两边的绿...
  • Nemaleswang
  • Nemaleswang
  • 2017年10月19日 21:06
  • 68

hihoCoder 1249 Xiongnu's Land(二分)

题目链接:hihoCoder 1249 Xiongnu’s Land代码#include #include #include using namespace std; typedef long l...
  • u011328934
  • u011328934
  • 2015年11月16日 15:38
  • 1115

ACM-ICPC北京赛区2015 A hihoCoder 1249 Xiongnu's Land

看了大牛的代码才明白正确的解法是怎样的。一开始想的是只枚举快要到一半的那一部分,就是这个“快要”的判断要了我半条命,WA了N次。大牛的想法很犀利。 总结:对于这种问题,最好就是直接枚举所有情况,再在其...
  • AngOn823
  • AngOn823
  • 2015年11月15日 18:52
  • 476

UVA 7261 Xiongnu's Land

U can find the original link herethis question need us to find a line parallel to y axis that divide...
  • lingzidong
  • lingzidong
  • 2017年11月24日 16:19
  • 64

Xiongnu's Land (UVALive - 7261)

Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against th...
  • zhuanshunzhe
  • zhuanshunzhe
  • 2017年03月24日 15:48
  • 99

二分 hihoCoder1249 Xiongnu's Land

传送门:点击打开链接 题意:沙漠中有许多块矩形水源,水源不相交,问能否找到一根中轴线,使得轴线左边的水源面积大于等于右边的水源面积。在满足两个面积之差最小的情况下,使得轴线靠近右端点 思路:只能说...
  • qwb492859377
  • qwb492859377
  • 2015年11月27日 12:16
  • 797

Xiongnu's Land (线性扫描,二分)

Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against th...
  • Littlewhite520
  • Littlewhite520
  • 2017年03月24日 17:10
  • 250

【扫描线】uvalive 7261 Xiongnu's Land

题目链接:https://cn.vjudge.net/problem/UVALive-7261 题意:输入r,即给定一个正方形r*r,然后输入n个绿洲,参数为l,t,w,h,分别为左上角坐标与宽和高...
  • baidu_35643793
  • baidu_35643793
  • 2017年10月11日 09:10
  • 63

UVALive 7261 Xiongnu's Land 扫描线

题目描述:Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns agains...
  • wuxuanyi27
  • wuxuanyi27
  • 2016年07月24日 12:56
  • 290

UVALive - 7261 Xiongnu's Land 二分OR扫描线

题目链接 题意:在二维坐标系第一象限中,将一块顶点在原点边长为R的正方形土地用直线x=n一分为二,左侧分给Wei,右侧分给Huo。 土地中包含N个绿洲,每个绿洲是一个矩形,其位置和大小用四...
  • HowardEmily
  • HowardEmily
  • 2017年03月24日 17:59
  • 184
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hiho 1249 Xiongnu's Land
举报原因:
原因补充:

(最多只允许输入30个字)