原题传送门

这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法

实际线段树+树状数组的做法也很暴力

我们先用树状数组维护每个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]甲苯先生的滚榜的更多相关文章

  1. luogu P5338 [TJOI2019]甲苯先生的滚榜

    传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个 ...

  2. 洛谷P5338 [TJOI2019]甲苯先生的滚榜

    原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...

  3. [TJOI2019]甲苯先生的滚榜——非旋转treap

    题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. ...

  4. BZOJ5509: [Tjoi2019]甲苯先生的滚榜

    题解 开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可. 其实挺好写的...就是评测的时候评的巨久... #include <bits/stdc++.h> using n ...

  5. 【题解】Luogu P5337 [TJOI2019]甲苯先生的字符串

    原题传送门 我们设计一个\(26*26\)的矩阵\(A\)表示\(a~z\)和\(a~z\)是否能够相邻,这个矩阵珂以由\(s1\)得出.答案显然是矩阵\(A^{len_{s2}-1}\)的所有元素之 ...

  6. 【题解】Luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串

    原题传送门 实际按照题意模拟就行 我们先求出字符串的sa 因为要在字符串中出现k次,所以我们枚举\(l,r(r-l+1=k)\)看一共有多少种合法的方案 合法方案的长度下界\(lb\)为\(Max(h ...

  7. 【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树

    原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左 ...

  8. LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap

    问题描述 LG5338 LOJ3105 BZOJ5509 题解 建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\) 原来的比较\(val_a<va ...

  9. luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串

    传送门 考虑子串以及出现个数,可以发现SAM可以快速知道每种子串的出现次数,即所在状态的\(endpos\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案 ...

随机推荐

  1. eclipse debug调试 class文件 Source not found.

      1.情景展示 明明有class文件,为什么提示没有? 2.原因分析 这是eclipse与myeclipse的不同之处,myeclipse会自动加载运行时所需的的class文件,而eclipse则需 ...

  2. 划水嘶吼misc

    划水嘶吼misc [题目描述]: 开局一张图,flag全靠编 [题目writeup]: 瞅半天,瞅到二维码 然后用potplayer按帧查找到skr二维码 通过PS自动调整对比度,扫出key1,2,3 ...

  3. AttributeError: 'Model' object has no attribute 'name'

    Traceback (most recent call last): File "<ipython-input-15-7fa9988e38ef>", line 1, i ...

  4. [技术博客] SPRINGBOOT自定义注解

    SPRINGBOOT自定义注解 在springboot中,有各种各样的注解,这些注解能够简化我们的配置,提高开发效率.一般来说,springboot提供的注解已经佷丰富了,但如果我们想针对某个特定情景 ...

  5. Spring中为什么继承了ApplicationContextAware接口就可以使用ApplicationContext对象?

    1.Spring中使用applicationContext对象 public class SpringContextUtil implements ApplicationContextAware { ...

  6. Unity2D音游案例-节奏大师教程+源码+素材

    Unity2D音游案例-节奏大师(Unity2017.2 ,基于Koreographer),本案例涉及到一些音乐音频音波的一点点内容. 首先,我们会把音游的核心功能实现,之后几个重要内容会出给思路并带 ...

  7. Ubuntu 安装最新版 (1.12) Golang 并使用 go mod

    wget https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz sudo tar -zxvf go1.12.4.linux-amd64.tar.gz ...

  8. Vue 与 动态组件 import 的尝试

    <template> <component :is='fuck' :data='data'></component> </template> <s ...

  9. 015 vue的项目

    一:搭建项目 1.框架 在原有的基础上 src: 2.index.html <!DOCTYPE html> <html lang="en"> <hea ...

  10. Qt编写控件属性设计器

    一.前言 自从研究Qt编写自定义控件以来,一发不可收拾,越多越多人有类似的需求找我定制控件,陆陆续续写了上百个控件,目前已超过150个,于是逐渐衍生了另外一个需求,提供一个控件属性设计器,类似QtDe ...