【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 ...
随机推荐
- Asp.Net静态资源动态压缩之WebOptimization
一.Asp.Net中对Css/Js的动态压缩工具 WebOptimization 在Asp.NetMVC自带的模板项目中自动引入了当前WebOptimization工具.如果使用的空模板Nuget命令 ...
- 20160405javaweb之jdbc
一.数据库驱动的概念.JDBC 数据库厂商提供的用来操作数据库用的jar包就是数据库驱动.各个厂商如果提供各自的数据库驱动的话会导致开发人员学习成本太高,所以sun公司提供了一套数据库驱动应该遵循的接 ...
- com.android.builder.packaging.DuplicateFile
解决方法: packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' ...
- 启动 XPs 代理
Xps代理:扩展了 1 : 运行sp_configure检查代理XPs 的 值. EXEC SP_CONFIGURE 'agent xps'查看run_value 值是否为0,如果为0:需要更改此设置 ...
- springmvc中url-pattern的大坑
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springfr ...
- 将Cell中的视图取出传递到根视图
当我们点击Cell中的某个图片时,图片会有一种从Cell中取出,放大,然后再回到原来的Cell中的效果.我的想法是:当Cell中的图片用button 来显示.当我们点击Cell中的这个button的时 ...
- 每天一条linux命令——shutdown
shutdown命令用来系统关机命令.shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作. 语法: shutdown(选项)(参数) 选项: -c:当执行“shutdown ...
- C语言库函数--操作文件
//C库函数读取文件的代码 I/O缓冲机制 C语言库函数写文件都是写在内存中,然后一次写入磁盘.提高了效率. 读写文件,不对系统进行操作,一般采用C语言库函数.移植可以在任何可以对C支持的操作系统,而 ...
- absolute之整体布局实现
要实现如图的布局,我最先想到是将header与footer绝对定位,但是发现在移动端会出现bug,经查资料发现用absolute实现整体布局非常好,还挺简单的. .header, .footer, . ...
- mysql添加超级管理员
mysql>create user 'myroot'@'localhost' identified by 'myroot'; mysql>grant all privileges on * ...