【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; }
相关文章推荐
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
- 赫夫曼树和赫夫曼编码
- 用最基础方法让用户输入随机数字.顺序打印出输入的每个数字.并计算各个数字之和
- Android基础入门教程——8.3.7 Paint API之—— Xfermode与PorterDuff详解(四)
- 进制转换16-8-2-10和查表法
- KMP算法------串的模式匹配(Java)
- 使用Buildozer部署时,出现AttributeError: 'NoneType' object has no attribute 'group'错误的解决
- Algorithm --> 十大排序算法
- 参数pdf
- 采用艾恩asp上传的角本
- HTTP和FTP的区别
- Javascript在网页关闭或重新载入时会摧毁所有变量,但cookie会改变这种情况,会保存变量
- 10.20作业
- 据客户端(浏览器中的网页body部分)的大小来动态的调整客户端内显示图像的大小,防止因浏览器的不同导致看见的图片不同
- 10.15作业
- java输入输出流
- 【最大子矩阵和】poj 1050 To the Max
- 自动化测试
- 在android中使用HTTPClient以post方法发送二进制文件
- 定时任务知多少(三)——任务调度的集群方案