传送门

首先,排名系统,一看就知道是原题,可以上平衡树来维护

然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个东西.AC数更多的人数显然可以直接上树状数组.后者的话可以对每一种AC数开值域线段树,存每个罚时有多少人,注意到罚时之和不会超过\(1.5*10^6\),所以动态开点线段树可以轻松解决.然后每次有个人AC数和罚时改变就先在原来的位置-1,然后在新位置+1.每次询问就是树状数组上AC数\(>\)当前AC数的对应区间之和\(+\)对应线段树上罚时\(<\)当前罚时的区间之和

// luogu-judger-enable-o2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define ui unsigned intusing namespace std;
const int N=1e5+10,M=1e6+10,MX=1500000;
LL rd()
{LL x=0,w=1;char ch=0;while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
ui randNum(ui& seed ,ui last,const ui m)
{ seed=seed*17+last;return seed%m+1;
}
ui sd;
int m,n,a[N],b[N],c[M];
void ad(int x,int y){while(x<=n) c[x]+=y,x+=x&(-x);}
int gsm(int x){int an=0;while(x) an+=c[x],x-=x&(-x);return an;}
int s[M*25],ch[M*25][2],rt[M],tt;
void add(int o1,int o2,int x)
{int l=1,r=MX;s[o1]=s[o2]+1;while(l<r){int mid=(l+r)>>1;if(x<=mid){ch[o1][0]=++tt,ch[o1][1]=ch[o2][1];o1=ch[o1][0],o2=ch[o2][0];r=mid;}else{ch[o1][0]=ch[o2][0],ch[o1][1]=++tt;o1=ch[o1][1],o2=ch[o2][1];l=mid+1;}s[o1]=s[o2]+1;}
}
void dec(int o,int x)
{int l=1,r=MX;--s[o];while(l<r){int mid=(l+r)>>1;if(x<=mid) o=ch[o][0],r=mid;else o=ch[o][1],l=mid+1;--s[o];}
}
int quer(int o,int l,int r,int ll,int rr)
{if(ll>rr||!o) return 0;if(ll<=l&&r<=rr) return s[o];int an=0,mid=(l+r)>>1;if(ll<=mid) an+=quer(ch[o][0],l,mid,ll,rr);if(rr>mid) an+=quer(ch[o][1],mid+1,r,ll,rr);return an;
}int main()
{int T=rd(),ans=7;while(T--){m=rd(),n=rd(),sd=rd();for(int i=1;i<=n;++i) c[i]=rt[i]=0;for(int i=1;i<=m;++i) a[i]=b[i]=0;tt=0;for(int i=1;i<=n;++i){int x=randNum(sd,ans,m),y=randNum(sd,ans,m);if(a[x]) dec(rt[a[x]],b[x]),ad(a[x],-1);++a[x],b[x]+=y;int las=rt[a[x]];add(rt[a[x]]=++tt,las,b[x]),ad(a[x],1);ans=gsm(n)-gsm(a[x])+quer(rt[a[x]],1,MX,1,b[x]-1);printf("%d\n",ans);}}return 0;
}

转载于:https://www.cnblogs.com/smyjr/p/10841151.html

luogu P5338 [TJOI2019]甲苯先生的滚榜相关推荐

  1. 【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜

    原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在 ...

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

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

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

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

  4. ICPC-TOOLs resolver滚榜单工具使用指南

    0.引言: 上周突然临危受命,学校ACM社团要举办校内迎新赛,想要使用滚榜功能让揭晓结果变得更加刺激.奈何本人不打ACM,一开始连滚榜都不知道(苦笑.jpg),不过还是跌跌撞撞把功能实现了,介于网络上 ...

  5. ACM封榜滚榜技术记录(qduoj)

    封榜 在计划时间,关闭management里的contest管理的Real Time Rank和Status,实现封榜. 滚榜 项目开源 (本项目无后端,只有前端~) 1. 得到比赛提交数据 首先进入 ...

  6. P7519-[省选联考 2021 A/B 卷]滚榜【状压dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P7519 题目大意 nnn个队伍,队伍之间按照得分从小到大排名,得分相同的按照编号从小到大排.开始时每个队伍有个初始 ...

  7. 【洛谷 P5341】 [TJOI2019]甲苯先生和大中锋的字符串(后缀自动机)

    题目链接 建出\(sam\),求出parent tree上每个点的\(endpos\)集合大小. 如果等于\(k\),说明到达这个点的都可以.给\((len[fa(i)],len[i]]\)的\(cn ...

  8. 【状压DP】滚榜(P7519)

    正题 P7519 题目大意 n个队伍,排名先按分数排序再按编号排序,每个队伍有一个初始分数 aia_iai​,和一个附加分数 bib_ibi​ 对于一个合法的 bib_ibi​ 序列,按 bib_ib ...

  9. 2019各省省选试题选做

    2019各省省选试题选做 2019.05.09 把拖了几天的SDOI Day2更了.姑且算是完结撒花? 省份 Day1T1 Day1T2 Day1T3 Day2T1 Day2T2 Day2T3 ZJO ...

最新文章

  1. 插入排序算法(基于Java实现)
  2. python私人兼职_python能做什么副业#下班后有哪些兼职副业
  3. ubuntu14.04管理员密码忘记的解决方法
  4. 理解python并发编程_Python并发编程很简单
  5. android谷歌反地理,Android反向地理编码显示不出来!
  6. 4月14日,微软发布例行月度安全更新
  7. SVN版本管理系统的使用(CentOS+Subversion+Apache+Jsvnadmin+TortoiseSVN)
  8. java代码使用Get请求或者Post请求获取网络内容
  9. java外文文献_spring框架外文文献 PDF 下载
  10. obtain,get,gain有什么区别
  11. python sklearn逻辑回归 sgd和lr_LR逻辑回归模型的原理、公式推导、Python实现和应用...
  12. java的regex_java regex 简单使用
  13. sdau启航前端第一次作业
  14. MediaSession和MediaSessionService的交互流程梳理
  15. บาคาร่า ธุรกิจที่สร้างรายได้ดี
  16. 高性能服务器架构(High-performace Server Architecture)
  17. OpenNLP使用小结
  18. 好用的工具介绍之——免费pdf编辑及英文pdf翻译成中文
  19. SAP UI5 数据类型(data type) 学习笔记
  20. git merge --no-ff 和git merge --squash的区别

热门文章

  1. 流行的9个Java框架介绍:优点、缺点等等
  2. Using Sqoop 1.4.6 With Hadoop 2.7.4
  3. 一分钟了解阿里云产品:ESC五大热点技术问题分析
  4. hive内置函数详解
  5. hbase 学习(十五)缓存机制以及可以利用SSD作为存储的BucketCache
  6. Visio 与 Access 2007 的集成应用
  7. 解读中国杰出CFO之道
  8. python 表格格式输出_Python笔记---DAY3:格式化输出、for循环、列表操作
  9. Python机器学习:KNN算法08scikit-learn中的Scaler
  10. 怎么在linux终端上sed,Linux中如何使用sed命令