hdu5033 Building 凸包
2015-09-09 16:37
387 查看
题意:在x轴上有许多高楼,有q个询问,询问人在某一点能看到的天空的最大角度。
parse:离线维护一个高度下降的凸包。
parse:离线维护一个高度下降的凸包。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<vector> #include<set> #include<map> #include<queue> #include<bitset> #define ll long long #define inf 1<<30 #define eps 1e-8 #define PI 3.141592653 using namespace std; const int maxn=200005; struct Node { int x,h; int id; bool operator<(const Node& u)const { if(x==u.x) return id<u.id; return x<u.x; } }node[maxn]; Node stk[maxn]; double l[maxn]; double r[maxn]; double ans[maxn]; int n,q,x,h; double tan(Node a,Node b) { return fabs(a.h-b.h)/fabs(a.x-b.x); } int main() { int t; int cas=1; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&node[i].x,&node[i].h); node[i].id=i; } scanf("%d",&q); for(int i=0;i<q;i++){ scanf("%d",&node[n+i].x); node[n+i].h=0; node[n+i].id=i; } sort(node,node+n+q); int head=0; for(int i=0;i<n+q;i++) { if(node[i].h==0) { while(head>=2 && tan(stk[head-2],stk[head-1])>tan(stk[head-1],node[i])) { head--; } if(head==0) l[node[i].id]=0; else l[node[i].id]=tan(stk[head-1],node[i]); } else { while(head && stk[head-1].h<=node[i].h) head--; while(head>=2 && tan(stk[head-2],stk[head-1])>tan(stk[head-1],node[i])) head--; stk[head++]=node[i]; } } head=0; for(int i=n+q-1;i>=0;i--) { if(node[i].h==0) { while(head>=2 && tan(stk[head-2],stk[head-1])>tan(stk[head-1],node[i])) { head--; } if(head==0) r[node[i].id]=0; else r[node[i].id]=tan(stk[head-1],node[i]); } else { while(head && stk[head-1].h<=node[i].h) head--; while(head>=2 && tan(stk[head-2],stk[head-1])>tan(stk[head-1],node[i])) head--; stk[head++]=node[i]; } } for(int i=0;i<q;i++) { ans[i]=(PI-atan(l[i])-atan(r[i]))/PI*180; } printf("Case #%d:\n",cas++); for(int i=0;i<q;i++) { printf("%.10lf\n",ans[i]); } } return 0; }
相关文章推荐
- IOS第二天多线程-05NSOperationQueue 暂停,和恢复队列任务
- UICollectionView学习<2>之UICollectionViewCell的自定义
- UIKit类关系总览
- easy ui 菜单和按钮(Menu and Button)
- AI--N Queens Problem(Look-Back method)
- LED调光,PFM即pulse frequence modulation
- Java使用阻塞队列BlockingQueue实现线程同步
- 执行maven-build.cmd失败
- HDU 5033 Building
- 修改easyui日期控件只显示年月,并且只能选择年月
- 进程pid,ppid;进程uid,euid;用户uid,guid
- jeasyui在页面显式创建dialog并兼容IE8
- iOS 利用NSNumber和NSValue将非OC对象类型数据存放到集合
- 初学require.js
- 玩转EasyUI之Dialog
- UILabel显示多行文本,字体设置
- 1099. Build A Binary Search Tree (30)
- UIBezierPath贝塞尔弧线常用方法记
- iosUI—CALayer
- Android开发——异步更新UI的四种方式