「TJOI2019」甲苯先生的滚榜】的更多相关文章

问题描述 LG5338 LOJ3105 BZOJ5509 题解 建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\) 原来的比较\(val_a<val_b\)改成(设两个结点分别为\(node_a,node_b\)): 1.若\(ac_a>ac_b\),则\(node_a<node_b\) 2.若\(1\)不成立,若\(ac_a=ac_b,tim_a<tim_b\),则\(node_a<node_b\) 3.若\(1,2\)均不成…
题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC optimize( 3 ) #include <cstdio> #include <ctime> #include <algorithm> namespace Treap { struct member { int Number, Time; bool operator…
LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + 1} - 3)x + t$,可以发现$t < (2^{l + 1} + 2^{r + 1} - 3)$,于是考虑计算对于$t$,左边走了$l$,右边走了深度$r$,几种走法使得总和为$t$ 容易发现右边最小一定是走了$2^ - 1$于是可以扣掉 再发现我们其实是对于左边和右边串选择长度为$[1,l…
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 \(\texttt{a-z}\). 现在小甲苯想要写下神的指示,记为字符串 \(s_2\),\(s_2\) 仅包含小写字母 \(\texttt{a-z}\),要求 \(s_1\) 中的相邻的两个字母不能在 \(s_2\) 中相邻地出现. 现在给定 \(s_2\) 的长度,小甲苯想知道他有多少种方法…
问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_{i,j}(i,j \in [1,26])\)代表\((i,j)\)能否前后相邻,如果为\(1\),则不能. 则有 \[opt_{i,j}=\sum_{k=1}^{26} opt_{i-1,k}(exist_{k,j}=0)\] 发现\(n \le 10^{15}\),就这样递推肯定不行,所以矩阵优…
题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. 记录每个人的二维权值,只维护被操作过的人权值的平衡树即可. 如果一开始将$10^6$个人都建出来会$TLE$. #include<set> #include<map> #include<queue> #include<cmath> #include<sta…
原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量不相等,则通过题目数量多的人排名更靠前,如果通过题目数量相等, 则罚时更少的人排名更高.甲苯先生想让大家帮忙设计一个程序,每次有人通过之后,就告诉他排名在他的前面有多少人.(不包括和他罚时题数都相同的同学) 输入输出格式 输入格式: 第一行输入一个整数T表示样例数. 对于每一个样例:输入三个整数m,…
题解 开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&am…
原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在这个队伍ac数多 我们再用\(n\)棵动态开点的线段树,第\(i\)棵线段树维护的是ac数为\(i\)的队伍的罚时情况.当一个队伍ac数为\(x\)罚时为\(t\)时,就在第\(x\)棵线段树\(t\)上加一.这样就能快速求出有多少队伍ac数与现在这个队伍ac数相同且罚时更少 当一个队伍过了一题后就…
传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个东西.AC数更多的人数显然可以直接上树状数组.后者的话可以对每一种AC数开值域线段树,存每个罚时有多少人,注意到罚时之和不会超过\(1.5*10^6\),所以动态开点线段树可以轻松解决.然后每次有个人AC数和罚时改变就先在原来的位置-1,然后在新位置+1.每次询问就是树状数组上AC数\(>\)当前A…