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. .NET笔记系列:LAMBDA表达式常用写法

    这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select ...

  2. 实现输出h264直播流的rtmp服务器 flash直播服务器

    http://www.cnblogs.com/haibindev/archive/2012/04/16/2450989.html 实现输出h264直播流的rtmp服务器 RTMP(Real Time ...

  3. iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了

    今天开了一个小项目   用的是pod   然后  安装好 Afnetworking之后   发现 AFHTTPRequestOperationManager  这个类没有了  ,百度之后  发现 原来 ...

  4. asp.net:录入数据库的中文变问号

    表格是可以接受中文的: 类型也是nvarchar的: 还是出现写中文变问号?? 这时候请加入转义大写N: 如: 原查询语句:insert into table1(name)  values('蜘蛛侠' ...

  5. react native ios 开发,基础配置笔记。

    一.获取硬件信息,使用react-native-device-info插件,配置说明: 1.首先需要安装组件:npm install react-native-device-info --save 2 ...

  6. ServiceStack.Redis 破解

    在github上下载了ServiceStack.Redis,做测试发现有限制,居然从v4开始就收费,无聊时,做了个源码分析 废话不多,上测试代码 try { ; i < ; i++) { red ...

  7. javascript 基础2第12节

    1. <html> <head> <title>javascript基础</title> </head> <body> 1.Nu ...

  8. Windwos平台上ffmpeg解码音频并且保存到wav文件中

    先附上代码,测试通过 #include <stdio.h> #include <math.h> #include "libavutil/avstring.h" ...

  9. Library vector Type

    vector的定义 vector是C++标准库里最常用的容器,它之所以被称为容器,是因为它可以存放多个对象,所有在用一个容器中的对象都应该具有相同的类型. vector也是一个类模板,这也是它能存放多 ...

  10. stringstream vs sprintf, sscanf.

    前言 以前一直认为 stringstream 远不如 sprintf. 近日突然萌发了看看 stirngstream 是不是真的如我想的那么烂 对比 // stringstream. stringst ...