求救,下面的这两个程序有什么区别... (奶牛的不在场证明) 做了两年半。
#include<bits/stdc++.h>
using namespace std;
const long long MS=1e5+5;
long long g,n,ans=0;
struct Crime{
long long x,y;
long long t;
}crime[MS];
long long x,y;
long long t;
int calc(long long x1,long long y1,long long x2,long long y2){
long long tx=x1-x2,ty=y1-y2;
return (tx*tx+ty*ty);
}
bool check(int crime_number){
long long l=calc(crime[crime_number].x,x,crime[crime_number].y,y);
long long can_walk=(crime[crime_number].t-t);
if(can_walk*can_walk>=l) return 1;
else return 0;
}
int closest_crime(){
long long l=1,r=g,mid;
while(l<r){
mid=(l+r)/2;
if(crime[mid].t>=t)
r=mid;
else
l=mid+1;
if(t>crime[r-1].t and t<crime[r].t+1){
mid=r;
break;
}
if(t>crime[l].t and t<crime[l+1].t+1){
mid=l+1;
break;
}
}
return mid;
}
bool is_white(){
if(t<=crime[1].t){
if(check(1)) return 1;
}
if(t>=crime[g].t){
if(check(g)) return 1;
}
long long x=closest_crime();
if(check(x)&&check(x-1)) return 1;
return 0;
}
bool cmp(Crime a,Crime b){
return a.t<b.t;
}
int main(){
cin>>g>>n;
for(int i=1;i<g+1;i++)
cin>>crime[i].x>>crime[i].y>>crime[i].t;
sort(crime+1,crime+g+1,cmp);
for(int i=1;i<n+1;i++){
cin>>x>>y>>t;
if(is_white()) ans++;
}
cout<<n-ans;
return 0;
}
{```cpp #include<bits/stdc++.h> using namespace std; int l,r,mid,m,n,ans; long long x,y,t; struct SB { long long x,y,t; }a[100005]; bool cmp(SB x,SB y) { return x.t<y.t; } bool check(int k) { if((a[k].x-x)(a[k].x-x)+(a[k].y-y)(a[k].y-y)<=(a[k].t-t)*(a[k].t-t)) return true; return false; } void find(int t) { if(t<=a[1].t) { if(check(1)) ans++; return; } if(t>=a[m].t) { if(check(m)) ans++; return; } l=1;r=m; while(l<r) { mid=(l+r)/2; if(a[mid].t>=t) r=mid; else l=mid+1; if(t>a[r-1].t&&t<=a[r].t) { mid=r; break; } if(t>a[l].t&&t<=a[l+1].t) { mid=l+1; break; } } if(check(mid)&&check(mid-1)) ans++; } int main() { scanf("%d%d",&m,&n); for(int i=1;i<m+1;++i) scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].t); sort(a+1,a+m+1,cmp); for(int i=1;i<n+1;++i) { scanf("%lld%lld%lld",&x,&y,&t); find(t); } printf("%d",n-ans); }
if((a[k].x-x)*(a[k].x-x)+(a[k].y-y)*(a[k].y-y)<=(a[k].t-t)*(a[k].t-t)) return true;
return false;
}
void find(int t)
{
if(t<=a[1].t)
{
if(check(1)) ans++;
return;
}
if(t>=a[m].t)
{
if(check(m)) ans++;
return;
}
l=1;r=m;
while(l<r)
{
mid=(l+r)/2;
if(a[mid].t>=t) r=mid;
else l=mid+1;
if(t>a[r-1].t&&t<=a[r].t)
{
mid=r;
break;
}
if(t>a[l].t&&t<=a[l+1].t)
{
mid=l+1;
break;
}
}
if(check(mid)&&check(mid-1)) ans++;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<m+1;++i)
scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].t);
sort(a+1,a+m+1,cmp);
for(int i=1;i<n+1;++i)
{
scanf("%lld%lld%lld",&x,&y,&t);
find(t);
}
printf("%d",n-ans);
}