标签: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