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. SQL SERVER HTTP请求

    --开启Sql Server 通讯配置-- sp_configure ; GO RECONFIGURE WITH OVERRIDE; GO sp_configure ; GO RECONFIGURE ...

  2. MyEclipse常见配置及调试

    常见配置 1.配置workspace ----- 建议不要采用含有空格和中文目录 所有代码保存workspace空间中2.新建工程时,设置工程需要jre环境MyEclipse提供多种内置layout ...

  3. Android----二维码开发

    Android----二维码开发 本文为原创,转载请注明出处:http://www.cnblogs.com/xiaobaicai12138/p/5644244.html 一.工具 谷歌的zxing 不 ...

  4. Golang在视频直播平台的高性能实践

    http://toutiao.com/i6256894054273909249/ 熊猫 TV 是一家视频直播平台,先介绍下我们系统运行的环境,下面这 6 大服务只是我们几十个服务中的一部分,由于并发量 ...

  5. Java编程风格与命名规范整理

    基本命名规范 包命名 包名按照域名的范围从大到小逐步列出,恰好和Internet上的域名命名规则相反. 由一组以“.”连接的标识符构成,通常第一个标识符为符合网络域名的两个或者三个英文小写字母. Pe ...

  6. Visual C++ 打印编程技术-编程基础-获取打印机

    标准方法是用: EnumPrinters() 函数获取 #define PRINTER_ENUM_DEFAULT 0x00000001 #define PRINTER_ENUM_LOCAL 0x000 ...

  7. iOS app提交审核 11.13条款问题

    今年开年到现在.提交app应用一直招拒,这个问题我想不明白,感觉就是一个坑.所以贴出来给大家看看. 发件人 Apple11.13 - Apps that link to external mechan ...

  8. ASP.NET跨页面传值技巧

      1 使用QueryString变量    QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用  ...

  9. C# Unix时间戳转换为时间

    在做一些接口的时候,比如返回数据中有一个时间的属性,它的值是使用Unix时间戳表示的,当我们处理它(保存到本地或者格式化前台展示)时需要转换成日期时间,在此就需要根据时间戳转换为日期时间 (注:Uni ...

  10. Java 的自动装箱拆箱

    Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...