HDU5033 building 单调栈
Posted lqsukida
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU5033 building 单调栈相关的知识,希望对你有一定的参考价值。
正解:单调栈
解题报告:
哇生气辽QAQ本来打了半天feel good都快挑出来了然后说换题了QAQ
不过还是大爆手速打了一通拿到首杀了嘻嘻
美滋滋辽
然后放个传送门先qwq
有一点点解题思想和oil是有点儿像的,就是先把询问和修改放一个结构体里排序,这样当到达某个询问的时候就可以直接解决不用进行其他修改了qwq
然后就是做两次单调栈一次算出往左能看到的角度一次算出往右能看到的角度
然后就欧克辽?
ummm好像是没什么好说的了只要推出了角度计算然后维护一个斜率单调栈,然后就差不多了?
顺便是不是可以总结下?就是这种计算几何询问+修改的经常会有放在一个数据结构里然后排序的操作?这样通常都会方便一些呢qwq
over?
代码放下我就做后面的题目辣qwq
#include <bits/stdc++.h> using namespace std; #define rp(i,x,y) for(register int i=x;i<=y;++i) const double PI=acos(-1.0) ; const int N=100000+100,inf=10000000; struct node { int x,h; bool operator<(const node &R)const{return x<R.x;} }bd[N<<1],stk[N<<1]; double ans[N]; int n,q; inline int read() { char ch=getchar();int x=0;bool y=1; while(ch!=‘-‘ && (ch>‘9‘ || ch<‘0‘))ch=getchar(); if(ch==‘-‘)ch=getchar(),y=0; while(ch>=‘0‘ && ch<=‘9‘)x=(x<<1)+(x<<3)+(ch^‘0‘),ch=getchar(); return y?x:-x; } inline bool judge(node a,node b,node c) { if(c.h<=0)c.h=0; return (long long)(a.h-c.h)*(b.x-c.x)<=(long long)(b.h-c.h)*(a.x-c.x); } inline double xl(node a,node b){return atan(1.0*(b.x-a.x)/a.h);} inline void solve() { int top=0; rp(i,1,n+q) { if(bd[i].h<=0) { while(top>=2 && judge(stk[top-2],stk[top-1],bd[i]))--top; ans[-bd[i].h]+=xl(stk[top-1],bd[i]); continue; } while((top && stk[top-1].h<=bd[i].h) || (top>=2 && judge(stk[top-2],stk[top-1],bd[i])))--top; stk[top++]=bd[i]; } } int main() { int T=read(); rp(j,1,T) { n=read();rp(i,1,n)bd[i].x=read(),bd[i].h=read(); q=read();rp(i,1,q)bd[i+n].x=read(),bd[i+n].h=-i; memset(ans,0,sizeof(ans));sort(bd+1,bd+n+q+1);solve(); reverse(bd+1,bd+n+q+1);rp(i,1,n+q)bd[i].x=inf-bd[i].x;solve() ; printf("Case #%d: ",j);rp(i,1,q)printf("%.10lf ",(double)ans[i]*180/PI) ; } return 0; } //话说插入代码中编程语言c#和c++看起来有什么区别嘛qwq我有时候选c#有时候选c++感觉界面都一样鸭qwq
以上是关于HDU5033 building 单调栈的主要内容,如果未能解决你的问题,请参考以下文章
HDU 6957 Maximal submatrix(悬线法 || 优先队列 || 单调栈 )