首页 > 代码库 > [2014 北京网络赛]

[2014 北京网络赛]

02 hdu 5033 Building

题目意思:

数轴上有n根柱子,每根柱子有个位置坐标和高度,有q个询问,询问从位置qi能看到的角度(保证左右至少有一个柱子)

解题思路:

单调栈维护一个凸性柱子序列。

离线处理所有的查询,排序,然后扫一遍qi,把柱子插进去,更新单调栈。注意查询位置也要更新栈。

代码:

//#include<CSpreadSheet.h>

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define Maxn 110000

struct Inf
{
    double xi,hi;
}inf[Maxn];
int n,q,L[Maxn],R[Maxn],sta[Maxn];
struct Sa
{
    double xi;
    int pos;
}sa[Maxn];
double be[Maxn];


bool cmp1(struct Inf a,struct Inf b)
{
    return a.xi<b.xi;
    //return a.hi<b.hi;
}
bool cmp2(struct Sa a,struct Sa b)
{
    return a.xi<b.xi;
}
bool iscan(int top,int topp,int la)
{
    if(((inf[top].hi-inf[la].hi)/(inf[la].xi-inf[top].xi))<=((inf[topp].hi-inf[top].hi)/(inf[top].xi-inf[topp].xi)))
        return true;
    return false;
}
bool iscan1(int top,int topp,int la)
{
    if(((inf[top].hi-inf[la].hi)/(inf[top].xi-inf[la].xi))<=((inf[topp].hi-inf[top].hi)/(inf[topp].xi-inf[top].xi)))
        return true;
    return false;
}
int main()
{
    //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   int t;

   scanf("%d",&t);
   for(int nn=1;nn<=t;nn++)
   {
       scanf("%d",&n);
       for(int i=1;i<=n;i++)
            scanf("%lf%lf",&inf[i].xi,&inf[i].hi);
       sort(inf+1,inf+n+1,cmp1);
       scanf("%d",&q);
       for(int i=1;i<=q;i++)
       {
           scanf("%lf",&sa[i].xi);
           be[i]=sa[i].xi;
           sa[i].pos=i;
       }
       sort(sa+1,sa+q+1,cmp2);
       int cnt=0;
       int la=1;

       for(int i=1;i<=q;i++)
       {
           while(inf[la].xi<sa[i].xi&&la<=n)
           {
               if(!cnt)
               {
                   sta[++cnt]=la;
                   la++;
               }
               else if(cnt==1)
               {
                   if(inf[la].hi>=inf[sta[cnt]].hi)
                        sta[cnt]=la;
                   else
                        sta[++cnt]=la;
                   la++;
               }
               else
               {
                   int top=sta[cnt];
                   int topp=sta[cnt-1];

                   while(inf[top].hi<=inf[la].hi||iscan(top,topp,la))
                   {
                       --cnt;
                       if(cnt<=1)
                           break;
                       top=sta[cnt];
                       topp=sta[cnt-1];
                   }
                   if(cnt<=1)
                   {
                       if(!cnt)
                            sta[++cnt]=la;
                       else
                       {
                           if(inf[la].hi>=inf[sta[cnt]].hi)
                                sta[cnt]=la;
                           else
                                sta[++cnt]=la;
                       }
                   }
                   else
                       sta[++cnt]=la;
                   ++la;

               }
           }
           if(cnt==1) //最少有一个
           {
               L[sa[i].pos]=sta[cnt];
               continue;
           }
           int top=sta[cnt];
           int topp=sta[cnt-1];
           while((inf[top].hi/(sa[i].xi-inf[top].xi))<=((inf[topp].hi-inf[top].hi)/(inf[top].xi-inf[topp].xi)))
           {
               cnt--;
               if(cnt<=1)
                    break;
               top=sta[cnt];
               topp=sta[cnt-1];
           }
           L[sa[i].pos]=sta[cnt];
       }
       cnt=0;
       la=n;

       for(int i=q;i>=1;i--)
       {
           while(inf[la].xi>sa[i].xi&&la>=1)
           {
               if(!cnt)
               {
                   sta[++cnt]=la;
                   la--;
               }
               else if(cnt==1)
               {
                   if(inf[la].hi>=inf[sta[cnt]].hi)
                        sta[cnt]=la;
                   else
                        sta[++cnt]=la;
                   la--;
               }
               else
               {
                   int top=sta[cnt];
                   int topp=sta[cnt-1];

                   while(inf[top].hi<=inf[la].hi||iscan1(top,topp,la))
                   {
                       --cnt;
                       if(cnt<=1)
                           break;
                       top=sta[cnt];
                       topp=sta[cnt-1];
                   }
                   if(cnt<=1)
                   {
                       if(!cnt)
                            sta[++cnt]=la;
                       else
                       {
                           if(inf[la].hi>=inf[sta[cnt]].hi)
                                sta[cnt]=la;
                           else
                                sta[++cnt]=la;
                       }
                   }
                   else
                       sta[++cnt]=la;
                   la--;
               }
           }
           if(cnt==1) //最少有一个
           {
               R[sa[i].pos]=sta[cnt];
               continue;
           }
           int top=sta[cnt],topp=sta[cnt-1];
           while((inf[top].hi/(inf[top].xi-sa[i].xi))<((inf[topp].hi-inf[top].hi)/(inf[topp].xi-inf[top].xi)))
           {
               cnt--;
               if(cnt<=1)
                    break;
               top=sta[cnt];
               topp=sta[cnt-1];
           }
           R[sa[i].pos]=sta[cnt];
       }
       printf("Case #%d:\n",nn);
       for(int i=1;i<=q;i++)
       {
           int ri=R[i],le=L[i];

           //printf("le:%d ri:%d\n",le,ri);

           double px=inf[ri].xi-be[i],py=inf[ri].hi;
           double qx=inf[le].xi-be[i],qy=inf[le].hi;

           double temp=px*qx+py*qy;

           printf("%.10f\n",acos(temp/(sqrt(px*px+py*py)*sqrt(qx*qx+qy*qy)))/PI*180.0);
       }


   }
    return 0;
}


07 hdu 5038 Grade

题目意思:

求出现次数最多的那个数。如果所有数出现次数都一样且不是全部一样,则输出Bad Mushroom

解题思路:

水题,排序就行。

代码:

//#include<CSpreadSheet.h>

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define Maxn 110000

struct Inf
{
    double xi,hi;
}inf[Maxn];
int n,q,L[Maxn],R[Maxn],sta[Maxn];
struct Sa
{
    double xi;
    int pos;
}sa[Maxn];
double be[Maxn];


bool cmp1(struct Inf a,struct Inf b)
{
    return a.xi<b.xi;
    //return a.hi<b.hi;
}
bool cmp2(struct Sa a,struct Sa b)
{
    return a.xi<b.xi;
}
bool iscan(int top,int topp,int la)
{
    if(((inf[top].hi-inf[la].hi)/(inf[la].xi-inf[top].xi))<=((inf[topp].hi-inf[top].hi)/(inf[top].xi-inf[topp].xi)))
        return true;
    return false;
}
bool iscan1(int top,int topp,int la)
{
    if(((inf[top].hi-inf[la].hi)/(inf[top].xi-inf[la].xi))<=((inf[topp].hi-inf[top].hi)/(inf[topp].xi-inf[top].xi)))
        return true;
    return false;
}
int main()
{
    //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   int t;

   scanf("%d",&t);
   for(int nn=1;nn<=t;nn++)
   {
       scanf("%d",&n);
       for(int i=1;i<=n;i++)
            scanf("%lf%lf",&inf[i].xi,&inf[i].hi);
       sort(inf+1,inf+n+1,cmp1);
       scanf("%d",&q);
       for(int i=1;i<=q;i++)
       {
           scanf("%lf",&sa[i].xi);
           be[i]=sa[i].xi;
           sa[i].pos=i;
       }
       sort(sa+1,sa+q+1,cmp2);
       int cnt=0;
       int la=1;

       for(int i=1;i<=q;i++)
       {
           while(inf[la].xi<sa[i].xi&&la<=n)
           {
               if(!cnt)
               {
                   sta[++cnt]=la;
                   la++;
               }
               else if(cnt==1)
               {
                   if(inf[la].hi>=inf[sta[cnt]].hi)
                        sta[cnt]=la;
                   else
                        sta[++cnt]=la;
                   la++;
               }
               else
               {
                   int top=sta[cnt];
                   int topp=sta[cnt-1];

                   while(inf[top].hi<=inf[la].hi||iscan(top,topp,la))
                   {
                       --cnt;
                       if(cnt<=1)
                           break;
                       top=sta[cnt];
                       topp=sta[cnt-1];
                   }
                   if(cnt<=1)
                   {
                       if(!cnt)
                            sta[++cnt]=la;
                       else
                       {
                           if(inf[la].hi>=inf[sta[cnt]].hi)
                                sta[cnt]=la;
                           else
                                sta[++cnt]=la;
                       }
                   }
                   else
                       sta[++cnt]=la;
                   ++la;

               }
           }
           if(cnt==1) //最少有一个
           {
               L[sa[i].pos]=sta[cnt];
               continue;
           }
           int top=sta[cnt];
           int topp=sta[cnt-1];
           while((inf[top].hi/(sa[i].xi-inf[top].xi))<=((inf[topp].hi-inf[top].hi)/(inf[top].xi-inf[topp].xi)))
           {
               cnt--;
               if(cnt<=1)
                    break;
               top=sta[cnt];
               topp=sta[cnt-1];
           }
           L[sa[i].pos]=sta[cnt];
       }
       cnt=0;
       la=n;

       for(int i=q;i>=1;i--)
       {
           while(inf[la].xi>sa[i].xi&&la>=1)
           {
               if(!cnt)
               {
                   sta[++cnt]=la;
                   la--;
               }
               else if(cnt==1)
               {
                   if(inf[la].hi>=inf[sta[cnt]].hi)
                        sta[cnt]=la;
                   else
                        sta[++cnt]=la;
                   la--;
               }
               else
               {
                   int top=sta[cnt];
                   int topp=sta[cnt-1];

                   while(inf[top].hi<=inf[la].hi||iscan1(top,topp,la))
                   {
                       --cnt;
                       if(cnt<=1)
                           break;
                       top=sta[cnt];
                       topp=sta[cnt-1];
                   }
                   if(cnt<=1)
                   {
                       if(!cnt)
                            sta[++cnt]=la;
                       else
                       {
                           if(inf[la].hi>=inf[sta[cnt]].hi)
                                sta[cnt]=la;
                           else
                                sta[++cnt]=la;
                       }
                   }
                   else
                       sta[++cnt]=la;
                   la--;
               }
           }
           if(cnt==1) //最少有一个
           {
               R[sa[i].pos]=sta[cnt];
               continue;
           }
           int top=sta[cnt],topp=sta[cnt-1];
           while((inf[top].hi/(inf[top].xi-sa[i].xi))<((inf[topp].hi-inf[top].hi)/(inf[topp].xi-inf[top].xi)))
           {
               cnt--;
               if(cnt<=1)
                    break;
               top=sta[cnt];
               topp=sta[cnt-1];
           }
           R[sa[i].pos]=sta[cnt];
       }
       printf("Case #%d:\n",nn);
       for(int i=1;i<=q;i++)
       {
           int ri=R[i],le=L[i];

           //printf("le:%d ri:%d\n",le,ri);

           double px=inf[ri].xi-be[i],py=inf[ri].hi;
           double qx=inf[le].xi-be[i],qy=inf[le].hi;

           double temp=px*qx+py*qy;

           printf("%.10f\n",acos(temp/(sqrt(px*px+py*py)*sqrt(qx*qx+qy*qy)))/PI*180.0);
       }


   }
    return 0;
}




[2014 北京网络赛]