走路——我真傻,真的

走路

 

 

 

 

in

3

3 2 4

4 3 4

3 6 4

 out

2 2 2

一个人在t[i]之前不存在, 在走到f[i]之后消失.

分析:

我真傻,真的。我一开始分了速度方向相同与不同两种方案,而相同的方案有bug,不同的方案我打的时候却考虑了方向,也就是说,我打的不同的方案的代码就已经覆盖了相同的方案,我对着代码研究了半天,人快傻掉了。。。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 #include<vector>
 8 using namespace std;
 9 #define debug printf("zjyvegetable\n")
10 #define int long long
11 inline int read(){
12     int a=0,b=1;char c=getchar();
13     while(!isdigit(c)){if(c=='-')b=-1;c=getchar();}
14     while(isdigit(c)){a=a*10+c-'0';c=getchar();}
15     return a*b;
16 }
17 const int N=1e3+50;
18 struct node{
19     int t,s,f,flag;
20 }p[N];
21 int n,ans[N];
22 signed main(){
23     //freopen("walk.in","r",stdin);
24     //freopen("walk.out","w",stdout);
25     n=read();
26     for(int i=1;i<=n;i++){
27         p[i].t=read();p[i].s=read();
28         p[i].f=read();p[i].flag=(p[i].f-p[i].s>0?1:-1);
29     }
30     int s1,f1,s2,f2,t1,t2;
31     for(int i=1;i<=n;i++){
32         for(int j=i+1;j<=n;j++){
33             t1=max(p[i].t,p[j].t);
34             t2=min(p[i].t+abs(p[i].f-p[i].s),p[j].t+abs(p[j].f-p[j].s));
35             if(t1>t2)continue;
36             if(t1==p[i].t)s1=p[i].s,s2=p[j].s+p[j].flag*(t1-p[j].t);
37             else s2=p[j].s,s1=p[i].s+p[i].flag*(t1-p[i].t);
38             f1=s1+p[i].flag*(t2-t1);f2=s2+p[j].flag*(t2-t1);
39             if((f2>=f1&&s2<=s1)||(f2<=f1&&s2>=s1))ans[i]++,ans[j]++;
40         }
41     }
42     for(int i=1;i<=n;i++){
43     printf("%lld ",ans[i]);
44     }
45     return 0;
46 }

 

posted @ 2020-07-27 16:21  zjy1412  阅读(165)  评论(1编辑  收藏  举报