Problem Buildnode
題目大意ide
n個點,每一個點有兩個屬性(x,y)。ui
對於每一個點i,詢問一個 y 屬性大於i ,x屬性與 i 相差最小的點。spa
解題分析code
對於n個點,先以y爲關鍵字進行降序排序。blog
對於每一個點的x用set來維護,每次詢問時尋找當前點的前驅和後繼,比較一下x屬性的差值便可。排序
參考程序string
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <set> 6 using namespace std; 7 8 #define N 200008 9 10 struct node{ 11 int x,p,pos; 12 node(int xx=0,int pp=0,int ppos=0):x(xx),p(pp),pos(ppos){} 13 bool operator < (const node b) const{ 14 return x < b.x; 15 } 16 }a[N]; 17 18 int n; 19 int ans[N]; 20 set <node> S; 21 set <node> :: iterator it,it1; 22 int cmp(node a,node b){ 23 return a.p>b.p; 24 } 25 26 int main(){ 27 scanf("%d",&n); 28 for (int i=1;i<=n;i++){ 29 scanf("%d %d",&a[i].x,&a[i].p); 30 a[i].pos=i; 31 } 32 sort(a+1,a+n+1,cmp); 33 ans[a[1].pos]=-1; 34 S.insert(a[1]); 35 node x,y; 36 for (int i=2;i<=n;i++){ 37 S.insert(a[i]); 38 it = S.find(a[i]); 39 it1=it; it1++; 40 if (it==S.begin()){ 41 it++; x=*it; 42 ans[a[i].pos]=x.pos; 43 } else 44 if (it1==S.end()){ 45 it--; x=*it; 46 ans[a[i].pos]=x.pos; 47 } else 48 { 49 it--; x=*it; it++; 50 it++; y=*it; it--; 51 if (a[i].x-x.x<y.x-a[i].x) ans[a[i].pos]=x.pos; 52 if (a[i].x-x.x>y.x-a[i].x) ans[a[i].pos]=y.pos; 53 if (a[i].x-x.x==y.x-a[i].x) 54 if (x.p>y.p) ans[a[i].pos]=x.pos; 55 else ans[a[i].pos]=y.pos; 56 } 57 } 58 for (int i=1;i<=n;i++) printf("%d ",ans[i]); printf("\n"); 59 }