标签:skill join cep 分配 parent end recover case can
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 3191 Accepted Submission(s): 1350
题目链接:HDU 4585
题意就是少林寺里有一个初始的人,他的id是1,武力值是1e9,然后按照输入顺序有n个人来少林寺挑战,输出n行,对应每一个来挑战的人给他分配的对手是谁。如何分配对手的规则题目已经讲了。
简单的做法就是建一颗Treap,然后在树上进行二分答案,找前驱与后继再比较判断得出答案即可,水题一道
代码:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
struct Treap
{
int ls, rs, v, sz, id;
int rnd;
};
Treap T[N];
int rt, tot;
void init()
{
rt = 0;
tot = 0;
}
void pushup(int k)
{
T[k].sz = T[T[k].ls].sz + T[T[k].rs].sz + 1;
}
void lturn(int &k)
{
int rs = T[k].rs;
T[k].rs = T[rs].ls;
T[rs].ls = k;
T[rs].sz = T[k].sz;
pushup(k);
k = rs;
}
void rturn(int &k)
{
int ls = T[k].ls;
T[k].ls = T[ls].rs;
T[ls].rs = k;
T[ls].sz = T[k].sz;
pushup(k);
k = ls;
}
void ins(int &k, int v, int id)
{
if (!k)
{
k = ++tot;
T[k].ls = T[k].rs = 0;
T[k].v = v, T[k].id = id;
T[k].sz = 1;
T[k].rnd = rand();
}
else
{
++T[k].sz;
if (v < T[k].v)
{
ins(T[k].ls, v, id);
if (T[T[k].ls].rnd < T[k].rnd)
rturn(k);
}
else
{
ins(T[k].rs, v, id);
if (T[T[k].rs].rnd < T[k].rnd)
lturn(k);
}
}
}
void get_pre(int k, int v, int &ans)
{
if (!k)
return ;
if (T[k].v < v)
{
ans = k;
get_pre(T[k].rs, v, ans);
}
else
get_pre(T[k].ls, v, ans);
}
void get_post(int k, int v, int &ans)
{
if (!k)
return ;
if (T[k].v > v)
{
ans = k;
get_post(T[k].ls, v, ans);
}
else
get_post(T[k].rs, v, ans);
}
int main(void)
{
srand(987654321);
int n;
while (~scanf("%d", &n) && n)
{
init();
ins(rt, 1e9, 1);
while (n--)
{
int id, v;
scanf("%d%d", &id, &v);
int pre = -1, post = -1;
get_pre(rt, v, pre);
get_post(rt, v, post);
if (pre == -1)
printf("%d %d\n", id, T[post].id);
else if (post == -1)
printf("%d %d\n", id, T[pre].id);
else
{
int dxpre = abs(v - T[pre].v), dxpost = abs(v - T[post].v);
if (dxpre < dxpost)
printf("%d %d\n", id, T[pre].id);
else if (dxpre > dxpost)
printf("%d %d\n", id, T[post].id);
else
printf("%d %d\n", id, T[pre].id);
}
ins(rt, v, id);
}
}
return 0;
}
标签:skill join cep 分配 parent end recover case can
原文地址:http://www.cnblogs.com/Blackops/p/7221341.html