原题传送门

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

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

我们先用树状数组维护每个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;
}

最新文章

  1. 利用免费的Spire.XLS控件制作Excel报表
  2. CentOS7— Redis安装(转和延续)
  3. NPOI 自定义单元格背景颜色-Excel
  4. 如何让WEBAPI 能够进行跨越访问
  5. golang 文件操作
  6. 为什么GOF的23种设计模式里面没有MVC?
  7. 富客户端 wpf, Winform 多线程更新UI控件
  8. python中的时间处理函数
  9. Oracle修改数据表
  10. 基于邻接矩阵的深度优先搜索(DFS)
  11. 应用程序无法正常启动0xc000007b
  12. Java Swing项目专栏之项目业务流程与业务逻辑
  13. 可能是CAP理论的最好解释
  14. 精通CSS+DIV网页样式与布局--制作实用菜单
  15. VUE项目安装
  16. struts设置开发者模式
  17. ZigBee相关网站链接
  18. Python导出MySQL数据库中表的建表语句到文件
  19. 解决input框黄色背景问题(转)
  20. OpenCV相机标定坐标系详解

热门文章

  1. windows内核代码之进程操作
  2. GPU和显卡是什么关系?GPU会取代CPU吗?
  3. Unity3D普通开发人员,U3D主程分别需要掌握的技能
  4. C++ std::map 屏蔽排序
  5. Ubuntu 上编译opencv_contrib模块for Android
  6. c++ Array运用实例
  7. SpringMVC request 得到文件路径
  8. js数组、对象处理
  9. 关于Spring Cloud的思考和总结
  10. SVM – 核函数