标签: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