USACO2002 Open:雄伟的山峦

简要题意:

  奶牛们在落基山下避暑,从它们的房子向外望去,可以看到N 座山峰构成的山峦,奶牛发现每座山峰都是等腰三角形,底边长度恰好是高度的两倍。所以山峰的顶点坐标可由两个底部端点求出。设i 座第山峰的两个底部端点的横坐标分别为Ai 和Bi。你能否计算一下这片山峦所覆盖 的总面积是多少。为了保证答案是整数,输出总面积乘以4 的积。


输入格式:

  • 第一行:单个整数N,1 ≤ N ≤ 10^5

  • 第二行到第N + 1 行:第i + 1 行有两个整数Ai 和Bi,−2^15 ≤ Ai < Bi ≤ 2^15


输出格式:

  • 单个整数:表示山峦所占总面积乘以4 的积。


样例输入:

5

2 7

6 9

12 15

14 21

20 25


样例输出:

114


题解:

  就是一道排序的水题,USACO竟然定了三星难度QAQ,做法很简单,将每个三角形按照第一个点的坐标从小到大排序,然后去除能被覆盖的三角形,然后判断相邻的三角形是相离还是相交的关系就可以了

  PS:总面积乘以四之后其实就是:底边*高(底边的一半)/2*4=底边*底边


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
    int x,y;
}a[110000],s[110000];
int cmp(const void *xx,const void *yy)
{
    node n1=*(node *)xx;
    node n2=*(node *)yy;
    if(n1.x<n2.x) return -1;
    if(n1.x>n2.x) return 1;
    if(n1.y<n2.y) return -1;
    if(n1.y>n2.y) return 1;
    return 0;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
    qsort(a+1,n,sizeof(node),cmp);
    int len=0;
    for(int i=2;i<=n;i++)
    {
        if(a[i-1].x!=a[i].x)
        {
            s[++len]=a[i-1];
        }
    }
    if(a[n-1].x!=a[n].x) s[++len]=a[n];
    int i=2,t=1;
    n=1;
    a[1]=s[1];
    while(1)
    {
        while(s[t].y>=s[i].y&&i<=len) i++;
        if(i==len+1) break;
        a[++n]=s[i];
        t=i;
        i++;if(i==len+1) break;
    }
    int ans=0;
    for(int i=2;i<=n;i++)
    {
        if(a[i-1].y<=a[i].x) ans+=(a[i-1].y-a[i-1].x)*(a[i-1].y-a[i-1].x);
        else ans+=(a[i-1].y-a[i-1].x)*(a[i-1].y-a[i-1].x)-(a[i-1].y-a[i].x)*(a[i-1].y-a[i].x);
    }
    ans+=(a[n].y-a[n].x)*(a[n].y-a[n].x);
    printf("%d
",ans);
    return 0;
}

 

原文地址:https://www.cnblogs.com/Never-mind/p/7767024.html