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\n",ans); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚