博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[洛谷P2584][ZJOI2006]GameZ游戏排名系统
阅读量:7094 次
发布时间:2019-06-28

本文共 2950 字,大约阅读时间需要 9 分钟。

题目大意:同(双倍经验)

解:

卡点:

 

C++ Code:

#include 
#include
#include
#define maxn 250010std::map
name;int n, namenum;struct node { int v, p; inline node(int __v = 0, int __p = 0) {v = __v, p = __p;} inline friend bool operator > (const node &lhs, const node &rhs) { if (lhs.v == rhs.v) return lhs.p < rhs.p; return lhs.v > rhs.v; } inline friend bool operator == (const node &lhs, const node &rhs) {return lhs.v == rhs.v && lhs.p == rhs.p;} inline friend bool operator >= (const node &lhs, const node &rhs) {return lhs > rhs || lhs == rhs;}};namespace Treap { int lc[maxn], rc[maxn], num[maxn], sz[maxn]; node val[maxn]; int root, idx; int ta, tb, tmp, res; int seed = 20040826; inline int rand() {return seed *= 48271;} inline int update(int rt) { sz[rt] = sz[lc[rt]] + sz[rc[rt]] + 1; return rt; } inline int nw(node x) { val[++idx] = x; num[idx] = rand(); sz[idx] = 1; return idx; } void split(int rt, node k, int &x, int &y) { if (!rt) x = y = 0; else { if (val[rt] >= k) split(rc[rt], k, rc[rt], y), x = update(rt); else split(lc[rt], k, x, lc[rt]), y = update(rt); } } void split(int rt, int k, int &x, int &y) { if (!rt) x = y = 0; else { if (sz[lc[rt]] < k) split(rc[rt], k - sz[lc[rt]] - 1, rc[rt], y), x = update(rt); else split(lc[rt], k, x, lc[rt]), y = update(rt); } } int merge(int x, int y) { if (!x || !y) return x | y; if (num[x] < num[y]) {rc[x] = merge(rc[x], y); return update(x);} else {lc[y] = merge(x, lc[y]); return update(y);} } inline int gtrnk(node x) { split(root, x, ta, tb); res = sz[ta]; root = merge(ta, tb); return res; } inline node gtkth(int k) { tmp = root; while (true) { if (sz[lc[tmp]] >= k) tmp = lc[tmp]; else { if (sz[lc[tmp]] + 1 == k) return val[tmp]; else k -= sz[lc[tmp]] + 1, tmp = rc[tmp]; } } } void insert(node x) { if (!root) root = nw(x); else { split(root, x, ta, tb); root = merge(merge(ta, nw(x)), tb); } } void erase(node x) { split(root, x, ta, tb); split(ta, sz[ta] - 1, ta, tmp); root = merge(ta, tb); }}int val[maxn];std::string retname[maxn];int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { char op; std::string s; std::cin >> op >> s; if (op == '+') { int x; std::cin >> x; if (name.count(s)) { int pos = name[s]; Treap::erase(node(val[pos], pos)); namenum--; } namenum++; name[s] = i; retname[i] = s; val[i] = x; Treap::insert(node(x, i)); } else if (isdigit(s[0])) { int pos = 0, posend; for (std::string::iterator it = s.begin(); it != s.end(); it++) pos = pos * 10 + (*it & 15); posend = std::min(pos + 9, namenum); for (int i = pos; i <= posend; i++) { std::cout << retname[Treap::gtkth(i).p]; putchar(i == posend ? '\n' : ' '); } } else { int pos = name[s]; std::cout << Treap::gtrnk(node(val[pos], pos)) << std::endl; } } return 0;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9866899.html

你可能感兴趣的文章
linux 批量修改文件名
查看>>
SQLserver 2008同步复制创建后新增表/函数/存储过程(不重新初始化快照)
查看>>
我们一起清除过的浮动
查看>>
python 实现(简单的一个购物商城小程序)
查看>>
bzoj4025 二分图
查看>>
文档加密、解密jar包
查看>>
Java 8 字符串日期排序
查看>>
了解Python
查看>>
Java遇见HTML——JSP篇之JSP基础语法
查看>>
a common method to rotate the image
查看>>
测试计划
查看>>
深拷贝与浅拷贝
查看>>
textarea禁止拖动 滚动条隐藏
查看>>
Java下利用Jackson进行JSON解析和序列化
查看>>
Js用正则表达式验证字符串
查看>>
大疆农业专家在线空开课直播课件知识
查看>>
怎样快速搜索自己所需的资料?(90%的人不会使用此方法)[转]
查看>>
POJ_2411_Mondriaan's Dream_状态压缩dp
查看>>
694. Number of Distinct Islands - Medium
查看>>
vue打包后出现的.map文件
查看>>