【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜
原题传送门
这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法
实际线段树+树状数组的做法也很暴力
我们先用树状数组维护每个ac数量有多少个队伍。这样就能快速求出有多少队伍ac数比现在这个队伍ac数多
我们再用\(n\)棵动态开点的线段树,第\(i\)棵线段树维护的是ac数为\(i\)的队伍的罚时情况。当一个队伍ac数为\(x\)罚时为\(t\)时,就在第\(x\)棵线段树\(t\)上加一。这样就能快速求出有多少队伍ac数与现在这个队伍ac数相同且罚时更少
当一个队伍过了一题后就在线段树和树状数组中正常修改即可
#include <bits/stdc++.h>
#define M 1000005
#define N 150005
#define ML 1500005
#define uint unsigned int
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
uint randNum(uint& seed,uint last,const uint mod)
{
seed=17*seed+last;
return seed%mod+1;
}
struct bit{
int tr[N];
inline void init()
{
memset(tr,0,sizeof(tr));
}
inline void update(register int pos,register int val)
{
for(register int i=pos;i<N;i+=i&(-i))
tr[i]+=val;
}
inline int query(register int pos)
{
int res=0;
for(register int i=pos;i;i-=i&(-i))
res+=tr[i];
return res;
}
}tr1;
struct segt{
struct node{
int ls,rs,sum;
}tr[M*40];
int tot,root[N];
inline void init()
{
memset(root,0,sizeof(root));
tot=0;
}
inline void update(register int &rt,register int l,register int r,register int pos,register int val)
{
if(!rt)
{
rt=++tot;
tr[rt].ls=tr[rt].rs=tr[rt].sum=0;
}
if(l==r)
{
tr[rt].sum+=val;
return;
}
int mid=l+r>>1;
if(pos<=mid)
update(tr[rt].ls,l,mid,pos,val);
else
update(tr[rt].rs,mid+1,r,pos,val);
tr[rt].sum=tr[tr[rt].ls].sum+tr[tr[rt].rs].sum;
}
inline int query(register int &rt,register int l,register int r,register int L,register int R)
{
if(!rt)
return 0;
if(L<=l&&r<=R)
return tr[rt].sum;
int mid=l+r>>1,res=0;
if(L<=mid)
res+=query(tr[rt].ls,l,mid,L,R);
if(R>mid)
res+=query(tr[rt].rs,mid+1,r,L,R);
return res;
}
}tr2;
uint seed,last;
int T,n,m,tim[N],num[N];
int main()
{
T=read();
last=7;
while(T--)
{
m=read(),n=read(),seed=read();
memset(num,0,sizeof(num));
memset(tim,0,sizeof(tim));
tr1.init(),tr2.init();
for(register int i=1;i<=m;++i)
num[i]=1,tim[i]=1;
tr1.update(1,m),tr2.update(tr2.root[1],1,ML,1,m);
for(register int i=1;i<=n;++i)
{
int p=randNum(seed,last,m),v=randNum(seed,last,m);
tr1.update(num[p],-1);
tr2.update(tr2.root[num[p]],1,ML,tim[p],-1);
++num[p],tim[p]+=v;
tr1.update(num[p],1);
tr2.update(tr2.root[num[p]],1,ML,tim[p],1);
int res=m-tr1.query(num[p]);
res+=tr2.query(tr2.root[num[p]],1,ML,1,tim[p]-1);
last=res;
write(res),puts("");
}
}
return 0;
}
【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜的更多相关文章
- luogu P5338 [TJOI2019]甲苯先生的滚榜
传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个 ...
- 洛谷P5338 [TJOI2019]甲苯先生的滚榜
原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...
- [TJOI2019]甲苯先生的滚榜——非旋转treap
题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. ...
- BZOJ5509: [Tjoi2019]甲苯先生的滚榜
题解 开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可. 其实挺好写的...就是评测的时候评的巨久... #include <bits/stdc++.h> using n ...
- 【题解】Luogu P5337 [TJOI2019]甲苯先生的字符串
原题传送门 我们设计一个\(26*26\)的矩阵\(A\)表示\(a~z\)和\(a~z\)是否能够相邻,这个矩阵珂以由\(s1\)得出.答案显然是矩阵\(A^{len_{s2}-1}\)的所有元素之 ...
- 【题解】Luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题传送门 实际按照题意模拟就行 我们先求出字符串的sa 因为要在字符串中出现k次,所以我们枚举\(l,r(r-l+1=k)\)看一共有多少种合法的方案 合法方案的长度下界\(lb\)为\(Max(h ...
- 【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树
原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左 ...
- LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap
问题描述 LG5338 LOJ3105 BZOJ5509 题解 建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\) 原来的比较\(val_a<va ...
- luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
传送门 考虑子串以及出现个数,可以发现SAM可以快速知道每种子串的出现次数,即所在状态的\(endpos\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案 ...
随机推荐
- mysql课外积累
where 与 on 的区别 : ON:针对关联表进行条件筛选,不会影响结果集的数量和主表数据. WHERE:针对结果集进行条件筛选,会影响结果集的数量. LIKE声明中的%和_是什么意思? --%对 ...
- 为arm-linux开发板挂载基于nfs的根文件系统
linux4.14内核,首先设置kernel的bootargs,在make menuconfig中有三种方式来配置: 第一种方式为如果uboot中设置了bootargs环境变量,就采用uboot的bo ...
- mac 安装注册Charles
软件去官网下载安装即可. 下载地址:https://www.charlesproxy.com/download/ 适用于Charles任意版本的注册码Charles 4.2.7 目前是最新版,可用. ...
- Mysql与Postgresql常用命令比较
PostgreSQL MySQL 服务启动:1)#service postgresql start2)#/etc/init.d/postgresql start3)#su – postgresql$p ...
- EventHandler
表示将处理不包含事件数据的事件的方法 作用:这句话的意思就是把这两个事放在一起了,意思就是叫你吃完饭了喊我一声.我委托你吃完饭了,喊我一声.这样我就不用过一会就来看一下你吃完了没有了,已经委托你了.
- MySQL事务隔离级别(二)
搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...
- C-Store: A Column-oriented DBMS Mike
这篇paper比较老,是列存比较基础的论文 几乎所有列存,或olap的论文都会引用这篇 行存面向写,支持OLTP 列存面向读,支持OLAP 基于磁盘的DBMS,瓶颈基本在磁盘IO,所有做的工作都是用多 ...
- Spring不能直接@autowired注入Static变量/ 关于SpringBoot的@Autowired 静态变量注入
昨天在编写JavaMail工具类的时候,静态方法调用静态变量,这是很正常的操作,当时也没多想,直接静态注入. @Component public class JavaMailUtil { @Autow ...
- 如何在本地使用scala或python运行Spark程序
如何在本地使用scala或python运行Spark程序 包含两个部分: 本地scala语言编写程序,并编译打包成jar,在本地运行. 本地使用python语言编写程序,直接调用spark的接口, ...
- revit 碰撞检测相关
Revit二次开发:由房间获取房间的墙 之前用的方法是由房间边界构成的Solid,计算与该Solid相交的Element,然后判断是否为墙.相对来说这个方法比较通用,可以检索出房间的楼板.窗户 ...