zoukankan      html  css  js  c++  java
  • hdu 5720 Wool

    /********************************************************
    题目: Wool(hdu 5720)
    链接: http://acm.hdu.edu.cn/showproblem.php?pid=5720
    解法: 考虑三角形三条边a,b,c (a≥b)的关系a−b<c,a+b>c
    即c∈(a−b,a+b) 。
    令加入的边为c,枚举所有边作为a的情况。对于所有
    可行的b,显然与a相差最小的可以让(a−b,a+b)覆盖范
    围最大,所以可以贪心地选择不大于a的最大的b。于
    是我们可以先将边按长度排序,然后ai和ai+1建一条
    线段,每建立一条线段都要去重。线段并是不合法的
    部分。
    *********************************************************/
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cstring>
    using namespace std;
    
    const int mx=100005;
    long long a[mx];
    
    struct T
    {
    long long l,r;
    bool operator < (const T &b) const
    {
    return r<b.r;
    }
    };
    priority_queue<T>q;
    
    void f(T t)
    {
    if (q.empty())
    {
    q.push(t);
    return ;
    }
    T s=q.top();
    q.pop();
    if (s.r>=t.l)
    {
    t.l=min(s.l,t.l);
    f(t);
    return ;
    }
    q.push(t);
    q.push(s);
    }
    int main()
    {
    
    
    int t;
    scanf("%d",&t);
    while (t--)
    {
    T t;
    long long n,l,r;
    scanf("%I64d%I64d%I64d",&n,&l,&r);
    for (int i=1;i<=n;i++) scanf("%I64d",&a[i]);
    sort(a+1,a+n+1);
    long long b,c;
    
    for (int i=2;i<=n;i++)
    {
    
    b=max(l,a[i]-a[i-1]+1);
    c=min(r,a[i]+a[i-1]-1);
    if (b>c) continue;
    t.l=b;
    t.r=c;
    f(t);
    }
    long long ans=0;
    while (!q.empty())
    {
    t=q.top();
    q.pop();
    ans+=(t.r-t.l+1);
    }
    printf("%I64d
    ",r-l+1-ans);
    }
    
    }
  • 相关阅读:
    进入用友通:提示"由于文件不可访问,内存磁盘空间不足无法打开ufsystem数据库"...
    HDOJ 1069 Monkey and Banana
    HDOJ 1087 Super Jumping! Jumping! Jumping!
    HDOJ 1209 Clock
    CodeForces Round #185 (Div. 2)A,B,C
    HDOJ 1465 不容易系列之一
    HDOJ 1114 PiggyBank
    HDOJ 1280 前m大的数
    HDOJ 1495 非常可乐
    HDOJ 1284 钱币兑换问题
  • 原文地址:https://www.cnblogs.com/pblr/p/5680250.html
Copyright © 2011-2022 走看看