Description
Input
Output
Sample Input
3
3 2 4
4 3 4
3 6 4
Sample Output
2 2 2
Data Constraint
Hint
一个人在t[i]之前不存在, 在走到f[i]之后消失.
这个题n方做法就行了,然后说一下自己的做法,当我们要判断i与j是否能打招呼时,先让时间短的补到时间长的,这时将现在到达的位置计算一下,若超出了目的地,显然不合法。之后若没超出,判断是否等于另一个的起始点,等于就合法。最后若不在一个点上,那么同一个方向的肯定遇不到,所以我们再判断不是同一个方向的时候,看一下到达的位置是否在两个点的范围内就行了。
#include<cstdio>
#include<algorithm>
#define N 1007
using namespace std;
int n,t[N],s[N],f[N],bz[N];
int main(){
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&t[i],&s[i],&f[i]);
bz[i]=(s[i]<f[i])?1:-1;
}
for(int i=1;i<=n;i++){
int ans=0;
for(int j=1;j<=n;j++){
if(i==j) continue;
int t1=t[i],s1=s[i],f1=f[i],b1=bz[i];
int t2=t[j],s2=s[j],f2=f[j],b2=bz[j];
if(t1>t2) swap(t1,t2),swap(s1,s2),swap(f1,f2),swap(b1,b2);
//将时间少的放到t1方便处理
s1+=b1*(t2-t1);//将时间补上
if(s1>f1&&b1==1) continue;
if(s1<f1&&b1==-1) continue;//若补上时间后的点超过了范围就不行
if(s1==s2){//此刻位置一样,合法
ans++;
continue;
}
if(b1!=b2){//方向不一样时
if(s1<s2&&b1==-1&&b2==1||s1>s2&&b1==1&&b2==-1) continue;//如果背对着就不合法
else{
double s=(s1+s2)/2.0;//s为相遇的点
if(s1<s2){
if(s<=f1&&s>=f2){ans++;continue;}
}else if(s>=f1&&s<=f2){ans++;continue;}//如果双方都能走到s就合法
}
}
}
printf("%d ",ans);
}
}