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 = ;
const int BigInt = 1e7;
int S[maxn], top, tot, root;
int lst[maxn], lstac[maxn];
bool mark[maxn][];
int pen[maxn][];
int T[maxn];
char cmd[], line[]; typedef struct fcmp {
bool operator() (const int& a, const int& b) {
if (lstac[a]==- && lstac[b]==-)
return a<b;
if (lstac[a]!=- && lstac[b]!=-)
return lstac[a]<lstac[b];
else if (lst[a] == -)
return false;
else
return true;
}
} fcmp; typedef struct Node {
int ch[];
int r, s, v, c;
set<int, fcmp> st; Node() {} void setId(int v_, int id) {
v = v_;
st.clr();
st.insert(id);
ch[] = ch[] = ;
r = rand();
s = c = ;
} int cmp(int x) const {
if (x == v) return -;
return x<v ? :;
} 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[]].s + nd[nd[r].ch[]].s + nd[r].c;
} void Rotate(int& r, int d) {
int k = nd[r].ch[d^];
nd[r].ch[d^] = 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 == ) {
newNode(r, id, v);
return ;
} else {
int d = nd[r].cmp(v);
if (d == -) {
++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^);
}
maintain(r);
} void Remove(int& r, int id, int v) {
int d = nd[r].cmp(v); if (d == -) {
if (nd[r].c > ) {
--nd[r].c;
--nd[r].s;
nd[r].erase(id);
return ;
} if (nd[r].ch[] && nd[r].ch[]) {
int d2 = nd[nd[r].ch[]].r > nd[nd[r].ch[]].r ? :;
Rotate(r, d2);
Remove(nd[r].ch[d2], id, v);
} else {
S[top++] = r;
r = nd[r].ch[] + nd[r].ch[];
}
} else {
Remove(nd[r].ch[d], id, v);
} if (r)
maintain(r);
} void init() {
nd[].ch[] = nd[].ch[] = nd[].s = nd[].v = nd[].c = ;
memset(pen, , sizeof(pen));
memset(mark, false, sizeof(mark));
memset(lst, -, sizeof(lst));
memset(lstac, -, sizeof(lstac));
memset(T, , sizeof(T));
top = tot = root = ;
} int Rank(int r, int v) {
int d = nd[r].cmp(v);
int sz = nd[nd[r].ch[]].s; if (d == -)
return sz+;
else if (d == )
return Rank(nd[r].ch[], v);
else
return sz+nd[r].c+Rank(nd[r].ch[], v);
} int kth(int r, int k) {
if (r== || k<= || k>nd[r].s) return -;
int sz = nd[nd[r].ch[]].s; if (k <= sz) {
return kth(nd[r].ch[], k);
} else if (k <= sz+nd[r].c) {
if (k == sz+) {
return *nd[r].st.begin();
} else {
return -;
}
} else {
return kth(nd[r].ch[], 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 = ;
rep(i, , n) {
Insert(root, i, );
}
while () {
scanf("%s %s", cmd, line);
++ino;
if (cmd[] == 'C')
break;
if (cmd[] == 'T') {
int len = strlen(line);
int i = ; k = ;
while (i < len) {
k = * k + line[i]-'';
++i;
}
ans = kth(root, k);
printf("%d\n", ans);
} else if (cmd[] == 'R') {
int len = strlen(line);
int i = ; tno = ;
while (i < len) {
tno = * tno + line[i]-'';
++i;
}
t = T[tno];
ans = Rank(root, t);
printf("%d\n", ans);
} else if (cmd[] == 'S') {
int len = strlen(line);
int i = ; t = ;
while (i<len && line[i]!=':') {
t = * t + line[i]-'';
++i;
} tno = ;
++i;
while (i<len && line[i]!=':') {
tno = * tno + line[i]-'';
++i;
} ++i;
pid = line[i++] - 'A'; res = ;
++i;
while (i < len) {
res = * res + line[i]-'';
++i;
} if (mark[tno][pid])
continue;
if (lst[tno]>= && t-lst[tno]<)
continue;
if (res != ) {
pen[tno][pid] += ;
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 ;
}

【HDOJ】5096 ACM Rank的更多相关文章

  1. 【线性代数】3-3:秩(Rank)

    title: [线性代数]3-3:秩(Rank) categories: Mathematic Linear Algebra keywords: Rank Row Reduced form Pivot ...

  2. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Friends and Enemies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  3. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  5. 【机器学习】Learning to Rank入门小结 + 漫谈

    Learning to Rank入门小结 + 漫谈 Learning to Rank入门小结 Table of Contents 1 前言 2 LTR流程 3 训练数据的获取4 特征抽取 3.1 人工 ...

  6. 【HDOJ】1811 Rank of Tetris

    并查集+拓扑排序.使用并查集解决a = b的情况. #include <iostream> #include <cstdio> #include <cstring> ...

  7. 【HDOJ】5131 Song Jiang's rank list

    STL的使用. /* 5131 */ #include <iostream> #include <map> #include <cstdio> #include & ...

  8. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  9. 【HDOJ】4601 Letter Tree

    挺有意思的一道题,思路肯定是将图转化为Trie树,这样可以求得字典序.然后,按照trie的层次求解.一直wa的原因在于将树转化为线性数据结构时要从原树遍历,从trie遍历就会wa.不同结点可能映射为t ...

随机推荐

  1. Android 讯飞语音之语音合成(在线有声朗读)

    原文:http://www.cnblogs.com/scetopcsa/p/3845427.html 在线语音合成的使用方法: 首先下载相关的sdk,这个网址里有多种版本,我选择的Android. h ...

  2. Js~数组的操作push,pop,shift,unshift

    说几个概念: 队列:先进先出堆栈:先进后出 shift:从集合中把第一个元素删除,返回这个元素的值pop:从集合中把最后一个元素删除,返回这个元素的值 unshift:在集合开头添加一个或者多个元素, ...

  3. pageContext.request.contextPath

    jsp:<c:set var="ctxStatic" value="${pageContext.request.contextPath}"/>嵌套d ...

  4. 堆排序算法(C#实现)

    在软件设计相关领域,“堆(Heap)”的概念主要涉及到两个方面: 一种是数据结构,逻辑上是一颗完全二叉树,存储上是一个数组对象(二叉堆). 另一种是垃圾收集存储区,是软件系统可以编程的内存区域. 本文 ...

  5. struts2的单文件下载

    一. 导入两个jar包 commons-fileupload-1.3.1.jar commons-io-2.4.jar 二.编写请求上传jsp <h1>文件列表--单文件</h1&g ...

  6. java_UML:继承/泛化、实现、依赖、关联、聚合、组合的联系与区别 (2016-07-12)

    分别介绍这几种关系: UML关系:继承(泛化).实现.依赖.关联.聚合.组合的联系与区别 一.表示符号上的区别 二.具体区别与联系 1. 继承/泛化(Generalization) [泛化关系]:是一 ...

  7. Linux的IO调度

    Linux的IO调度 IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系可以分为七层 ...

  8. 菜鸟的MySQL学习笔记(四)

    MySQL中的运算符和函数: 1.字符函数: 2.数值运算符与函数: 3.比较运算符与函数: 4.日期时间函数: 5.信息函数: 6.聚合函数: 7.加密函数等:   6-1.字符函数: CONCAT ...

  9. gitlab ActionView::Template::Error (undefined method `[]' for nil:NilClass): 500错误

    Started GET "/mygroup/myproject/tree/master/MyDirectory" for 127.0.0.1 at 2014-10-22 22:42 ...

  10. 常用命令ls cd cp mv touch mkdir pwd rm cut sort tr more less

    ls  -ldhtai 显示目录下面的文件 ls -l 显示详细信息 ls -d 显示当前目录 ls -t 以时间先后顺序显示 ls -a 列出所有文件包括隐藏文件 ls -i 显示文件的inode号 ...