问题描述

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\)均不成立,则\(node_a>node_b\)

10s时限简直要卡爆评测机


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; template<typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') fh=-1,ch=getchar();
else fh=1;
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=fh;
} const int INF=0x3f3f3f3f;
const int maxm=1000000+7; int n,T,root; unsigned seed,las=7,m; typedef unsigned int ui;
ui randNum(ui& seed, ui last, ui m) {
seed = seed * 17 + last;
return seed % m + 1;
} int dat[maxm],size[maxm],cnt[maxm],ac[maxm],tim[maxm];
int ch[maxm][2],tot; int nowac[maxm*10],nowtim[maxm*10]; void pushup(int x){
size[x]=size[ch[x][0]]+size[ch[x][1]]+cnt[x];
} int New(int a,int b){
dat[++tot]=rand(),size[tot]=cnt[tot]=1,ac[tot]=a,tim[tot]=b;
return tot;
} void build(){
tot=0;
root=New(INF,-INF);ch[root][1]=New(-INF,INF);
pushup(root);
} void rotate(int &id,int dir){
int tmp=ch[id][dir xor 1];
ch[id][dir xor 1]=ch[tmp][dir];
ch[tmp][dir]=id;id=tmp;
pushup(ch[id][dir]);pushup(id);
} void insert(int &id,int a,int b){
if(!id){
id=New(a,b);return;
}
if(a==ac[id]&&b==tim[id]) cnt[id]++;
else{
int d;
if(a>ac[id]) d=0;
else if(a==ac[id]){
if(b<tim[id]) d=0;
else d=1;
}
else d=1;
insert(ch[id][d],a,b);
if(dat[id]<dat[ch[id][d]]) rotate(id,d xor 1);
}
pushup(id);
} void remove(int &id,int a,int b){
if(!id) return;
if(ac[id]==a&&tim[id]==b){
if(cnt[id]>1){
cnt[id]--;pushup(id);return;
}
if(ch[id][0]||ch[id][1]){
if(!ch[id][1]||dat[ch[id][0]]>dat[ch[id][1]]){
rotate(id,1);remove(ch[id][1],a,b);
}
else{
rotate(id,0);remove(ch[id][0],a,b);
}
pushup(id);
}
else id=0;
return;
}
if(a>ac[id]){
remove(ch[id][0],a,b);
}
else if(a==ac[id]){
if(b<tim[id]) remove(ch[id][0],a,b);
else remove(ch[id][1],a,b);
}
else remove(ch[id][1],a,b);
pushup(id);
} int get_rank(int id,int a,int b){
if(!id) return 0;
if(a==ac[id]&&b==tim[id]) return size[ch[id][0]]+1;
if(a>ac[id]) return get_rank(ch[id][0],a,b);
else if(a==ac[id]&&b<tim[id]) return get_rank(ch[id][0],a,b);
return size[ch[id][0]]+cnt[id]+get_rank(ch[id][1],a,b);
} int TTTT; int main(){
srand(28910);read(TTTT);
while(TTTT--){
build();memset(ch,0,sizeof(ch));
memset(nowac,0,sizeof(nowac));memset(nowtim,0,sizeof(nowtim));
read(m);read(n);read(seed);
for(int i=1;i<=n;i++){
int x,y;
x=randNum(seed,las,m),y=randNum(seed,las,m);
remove(root,nowac[x],nowtim[x]);
nowac[x]++,nowtim[x]+=y;
// insert(root,nowac[x],nowtim[y]);
insert(root,nowac[x],nowtim[x]);//错误笔记:弄错x,y
// las=get_rank(root,nowac[x],nowtim[y])-2;
las=get_rank(root,nowac[x],nowtim[x])-2;//错误笔记:弄错x,y
printf("%d\n",las);
}
}
return 0;
}

LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap的更多相关文章

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

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

  2. 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树

    LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...

  3. LOJ#3104「TJOI2019」甲苯先生的字符串

    题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...

  4. LG5337/BZOJ5508 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速

    问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_ ...

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

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

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

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

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

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

  8. 「TJOI2019」大中锋的游乐场

    题目链接 问题分析 比较明显的最短路模型.需要堆优化的dij.建图的时候注意细节就好. 参考程序 #include <bits/stdc++.h> #define LL long long ...

  9. 「TJOI2019」唱、跳、rap 和篮球

    题目链接 题目分析 据说这是一道生成函数题 看到限制条件,我们首先想到的就是对有多少组讨论cxk的人进行容斥.然后就是求剩下的人随便放有多少种方法了.考虑现在每种剩\(a,b,c,d\)人,还需要排\ ...

随机推荐

  1. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)

    1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...

  2. FFT/NTT基础题总结

    在学各种数各种反演之前把以前做的$FFT$/$NTT$的题整理一遍 还请数论$dalao$口下留情 T1快速傅立叶之二 题目中要求求出 $c_k=\sum\limits_{i=k}^{n-1}a_i* ...

  3. 洛谷P4015 运输问题 网络流24题

    看了下SPFA题解,一个一个太麻烦了,另一个写的很不清楚,而且注释都变成了"????"不知道怎么过的,于是自己来一发SPFA算法. Part 1.题意 M 个仓库,卖给 N 个商店 ...

  4. java程序 cpu占用过高分析

    linux终端下用 top命令看到cpu占用超过100%.之所以超过100%.说明cpu是多核.默认top显示的是cpu加起来的使用率,运行top后按大键盘1看看,可以显示每个cpu的使用率,top里 ...

  5. 转:xcode项目打不开:incompatible project version问题

    这个是xcode版本对应不上,不一定要修改版本,我们修改记录版本的文件里面的版本号就行了. 低版本xcode打开高版本xcode项目或库工程的时候就会出现,打不开的问题 解决 1可以重建创建工程,将文 ...

  6. mybatis批量更新出现he error occurred while setting parameters

    当你更新一条时,不会发生问题,但是执行多条就出现了错误原因是mysql 配置jdbc:driver 应该添加&allowMultiQueries=trueurl:jdbc:mysql://lo ...

  7. 如何让 FFmpeg 支持异步并行转码、截图等等操作?

    直接贴代码了: ffmpegTest02.cs public partial class ffmpegTest02 : FormBase { private static readonly strin ...

  8. WPF TabItem设置Visibility隐藏Control内容

    源自MSDN问题. 思路很简答: TabControl因为只显示TabItem的选择项的control. 所以单独的设置tabitem的control或者使用control的触发器都是不起作用的. 只 ...

  9. Rust从入门到放弃(1)—— hello,world

    安装及环境配置 特点:安全,性能,并发 rust源配置 RLS安装 cargo rust管理工具,该工具可以愉快方便的管理rust工程 #!/bin/bash mkdir learn cd learn ...

  10. 一个人的公众号,我写了1w+

    大家好,我是Bypass,一个人一直保持着写博客的习惯,为此维护了一个技术公众号,致力于分享原创高质量干货,写的内容主要围绕:渗透测试.WAF绕过.代码审计.应急响应.企业安全. 一直以来,我把它当成 ...