Build (set)

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 }
View Code
相關文章
相關標籤/搜索