题解

开n个平衡树对每个AC数维护罚时,然后不同AC数用树状数组维护即可。

其实挺好写的...就是评测的时候评的巨久...

#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 1000010; int T, n, m, cnt[N], tim[N]; namespace Rand {
typedef unsigned int ui;
ui seed;
ui randNum(ui& seed, ui last, const ui m) {
seed = seed * 17 + last;
return seed % m + 1;
}
}
namespace fhqtreap {
int root[N], tot;
struct treap {int lc, rc, val, rnd, siz;} t[N<<2];
void clear() {memset(root, 0, sizeof(root)); tot = 0;}
void up(int rt) {t[rt].siz = t[t[rt].lc].siz + t[t[rt].rc].siz + 1;}
int build(int val) {
t[++tot] = (treap) {0, 0, val, rand()<<15|rand(), 1};
return tot;
}
void split(int rt, int &l, int &r, int c) {
if(!rt) l = r = 0;
else if(t[rt].val <= c) split(t[l = rt].rc, t[rt].rc, r, c), up(rt);
else split(t[r = rt].lc, l, t[rt].lc, c), up(rt);
}
void merge(int &rt, int l, int r) {
if(!l || !r) rt = l + r;
else if(t[l].rnd < t[r].rnd) rt = l, merge(t[rt].rc, t[rt].rc, r), up(rt);
else rt = r, merge(t[rt].lc, l, t[rt].lc), up(rt);
}
void insert(int id, int val) {
int x, y, z = build(val);
split(root[id], x, y, val);
merge(x, x, z); merge(root[id], x, y);
}
void Del(int id, int val) {
int x, y, z;
split(root[id], x, y, val);
split(x, x, z, val - 1);
merge(z, t[z].lc, t[z].rc);
merge(x, x, z); merge(root[id], x, y);
}
int rnk(int rt, int val) {
if(!rt) return 0;
if(t[rt].val >= val) return rnk(t[rt].lc, val);
return rnk(t[rt].rc, val) + t[t[rt].lc].siz + 1;
}
}
namespace BIT {
int c[N];
#define lowbit(i) (i & -i)
void clear() {memset(c, 0, sizeof(c));}
void add(int x, int v) {for(int i = x; i <= n; i += lowbit(i)) c[i] += v;}
int query(int x) {int ans = 0; for(int i = x; i; i -= lowbit(i)) ans += c[i]; return ans;}
} int main() {
int ans = 7; scanf("%d", &T); while(T--) {
fhqtreap::clear(); BIT::clear();
memset(cnt, 0, sizeof(cnt)); memset(tim, 0, sizeof(tim));
scanf("%d%d%u", &m, &n, &Rand::seed);
for(int i = 1; i <= n; ++i) {
int Ria = Rand::randNum(Rand::seed, ans, m);
int Rib = Rand::randNum(Rand::seed, ans, m);
if(cnt[Ria]) {
fhqtreap::Del(cnt[Ria], tim[Ria]);
BIT::add(cnt[Ria], -1);
}
tim[Ria] += Rib; ++cnt[Ria];
BIT::add(cnt[Ria], 1);
fhqtreap::insert(cnt[Ria], tim[Ria]);
ans = fhqtreap::rnk(fhqtreap::root[cnt[Ria]], tim[Ria]) + BIT::query(n) - BIT::query(cnt[Ria]);
printf("%d\n", ans);
}}
return 0;
}

BZOJ5509: [Tjoi2019]甲苯先生的滚榜的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 「TJOI2019」甲苯先生的滚榜

    题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC ...

  7. [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分

    题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...

  8. [TJOI2019]甲苯先生的字符串——矩阵乘法+递推

    题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...

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

    原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...

随机推荐

  1. 三个基于.net的浏览器内核使用的比较

    最近做模拟登陆发帖相关的项目 分别尝试了基于IE .NET自带的 webbrowser 和 基于WebKit 的WebKit.NET和openWebkitSharp 最开始肯定是用的.NET自带的we ...

  2. 四元数, Physx中的四元数

    四元数的概念 & 如何使用四元数:  绕V轴旋转 f 角,对应的四元数: q = ( cos(f/2), Vx*sin(f/2), Vy*sin(f/2), Vz*sin(f/2) ) = c ...

  3. | C语言I作业03

    | C语言I作业03 标签: 18软件 李煦亮 问题 答案 这个作业属于那个课程 C语言程序设计I 这个作业要求在哪里 https://edu.cnblogs.com 我在这个课程的目标是 学会和掌握 ...

  4. php中命名空间namespace和use

    对于面向对象编程而言,命名空间namespace和use的概念非常重要. 1.根命名空间是反斜线 \ ,有点类似linux中的根目录 / 的那种感觉,但使用var_dump()函数打印时其实是空字符串 ...

  5. SQL系列(十三)—— 关于表的DDL

    前面的文章一直都在讲述关于DML方面的SQL Statement.这篇文章来说说表方面的DDL: CREATE 创建表 ALTER 修改表 DROP 删除表 CREATE 1.语法 CREATE TA ...

  6. golang --rune

    rune 是int32的别名类型,专用于存储Unicode编码的单个字符 我们可以用5种方式来表示一个rune字面量: 该rune字面量所对应的字符,如'a'必须是Unicode编码规范所支持的 使用 ...

  7. SpringBoot中使用@scheduled定时执行任务需要注意的坑

    spring boot: 计划任务@ EnableScheduling和@Scheduled @Scheduled中的参数说明 @Scheduled(fixedRate=2000):上一次开始执行时间 ...

  8. RabbitMQ学习之Publish/Subscribe(3)

    上一个教程中,我们创建了一个work queue. 其中的每个task都会被精确的传送到一个worker. 这节,我们将会讲把一个message传送到多个consumers. 这种模式叫做publis ...

  9. IDEA连接MySQL数据库报错08001

    今天在使用IDEA时连接数据库发生错误,所以用其自带的尝试连接得到如下错误:Connection to test@127.0.0.1 failed.[08001] Could not create c ...

  10. tomcat端口修改后在Eclipse中启动无效问题解决

    原文:https://blog.csdn.net/yangyiqian/article/details/40262039 问题:在conf目录修改了server.xml配置中的节点  <Conn ...