【HDOJ】5096 ACM Rank
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的更多相关文章
- 【线性代数】3-3:秩(Rank)
title: [线性代数]3-3:秩(Rank) categories: Mathematic Linear Algebra keywords: Rank Row Reduced form Pivot ...
- 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 ...
- 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 ...
- 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 ...
- 【机器学习】Learning to Rank入门小结 + 漫谈
Learning to Rank入门小结 + 漫谈 Learning to Rank入门小结 Table of Contents 1 前言 2 LTR流程 3 训练数据的获取4 特征抽取 3.1 人工 ...
- 【HDOJ】1811 Rank of Tetris
并查集+拓扑排序.使用并查集解决a = b的情况. #include <iostream> #include <cstdio> #include <cstring> ...
- 【HDOJ】5131 Song Jiang's rank list
STL的使用. /* 5131 */ #include <iostream> #include <map> #include <cstdio> #include & ...
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】4601 Letter Tree
挺有意思的一道题,思路肯定是将图转化为Trie树,这样可以求得字典序.然后,按照trie的层次求解.一直wa的原因在于将树转化为线性数据结构时要从原树遍历,从trie遍历就会wa.不同结点可能映射为t ...
随机推荐
- ElastciSearch常用APi
列出所有的索引: GET /_cat/indices?v 删除索引 DELETE /customer?pretty
- 2.redis.3.2 下载,安装、配置、使用 - 2
上篇简单介绍了 下载,安装,测试,现在直接使用了,看结果 使用的redis服务便是,上篇临时搭建的简易服务,,注意,说的是简易,因为它只是一个单点的“玩具”: 临时在项目登录的时候模拟了一下,这里使用 ...
- swing容器继承重绘问题解决
swing容器继承重绘问题解决 以JPanel为例,继承JPanel,想动态为器更换背景,这就涉及到重绘问题.一下是本人重写代码: package ui; import java.awt.Grap ...
- 【制作镜像】BCEC制作镜像
如要制作的新镜像已存在标准版本镜像,即linux发行版本相同(此处指CentOS6.5 64位),可利用BCEC制作. 在BCEC创建centos6.5系统的可联外网的虚机,ssh到此虚机,用yum方 ...
- 2016.08.06计算几何总结测试day1
T1 bzoj1132[POI2008]TRO 还是太弱了....测试时看到这题直接懵逼,极角排序什么的根本想不起来,只会n^3暴力怎么破......不过竟然有84.....QAQ 正解是n^2log ...
- 通过telnet使用smtp协议发送邮件
smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...
- NPOI2.0
今天在使用NPOI2.0读取上传excel文件(excel2010)时,报了一个很奇怪的错误:无效的 URI: 未能分析主机名. 在网上查找了下找到的出错情况跟这个完全不着边际,没有办法只有自己去测试 ...
- yii2 ActiveRecord常用用法
User::find()->all(); 返回所有数据 User::findOne($id); 返回 主键 id=1 的一条数据 User::find()->where ...
- setTimeout和setInterval的深入理解
以前写的setTimeout和setInterval的文章有些不足之处,今天抽时间整理了一下,要想真正理解还得从javascript的单线程机制说起 大概半年前发表过一篇关于setTimeout和se ...
- Laravel 5.1 事件、事件监听的简单应用
有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作 ...