[TJOI2019]甲苯先生的滚榜——非旋转treap
题目链接:
要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可。
因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作。
记录每个人的二维权值,只维护被操作过的人权值的平衡树即可。
如果一开始将$10^6$个人都建出来会$TLE$。
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef unsigned int ui;
int ls[100010];
int rs[100010];
int r[100010];
int v[100010];
int t[100010];
int size[100010];
int cnt;
int m,T;
ui seed;
int x,y;
int a,b,c;
ui last=7;
ui n;
int ac[1000010];
int tim[1000010];
int root;
ui randNum(ui& seed,ui last,const ui m)
{
seed=seed*17+last;
return seed%m+1;
}
inline void init()
{
cnt=root=0;
memset(ac,0,sizeof(ac));
memset(tim,0,sizeof(tim));
}
inline int build(int val)
{
int rt=++cnt;
r[rt]=rand();
v[rt]=1;
t[rt]=val;
size[rt]=1;
ls[rt]=rs[rt]=0;
return rt;
}
inline void pushup(int rt)
{
size[rt]=size[ls[rt]]+size[rs[rt]]+1;
}
inline int merge(int x,int y)
{
if(!x||!y)
{
return x+y;
}
if(r[x]<r[y])
{
rs[x]=merge(rs[x],y);
pushup(x);
return x;
}
else
{
ls[y]=merge(x,ls[y]);
pushup(y);
return y;
}
}
inline void split(int rt,int &x,int &y,int ac,int tim)
{
if(!rt)
{
x=y=0;
return ;
}
if(v[rt]<ac||(v[rt]==ac&&t[rt]>=tim))
{
y=rt;
split(ls[rt],x,ls[y],ac,tim);
pushup(y);
}
else
{
x=rt;
split(rs[rt],rs[x],y,ac,tim);
pushup(x);
}
}
inline void split2(int rt,int &x,int &y,int k)
{
if(!rt)
{
x=y=0;
return ;
}
if(size[ls[rt]]>=k)
{
y=rt;
split2(ls[rt],x,ls[y],k);
pushup(y);
}
else
{
x=rt;
split2(rs[rt],rs[x],y,k-size[ls[rt]]-1);
pushup(x);
}
}
inline void solve()
{
scanf("%u%d%u",&n,&m,&seed);
for(int i=1;i<=m;i++)
{
x=randNum(seed,last,n);
y=randNum(seed,last,n);
if(!ac[x])
{
ac[x]++;
tim[x]+=y;
int now=build(tim[x]);
split(root,a,b,ac[x],tim[x]);
root=merge(a,merge(now,b));
}
else
{
split(root,a,b,ac[x],tim[x]);
split2(b,b,c,1);
v[b]++;
t[b]+=y;
root=merge(a,c);
split(root,a,c,v[b],t[b]);
root=merge(merge(a,b),c);
ac[x]++;
tim[x]+=y;
}
split(root,a,b,ac[x],tim[x]);
last=size[a];
printf("%d\n",last);
root=merge(a,b);
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
init();
solve();
}
}
[TJOI2019]甲苯先生的滚榜——非旋转treap的更多相关文章
- 洛谷P5338 [TJOI2019]甲苯先生的滚榜
原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...
- BZOJ5509: [Tjoi2019]甲苯先生的滚榜
题解 开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可. 其实挺好写的...就是评测的时候评的巨久... #include <bits/stdc++.h> using n ...
- 【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜
原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在 ...
- luogu P5338 [TJOI2019]甲苯先生的滚榜
传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个 ...
- [bzoj3173]最长上升子序列_非旋转Treap
最长上升子序列 bzoj-3173 题目大意:有1-n,n个数,第i次操作是将i加入到原有序列中制定的位置,后查询当前序列中最长上升子序列长度. 注释:1<=n<=10,000,开始序列为 ...
- 关于非旋转treap的学习
非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...
- [Codeforces702F]T-Shirts——非旋转treap+贪心
题目链接: Codeforces702F 题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限.现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买 ...
- BZOJ5063旅游——非旋转treap
题目描述 小奇成功打开了大科学家的电脑. 大科学家打算前往n处景点旅游,他用一个序列来维护它们之间的顺序.初 始时,序列为1,2,...,n. 接着,大科学家进行m次操作来打乱顺序.每次操作有6步: ...
- BZOJ3223文艺平衡树——非旋转treap
此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
随机推荐
- C#ModBus Tcp的学习及Master的实现
Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式. 所以这也是我们工控领域软件开发的所必懂的通讯协议,我也是初次学习,先贴上我的学习笔记 一 ...
- X5内核浏览器video自动全屏解决办法-canvas
最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用c ...
- 安卓开发之cache 的使用(图片查看器案例)
package com.lidaochen.test; import android.graphics.Bitmap; import android.graphics.BitmapFactory; i ...
- dao 接口定义了一个方法,报错 The method xxx is undefined for the type xxx;
转自:https://blog.csdn.net/panshoujia/article/details/78203837 持久层(DAO层)下的一个接口 ,eclipse报了一个The method ...
- string 数组转 int 数组
用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //字符串数组(源数组) string[] sNums = new[] {"1", "2" ...
- docker 推送镜像到阿里云
1. 登录阿里云Docker Registry $ sudo docker login --username=www.18860363800@hotmail.com registry.cn-beiji ...
- 运行 jcontrol 报 libXext.so.6: cannot open shared object file 错误
需要安装额外库: yum install libXext.x86_64 yum install libXrender.x86_64 yum install libXtst.x86_64
- Visual Studio(Year)编辑器调试在IIS发布的Web程序出现错误的解决
如下图所示:
- SpringBoot之多数据源动态切换数据源
原文:https://www.jianshu.com/p/cac4759b2684 实现 1.建库建表 首先,我们在本地新建三个数据库名分别为master,slave1,slave2,我们的目前就是写 ...
- 剑指Offer(三十):连续子数组的最大和
.# 剑指Offer(三十):连续子数组的最大和 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...