2015 俄罗斯网络赛 D. Boulevard

题意:所有人都在一条街上,抽象成坐标轴,有三组输入数据ti,si,fi,表示第i个人在ti秒出现在街上,从si往fi走,单位时间位移为1当两个人走到一个位置时,都互相打招呼,如果两个人相遇多次,只打一次招呼,到了目的地之后就不能打招呼了

分析:开始没头绪,后来队友说,可以抽象成线段的交点个数问题,每个人的行走过程可以描述成一个二维坐标轴上的线段,这样记录斜率和开始结束的时间就可以搞定了,

然后分两类,一类是斜率不同,一种是斜率相同,斜率不同只要比较开始结束时间就行了,斜率相同有两种情况(在一条直线上和平行),平行不用管,只要考虑在一条直线上就行了(很简单,自己在纸上分析一下)

详情见代码

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 #include<vector>
 9 #include<deque>
10 #include<stack>
11 using namespace std;
12 const int maxn=0x3f3f3f;
13 
14 struct point{
15     int t,s,f,k;
16     int L,R;
17     void cal(){
18         if(s<f)k=1;
19         else k=-1;
20         L=t;
21         R=t+abs(f-s);
22         if(L>R){
23             int tem=L;
24             L=R;
25             R=tem;
26         }
27     }
28 }p[1005];
29 
30 bool vis[1005][1005];
31 int ans[1005];
32 
33 int main(){
34     int n;
35     while(cin>>n){
36         for(int i=0;i<n;i++){
37             cin>>p[i].t>>p[i].s>>p[i].f;
38             p[i].cal();
39         }
40         memset(ans,0,sizeof(ans));
41         memset(vis,false,sizeof(vis));
42         for(int i=0;i<n;i++)
43             for(int j=i+1;j<n;j++){
44                 if(i==j)
45                     continue;
46                 if(p[i].k!=p[j].k){
47                     double x=p[j].s-p[i].s+p[i].k*p[i].t-p[j].k*p[j].t;
48                     x/=p[i].k-p[j].k;
49                     if(!vis[i][j]&&!vis[j][i]&&x>=p[i].L&&x<=p[i].R&&x>=p[j].L&&x<=p[j].R){
50                         ans[i]++;ans[j]++;
51                         vis[i][j]=vis[j][i]=1;
52                     }
53                 }
54                 else if((p[j].s-p[i].s+p[i].k*(p[i].t-p[j].t))==0){
55                     if(p[i].L<=p[j].L&&p[j].L<=p[i].R||p[j].L<=p[i].L&&p[i].L<=p[j].R){
56                         ans[i]++;ans[j]++;vis[i][j]=vis[j][i]=1;
57                     }
58                 }
59 
60         }
61         cout<<ans[0];
62         for(int i=1;i<n;i++)
63             cout<<" "<<ans[i];
64             cout<<endl;
65     }
66     return 0;
67 }
View Code

 

你可能感兴趣的:(2015 俄罗斯网络赛 D. Boulevard)