1. 程式人生 > >【OJ2178】RP俱樂部

【OJ2178】RP俱樂部

nod nal name getc cst etc urn algo lin

2178 -- RP俱樂部(Solution)

題目大意 :\(n\) 個人,每個人有兩個屬性 \(RP\)\(ID\) ,保證 \(RP\)\(ID\) 互不相同。第 \(i\) 個人與前 \(i-1\) 個人中 \(RP\) 與他差值最小的人比賽(如果差值相同則選擇 \(RP\) 更小的)。求每場比賽雙方的 \(ID\) 。(最開始有一個人\(ID=1, RP=10^9\)\((n\le2\times 10^5,\, ID,RP\leq10^9)\)

Tag: STL

Analysis By LC:

將每個人的信息存入 \(\rm set\) ,利用 \(\rm set\)

中的 \(\rm lower\_bound\) 找到第一個大於和第一個小於即可。

Code By LC :

#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
inline int _read()
{
    char c; int x=0;
    for(;c<'0'||c>'9';c=getchar());
    for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
    return x;
}
const int N=200005;
struct Node
{
    int id,rp;
}a[N];
bool operator < (Node x, Node y)
{
    if(x.rp==y.rp) return x.id>y.id;
    return x.rp<y.rp;
}
set<Node> s;
int main()
{
    int n=_read(); s.insert((Node){1,1000000000});
    for(int i=1;i<=n;i++)
    {
        Node u;
        u.id=_read(),u.rp=_read();
        printf("%d ",u.id);
        auto x=s.lower_bound(u);
        if(x->rp==u.rp||x==s.begin()) printf("%d\n",x->id);
        else
        {
            auto y=x; y--;
            if(u.rp-y->rp>x->rp-u.rp) printf("%d\n",x->id);
            else printf("%d\n",y->id);
        }
        s.insert(u);
    }
}

【OJ2178】RP俱樂部