码迷,mamicode.com
首页 > 其他好文 > 详细

HDU5033 building 单调栈

时间:2018-12-11 21:54:24      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:hide   int   角度   解决   总结   方便   一点   void   closed   

正解:单调栈

解题报告:

哇生气辽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:\n",j);rp(i,1,q)printf("%.10lf\n",(double)ans[i]*180/PI) ;
    }
    return 0;
}
//话说插入代码中编程语言c#和c++看起来有什么区别嘛qwq我有时候选c#有时候选c++感觉界面都一样鸭qwq
这儿!是!代码!QwQ

 

 

 

 

 

 

HDU5033 building 单调栈

标签:hide   int   角度   解决   总结   方便   一点   void   closed   

原文地址:https://www.cnblogs.com/lqsukida/p/10105115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!