您的位置:首页 > 其它

【HDOJ】5096 ACM Rank

2015-10-25 19:49 302 查看
Treap+set仿函数重定义。每当ac一道题目时,相当于对总时间减去一个大数。

/* 5096 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000")

#define sti                set<int>
#define stpii            set<pair<int, int> >
#define mpii            map<int,int>
#define vi                vector<int>
#define pii                pair<int,int>
#define vpii            vector<pair<int,int> >
#define rep(i, a, n)     for (int i=a;i<n;++i)
#define per(i, a, n)     for (int i=n-1;i>=a;--i)
#define clr                clear
#define pb                 push_back
#define mp                 make_pair
#define fir                first
#define sec                second
#define all(x)             (x).begin(),(x).end()
#define SZ(x)             ((int)(x).size())
#define lson            l, mid, rt<<1
#define rson            mid+1, r, rt<<1|1

const int maxn = 10005;
const int BigInt = 1e7;
int S[maxn], top, tot, root;
int lst[maxn], lstac[maxn];
bool mark[maxn][15];
int pen[maxn][15];
int T[maxn];
char cmd[10], line[1005];

typedef struct fcmp {
bool operator() (const int& a, const int& b) {
if (lstac[a]==-1 && lstac[b]==-1)
return a<b;
if (lstac[a]!=-1 && lstac[b]!=-1)
return lstac[a]<lstac[b];
else if (lst[a] == -1)
return false;
else
return true;
}
} fcmp;

typedef struct Node {
int ch[2];
int r, s, v, c;
set<int, fcmp> st;

Node() {}

void setId(int v_, int id) {
v = v_;
st.clr();
st.insert(id);
ch[0] = ch[1] = 0;
r = rand();
s = c = 1;
}

int cmp(int x) const {
if (x == v)    return -1;
return x<v ? 0:1;
}

void insert(int id) {
st.insert(id);
}

void erase(int id) {
st.erase(id);
}
} Node;

Node nd[maxn];

void newNode(int& r, int id, int v) {
if (top) {
r = S[--top];
} else {
r = ++tot;
}
nd[r].setId(v, id);
}

void maintain(int r) {
nd[r].s = nd[nd[r].ch[0]].s + nd[nd[r].ch[1]].s + nd[r].c;
}

void Rotate(int& r, int d) {
int k = nd[r].ch[d^1];
nd[r].ch[d^1] = nd[k].ch[d];
nd[k].ch[d] = r;
maintain(r);
maintain(k);
r = k;
}

void Insert(int& r, int id, int v) {
if (r == 0) {
newNode(r, id, v);
return ;
} else {
int d = nd[r].cmp(v);
if (d == -1) {
++nd[r].c;
++nd[r].s;
nd[r].insert(id);
return ;
}
Insert(nd[r].ch[d], id, v);
if (nd[nd[r].ch[d]].r > nd[r].r)
Rotate(r, d^1);
}
maintain(r);
}

void Remove(int& r, int id, int v) {
int d = nd[r].cmp(v);

if (d == -1) {
if (nd[r].c > 1) {
--nd[r].c;
--nd[r].s;
nd[r].erase(id);
return ;
}

if (nd[r].ch[0] && nd[r].ch[1]) {
int d2 = nd[nd[r].ch[0]].r > nd[nd[r].ch[1]].r ? 1:0;
Rotate(r, d2);
Remove(nd[r].ch[d2], id, v);
} else {
S[top++] = r;
r = nd[r].ch[1] + nd[r].ch[0];
}
} else {
Remove(nd[r].ch[d], id, v);
}

if (r)
maintain(r);
}

void init() {
nd[0].ch[0] = nd[0].ch[1] = nd[0].s = nd[0].v = nd[0].c = 0;
memset(pen, 0, sizeof(pen));
memset(mark, false, sizeof(mark));
memset(lst, -1, sizeof(lst));
memset(lstac, -1, sizeof(lstac));
memset(T, 0, sizeof(T));
top = tot = root = 0;
}

int Rank(int r, int v) {
int d = nd[r].cmp(v);
int sz = nd[nd[r].ch[0]].s;

if (d == -1)
return sz+1;
else if (d == 0)
return Rank(nd[r].ch[0], v);
else
return sz+nd[r].c+Rank(nd[r].ch[1], v);
}

int kth(int r, int k) {
if (r==0 || k<=0 || k>nd[r].s)    return -1;
int sz = nd[nd[r].ch[0]].s;

if (k <= sz) {
return kth(nd[r].ch[0], k);
} else if (k <= sz+nd[r].c) {
if (k == sz+1) {
return *nd[r].st.begin();
} else {
return -1;
}
} else {
return kth(nd[r].ch[1], k-sz-nd[r].c);
}

}

int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif

int n, m;
int ino;
int t, k, tno, res, pid;
int ans;

while (scanf("%d %d", &n, &m)!=EOF) {
init();
ino = 0;
rep(i, 0, n) {
Insert(root, i, 0);
}
while (1) {
scanf("%s %s", cmd, line);
++ino;
if (cmd[0] == 'C')
break;
if (cmd[0] == 'T') {
int len = strlen(line);
int i = 0;

k = 0;
while (i < len) {
k = 10 * k + line[i]-'0';
++i;
}
ans = kth(root, k);
printf("%d\n", ans);
} else if (cmd[0] == 'R') {
int len = strlen(line);
int i = 0;

tno = 0;
while (i < len) {
tno = 10 * tno + line[i]-'0';
++i;
}
t = T[tno];
ans = Rank(root, t);
printf("%d\n", ans);
} else if (cmd[0] == 'S') {
int len = strlen(line);
int i = 0;

t = 0;
while (i<len && line[i]!=':') {
t = 10 * t + line[i]-'0';
++i;
}

tno = 0;
++i;
while (i<len && line[i]!=':') {
tno = 10 * tno + line[i]-'0';
++i;
}

++i;
pid = line[i++] - 'A';

res = 0;
++i;
while (i < len) {
res = 10 * res + line[i]-'0';
++i;
}

if (mark[tno][pid])
continue;
if (lst[tno]>=0 && t-lst[tno]<5)
continue;
if (res != 1) {
pen[tno][pid] += 20;
lst[tno] = t;
continue;
}
printf("[%d][%c]\n", tno, pid+'A');
Remove(root, tno, T[tno]);
T[tno] += pen[tno][pid];
T[tno] += t;
mark[tno][pid] = true;
T[tno] -= BigInt;
lst[tno] = t;
lstac[tno] = ino;
Insert(root, tno, T[tno]);
}
}
putchar('\n');
}

#ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: