首页 > 代码库 > [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; }
题目意思:
求出现次数最多的那个数。如果所有数出现次数都一样且不是全部一样,则输出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 北京网络赛]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。