代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
struct node
{
int x;
int y;
int z;
int id;
}a[N],b[N],c[N];
int cmp(node x,node y)
{
return x.x>y.x;
}
int cmp1(node x,node y)
{
return x.y>y.y;
}
int cmp2(node x,node y)
{
return x.z>y.z;
}
int cnt[N];
int main()
{
memset(cnt,0x3f,sizeof(cnt));
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].z);
a[i].id = i;
b[i] = a[i];
c[i] = a[i];
}
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp1);
sort(c+1,c+n+1,cmp2);
for(int i = 1;i<=n;i++)
{
int l = 1,r = i-1,ans = 0;
while(l<=r)
{
int mid = l+r>>1;
if(a[mid].x>a[i].x)
{
ans = mid+1;
l = mid+1;
}
else
{
r = mid-1;
}
}
if(ans == 0)
{
cnt[a[i].id] = min(cnt[a[i].id],i);
}
else
{
cnt[a[i].id] = min(cnt[a[i].id],ans);
}
}
for(int i = 1;i<=n;i++)
{
int l = 1,r = i-1,ans = 0;
while(l<=r)
{
int mid = l+r>>1;
if(b[mid].y>b[i].y)
{
ans = mid+1;
l = mid+1;
}
else
{
r = mid-1;
}
}
if(ans == 0)
{
cnt[b[i].id] = min(cnt[b[i].id],i);
}
else
{
cnt[b[i].id] = min(cnt[b[i].id],ans);
}
}
for(int i = 1;i<=n;i++)
{
int l = 1,r = i-1,ans = 0;
while(l<=r)
{
int mid = l+r>>1;
if(c[mid].z>c[i].z)
{
ans = mid+1;
l = mid+1;
}
else
{
r = mid-1;
}
}
if(ans == 0)
{
cnt[c[i].id] = min(cnt[c[i].id],i);
}
else
{
cnt[c[i].id] = min(cnt[c[i].id],ans);
}
}
for(int i = 1;i<=n;i++)
{
printf("%d\n",cnt[i]);
}
return 0;
}
一切回答请 @。