HDU - 5096 ACM Rank (Treap)
平衡树的题,Treap破之,比较难搞的出现相同题数罚时的情况,解决方法是在每个结点用一个set,
保证结点值的时候可以把题数和罚时保存到一个int里,令v = n*MaxPenaltySum-penalty。这样就可以很方便地做比较了。
初始化有一定技巧。细节很多容易出错。 写静态版,如果有合并操作要内存池开到最大结点数量的两倍,内存多随意
写错一个变量名字查好久,尴尬
hdu似乎不资磁PB_ds这种黑科技
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std; #define PB push_back
#define MP make_pair
#define fi first
#define se second #define cer(x) cout<<#x<<'='<<endl
typedef long long ll; const int maxn = 1e4+, MAXPEN = 1e6;//60*20+3000+666; int st[maxn], val[maxn], pen[maxn][],lst[maxn],lsa[maxn]; struct CMP
{
bool operator()(int a,int b) const{
return lsa[a] < lsa[b];
}
}; struct Node
{
int ch[],r,s,v;
set<int,CMP> vs;
}nds[maxn*];
queue<int> fre; inline int newNode(int x)
{
int i;
Node &u = nds[i = fre.front()]; fre.pop();
u.ch[] = u.ch[] = ;
u.r = rand(); u.s = ; u.v = val[x];
u.vs.clear(); u.vs.insert(x);
return i;
} inline void delt(int x)
{
fre.push(x);
} inline int cmp(int a,int b)
{
if(a == b) return -;
return a>b? :;
} inline void mt(int i)
{
Node&u = nds[i];
u.s = (int)u.vs.size() + nds[u.ch[]].s + nds[u.ch[]].s;
} inline void rot(int &o,int d)
{
int k = nds[o].ch[d^];
nds[o].ch[d^] = nds[k].ch[d];
nds[k].ch[d] = o;
mt(o); mt(k);
o = k;
} inline void initTreap(int n)
{
for(int i = ; i < n; i++) fre.push(i);
nds[].s = ;
} void inst(int &o,int x)
{
if(!o) {
o = newNode(x); return;
}
Node &u = nds[o];
int d = cmp(u.v,val[x]);
if(~d){
inst(u.ch[d],x);
if(u.r < nds[u.ch[d]].r) rot(o,d^);
//else
}else {
u.s++; u.vs.insert(x);
}
mt(o);
} void rmov(int &o,int x)
{
Node &u = nds[o];
int d = cmp(u.v,val[x]);
if(~d){
rmov(u.ch[d],x);
}else {
if((int)u.vs.size() > ){
u.vs.erase(x); u.s--;
}else {
if(u.ch[] && u.ch[]){
int d2 = nds[u.ch[]].r > nds[u.ch[]].r ? :;
rot(o,d2); rmov(nds[o].ch[d2],x);
}else {
delt(o);
if(!u.ch[]) o = u.ch[];
else o = u.ch[];
}
}
}
if(o) mt(o);
} int Rank(int o,int x)
{
Node &u = nds[o];
int d = cmp(u.v,val[x]);
if(d == ) return Rank(u.ch[],x);
int s = nds[u.ch[]].s;
if(d == ) return s+(int)u.vs.size()+Rank(u.ch[],x);
return s+;
} int Kth(int o,int k)
{
if(!o || k <= || k > nds[o].s) return -;//
Node &u = nds[o];
int s = nds[u.ch[]].s;
if(k == s+) return *(u.vs.begin());
if(k <= s) return Kth(u.ch[],k);
return Kth(u.ch[],k-s-(int)u.vs.size());
} void rmvTree(int o)
{
if(nds[o].ch[]) rmvTree(nds[o].ch[]);
if(nds[o].ch[]) rmvTree(nds[o].ch[]);
delt(o);
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("data.txt","r",stdin);
#endif
int N,M;
char op[];
initTreap(maxn*);
int root = ;
while(~scanf("%d%d",&N,&M)){
if(root) rmvTree(root);
root = ;
fill(st,st+N,);
fill(val,val+N,);
fill(lst,lst+N,-);
memset(pen,,sizeof(pen));
for(int i = ; i < N; i++){
lsa[i] = -N+i;
inst(root,i);
}
int c = ;
while(~scanf("%s",op)&&*op != 'C'){
if(*op == 'S'){
int t,x,re; char pro; scanf("%d:%d:%c:%d",&t,&x,&pro,&re);
int p = pro-'A';
if(t - lst[x] < || (st[x]&(<<p))) continue;
lst[x] = t;
if(re == ){
printf("[%d][%c]\n",x,pro);
rmov(root,x);
lsa[x] = ++c;
st[x] |= <<p;
val[x] += MAXPEN-pen[x][p]-t;
inst(root,x);
}else pen[x][p] += ;
}else if(*op == 'R'){
int x; scanf("%d",&x);
printf("%d\n",Rank(root,x));
}else if(*op == 'T'){
int k; scanf("%d",&k);
printf("%d\n",Kth(root,k));
}
}
scanf("%s",op);
puts("");
}
return ;
}
HDU - 5096 ACM Rank (Treap)的更多相关文章
- hdu 1540 Tunnel Warfare(Treap)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 思路:三种操作: D摧毁一个点 R重建最晚被修改的那个点 Q询问点x联通的点有多少个 逆向思维,D操 ...
- HDU 5097 Page Rank (模拟)
题目背景是以前用来对网页进行排名的Page Rank算法,是早期Google的革命性发明. 背后的原理是矩阵和图论.这个数学模型是由Google的创始人拉里·佩奇和谢尔盖·布林发现的. 如果一个网页被 ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 1176 免费馅饼 (动态规划)
HDU 1176 免费馅饼 (动态规划) Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼 ...
- 2021.12.07 P4291 [HAOI2008]排名系统(Treap)
2021.12.07 P4291 [HAOI2008]排名系统(Treap) https://www.luogu.com.cn/problem/P4291 双倍经验: https://www.luog ...
- HDU 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...
随机推荐
- Spring入门第八课
看如下代码 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- UNPIVOT逆透视以及动态逆透视存储过程
前几天一直练习PIVOT透视,还实现了动态透视的存过程<动态透视表>https://www.cnblogs.com/insus/p/10888277.html 今天练习MS SQL Ser ...
- Lightoj1059【最小生成树】
题意: 使得所有的位置都能通向一个机场,问最小花费. 思路: 最小生成树. 本来还想标记一下没有出现过的点,其实那个数组已经解决了.==. PS:注意路比建造机场还贵?直接造机场得了? if ther ...
- HDU 3410【单调栈】
思路: 单调栈. 鄙人的记忆:按当前为最大值的两边延伸就是维护单调递减栈. //#include <bits/stdc++.h> #include <iostream> #in ...
- linux命令之ll按时间和大小排序显示
ll不是命令,是ls -l的别名 按大小排序 [root@localhost ~]# ll -Sh 按时间排序 [root@localhost ~]# ll -rt ll -t 是降序, ll -t ...
- 洛谷 P5162 WD与积木【多项式求逆】
设f[i]为i个积木能堆出来的种类,g[i]为i个积木能堆出来的种类和 \[ f[n]=\sum_{i=1}^{n}C_{n}^{i}g[n-i] \] \[ g[n]=\sum_{i=1}^{n}C ...
- HDU 6003 Problem Buyer【小根堆】
任意k个都可以,也可以看做把不行的都选了,再随便选一个可以的要选的数量 把区间和m个值都排序,区间按l一序r二序排,枚举m个值,小根堆维护能帮韩当前枚举值的区间的右端点,这样方便删除区间,然后剩下的就 ...
- uoj#278. 【UTR #2】题目排列顺序(拓扑排序)
传送门 对于每一个位置\(i\)来说,上一个和它的\(f_i\)相同的点一定比它大,我们从上一个\(f_i\)和它相同的点向它连边.第一个\(f_i-1\)出现的位置一定比它小,把它向那个位置连边. ...
- iOS风格的弹出框(alert,prompt,confirm)
前两天,自己写了一个简单的插件,在移动端使用,不管是安卓手机还是iOS系统的手机,弹出框统一使用iOS风格的. 该弹出框是依赖于jQuery的,当然也可以将用jq写的几句代码转换为原生代码. 今天把代 ...
- css布局知识点汇总
昨天早上看到了一篇很棒的文章,这篇文章将布局的一些知识点整理的很不错.我也想整理一下,这样在以后的项目中可以活学活用,避免只用一种方式. 参考文章:https://segmentfault.com/a ...