标签:style blog http color io os ar for 2014
题目意思:
数轴上有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;
}
题目意思:
求出现次数最多的那个数。如果所有数出现次数都一样且不是全部一样,则输出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;
}
标签:style blog http color io os ar for 2014
原文地址:http://blog.csdn.net/cc_again/article/details/39457967