【题解】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\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案 ...
随机推荐
- 《Elasticsearch实战》读书笔记
遗留问题: 1._source字段和field字段的区别 2.q和search的区别(查询请求中) 3.输入关键字的大小写,参考prefix查询,match_phrase_prefix查询(4.4.2 ...
- 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小
P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...
- nginx之fastcgi配置参数及其缓存
CGI的由来 最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动 ...
- ubuntu之路——day17.3 简单的CNN和CNN的常用结构池化层
来看上图的简单CNN: 从39x39x3的原始图像 不填充且步长为1的情况下经过3x3的10个filter卷积后 得到了 37x37x10的数据 不填充且步长为2的情况下经过5x5的20个filter ...
- 三个面向对象相关的装饰器@property@staticmathod@classmethod
@property 先看实例: from math import pi class Circle: def __init__(self,r): self.r = r @property def per ...
- vs code搭建python和tensorflow环境
anaconda 安装tensorflow-gpu环境见https://www.cnblogs.com/wintersoft/p/11620267.html vscode中设置python虚拟环境Ct ...
- SpringBoot——配置文件占位符
在配置文件中采用: ${random.int} 获取一个随机值.
- C++生成随机数(随机整数/浮点数)方法
来源:https://blog.csdn.net/u014571489/article/details/82258467 产生一定范围随机数的通用表示公式要取得[a,b)的随机整数,使用(rand() ...
- 《自然语言理解(Natural Language Understanding)》(2016-03-17)阅读笔记
原文链接:https://yq.aliyun.com/articles/8301 作者:李永彬 发布时间:2016-03-17 16:37:47 自然语言理解(Natural Language Und ...
- Incorrect string value: '\xF0\x9F\x98\xAD",...' for column 'commentContent' at row 1
我分为下面三个步骤来解决: (1):修改mysql数据库的编码为uft8mb4 (2):修改数据表的编码为utf8mb4 (3):修改连接数据库的连接代码 更改数据库编码:ALTER DATABASE ...