LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap
问题描述
题解
建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\)
原来的比较\(val_a<val_b\)改成(设两个结点分别为\(node_a,node_b\)):
1.若\(ac_a>ac_b\),则\(node_a<node_b\)
2.若\(1\)不成立,若\(ac_a=ac_b,tim_a<tim_b\),则\(node_a<node_b\)
3.若\(1,2\)均不成立,则\(node_a>node_b\)
10s时限简直要卡爆评测机
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
template<typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') fh=-1,ch=getchar();
else fh=1;
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=fh;
}
const int INF=0x3f3f3f3f;
const int maxm=1000000+7;
int n,T,root;
unsigned seed,las=7,m;
typedef unsigned int ui;
ui randNum(ui& seed, ui last, ui m) {
seed = seed * 17 + last;
return seed % m + 1;
}
int dat[maxm],size[maxm],cnt[maxm],ac[maxm],tim[maxm];
int ch[maxm][2],tot;
int nowac[maxm*10],nowtim[maxm*10];
void pushup(int x){
size[x]=size[ch[x][0]]+size[ch[x][1]]+cnt[x];
}
int New(int a,int b){
dat[++tot]=rand(),size[tot]=cnt[tot]=1,ac[tot]=a,tim[tot]=b;
return tot;
}
void build(){
tot=0;
root=New(INF,-INF);ch[root][1]=New(-INF,INF);
pushup(root);
}
void rotate(int &id,int dir){
int tmp=ch[id][dir xor 1];
ch[id][dir xor 1]=ch[tmp][dir];
ch[tmp][dir]=id;id=tmp;
pushup(ch[id][dir]);pushup(id);
}
void insert(int &id,int a,int b){
if(!id){
id=New(a,b);return;
}
if(a==ac[id]&&b==tim[id]) cnt[id]++;
else{
int d;
if(a>ac[id]) d=0;
else if(a==ac[id]){
if(b<tim[id]) d=0;
else d=1;
}
else d=1;
insert(ch[id][d],a,b);
if(dat[id]<dat[ch[id][d]]) rotate(id,d xor 1);
}
pushup(id);
}
void remove(int &id,int a,int b){
if(!id) return;
if(ac[id]==a&&tim[id]==b){
if(cnt[id]>1){
cnt[id]--;pushup(id);return;
}
if(ch[id][0]||ch[id][1]){
if(!ch[id][1]||dat[ch[id][0]]>dat[ch[id][1]]){
rotate(id,1);remove(ch[id][1],a,b);
}
else{
rotate(id,0);remove(ch[id][0],a,b);
}
pushup(id);
}
else id=0;
return;
}
if(a>ac[id]){
remove(ch[id][0],a,b);
}
else if(a==ac[id]){
if(b<tim[id]) remove(ch[id][0],a,b);
else remove(ch[id][1],a,b);
}
else remove(ch[id][1],a,b);
pushup(id);
}
int get_rank(int id,int a,int b){
if(!id) return 0;
if(a==ac[id]&&b==tim[id]) return size[ch[id][0]]+1;
if(a>ac[id]) return get_rank(ch[id][0],a,b);
else if(a==ac[id]&&b<tim[id]) return get_rank(ch[id][0],a,b);
return size[ch[id][0]]+cnt[id]+get_rank(ch[id][1],a,b);
}
int TTTT;
int main(){
srand(28910);read(TTTT);
while(TTTT--){
build();memset(ch,0,sizeof(ch));
memset(nowac,0,sizeof(nowac));memset(nowtim,0,sizeof(nowtim));
read(m);read(n);read(seed);
for(int i=1;i<=n;i++){
int x,y;
x=randNum(seed,las,m),y=randNum(seed,las,m);
remove(root,nowac[x],nowtim[x]);
nowac[x]++,nowtim[x]+=y;
// insert(root,nowac[x],nowtim[y]);
insert(root,nowac[x],nowtim[x]);//错误笔记:弄错x,y
// las=get_rank(root,nowac[x],nowtim[y])-2;
las=get_rank(root,nowac[x],nowtim[x])-2;//错误笔记:弄错x,y
printf("%d\n",las);
}
}
return 0;
}
LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap的更多相关文章
- 「TJOI2019」甲苯先生的滚榜
题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC ...
- 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树
LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...
- LOJ#3104「TJOI2019」甲苯先生的字符串
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...
- LG5337/BZOJ5508 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速
问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_ ...
- [TJOI2019]甲苯先生的滚榜——非旋转treap
题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. ...
- 洛谷P5338 [TJOI2019]甲苯先生的滚榜
原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...
- BZOJ5509: [Tjoi2019]甲苯先生的滚榜
题解 开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可. 其实挺好写的...就是评测的时候评的巨久... #include <bits/stdc++.h> using n ...
- 「TJOI2019」大中锋的游乐场
题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...
- 「TJOI2019」唱、跳、rap 和篮球
题目链接 题目分析 据说这是一道生成函数题 看到限制条件,我们首先想到的就是对有多少组讨论cxk的人进行容斥.然后就是求剩下的人随便放有多少种方法了.考虑现在每种剩\(a,b,c,d\)人,还需要排\ ...
随机推荐
- vue.js操作元素属性
vue动态操作div的class 看代码: <!doctype html> <html lang="en"> <head> <meta c ...
- 正睿暑期培训day1考试
链接 A 理解一下题意,然后玩几组样例就能发现,实际上就是\(k\)个\(i\)等价于\(1\)个\(i-1\).所以就类似于\(k\)进制进行进位,如果最后\(0\)位上不是\(0\),那么就存在划 ...
- Kubernetes生产架构浅谈
注意 本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计介绍. 介绍 基于 Kubernetes 系统构建的统一开发运维管控平台.在 Kubernetes 基础上,围绕 微服务系统的 ...
- sierpinski垫片(3D)[误]
今天是因为可以用py而高兴的一天. 昨天老板淡淡地回了一句,sierpinski地毯画得挺好的. 我思考了五秒钟之后,想起来作业其实是sierpinski垫片. 三角垫片比地毯难做多了. 因为 ...
- jQuery 源码分析(一) 代码结构
jQuery是一个Javascript库,它支持链式操作方式,即对发生在同一个JQuery对象上的一组动作,可以直接接连写无需要重复获取对象.这一特点使得JQuery的代码无比优雅,而且有强大的选择器 ...
- element-ui的tabs默认选中页签
Element-UI提供了tabs组件(选项卡.多页签),其中在tabs的属性中提供了一个value/v-model属性来绑定默认选中的页签. 我们通过简单的示例来看一下具体是怎么使用的. <t ...
- SkyWalking分布式链路追踪和监控-项目实战
微服务框架落地后,分布式部署架构带来的问题就会迅速凸显出来.服务之间的相互调用过程中,如果业务出现错误或者异常,如何快速定位问题?如何跟踪业务调用链路?如何分析解决业务瓶颈?本专栏将引入Skywalk ...
- 记netmvc中Html.BeginForm的一个大坑
在asp.net mvc中,很常使用using(Html.BeginForm()){}来生成表单提交 不传入参数时,默认提交到原始url 最坑的是,此表单自动提交时,会将所在页面的原始url的参数也一 ...
- c++语法大全笔记(一)
目录 一:初级知识 c++是一种中级语言,是c的扩充,是一种面向对象的程序设计语言,可以运行到多个平台.这里直接讲语法. 基础c++模板: #include <iostream> ...
- 命令 docker rm | docker rmi | docker prune 的差异
区别: docker rm : 删除一个或多个 容器 docker rmi : 删除一个或多个 镜像 docker prune : 用来删除不再使用的 docker 对象 一.docker rm 命令 ...