标签:des style http color java os io strong
1 2 1 1 1 1 1 1 2 2 2 1
Case #1: 1 1
排序+二分查找,代码改了一下午,虽然花了很多时间,不过学到的东西很多
#include <cmath> #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> using namespace std; const int inf=1e9; int v1,v2,n,T; struct Node{ long long t,p,w,kind,rank,cnt; double see_right,see_left; void init(int i) { double k=double (v2)/double(v1); cnt=0; rank=i; if(kind==1){ see_left=p-t*v2; see_right=see_left+w; } else { see_left=p*k-t*v2; see_right=see_left+w*k; } } bool operator < (const Node& tem) const{ return see_left < tem.see_left; } }ans[100010]; double data1[100010],data2[100010]; bool cmp(Node a,Node b) { return a.rank<b.rank; } void init () { scanf("%d %d %d ",&n,&v1,&v2); memset(data1,0,sizeof(data1)); memset(data2,0,sizeof(data2)); for(int i=0;i<n;i++) { scanf("%d %d %d %d",&ans[i].kind,&ans[i].t,&ans[i].p,&ans[i].w); ans[i].init(i); } } void slove() { init(); sort(ans,ans+n); int cnt1=0,cnt2=0; for(int i=0;i<n;i++) { if(ans[i].kind==1) { data1[cnt1++]=ans[i].see_left; } else { data2[cnt2++]=ans[i].see_left; } } data1[cnt1]=inf,data2[cnt2]=inf; for(int i=0;i<n;i++) { if(ans[i].kind==2){ ans[i].cnt=upper_bound(data1,data1+cnt1+1,ans[i].see_right)-lower_bound(data1,data1+cnt1+1,ans[i].see_left); } else{ ans[i].cnt=upper_bound(data2,data2+cnt2+1,ans[i].see_right)-lower_bound(data2,data2+cnt2+1,ans[i].see_left); } } sort(ans,ans+n,cmp); for(int i=0;i<n;i++) { printf("%d\n",ans[i].cnt); } } int main () { //freopen("1004.in","r",stdin); //freopen("data.out","w",stdout); int cas=0; scanf("%d",&T); while (T--) { printf("Case #%d:\n",++cas); slove(); } return 0; }
hdu 4938 Seeing People 排序+二分查找,布布扣,bubuko.com
hdu 4938 Seeing People 排序+二分查找
标签:des style http color java os io strong
原文地址:http://blog.csdn.net/alpc_paul/article/details/38538827