luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树
LINK:方伯伯的OJ
一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的!
喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排名和编号 LOJ上写的是 用户在排名中的位置.
这说的不就是排名么.
至此四个操作 分别为 修改编号查排名 查排名修改排名为第一位 查排名修改排名到最后一位 查排名为k的编号.
splay的做法 大概是分裂splay和动态开点splay 很好都不会.
直接考虑线段树 因为可以注意到操作只有1e5个 而修改排名每次只不过把某个编号的排名放到前面或者后面 这个可以看成修改.
在前面和后面分别开1e5个位置即可.
考虑第一个操作 修改编号查排名 对于编号x 先查排名 我们需要知道的是 x在编号在线段树的位置.
这个可以利用map 但是我用的hash比map更舒服一点.然后线段树上直接查即可.
考虑修改 还是先把x的位置找到 然后进行修改什么的.
最后一个操作 线段树上二分 然后就能找到位置了 不过值得注意的是 要通过位置找编号 再来一个hash就做完了.
跑的飞快.hash果然比map香
code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007ll
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-4
#define sq sqrt
#define S second
#define F first
#define l(x) t[x].l
#define r(x) t[x].r
#define sum(p) t[p].sum
#define zz p<<1
#define yy p<<1|1
#define M 1000003
using namespace std;
char *fs,*ft,buf[1<<15];
inline char gc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
const int MAXN=100010;
int n,m,ans,id,rt;
int s1,s2,s3,s4;
struct wy
{
int l,r;
int sum;
}t[MAXN*100];
struct jl
{
int lin[M],ver[M],nex[M],v[M],len;
inline int find(int x)
{
int key=(ll)x*x%M;
go(key)if(ver[i]==x)return v[i];
return x+100000;
}
inline int find1(int x)
{
int key=(ll)x*x%M;
go(key)if(ver[i]==x)return v[i];
return x-100000;
}
inline void insert(int x,int y)
{
int key=(ll)x*x%M;
go(key)if(ver[i]==x){v[i]=y;return;}
ver[++len]=x;v[len]=y;nex[len]=lin[key];lin[key]=len;
}
}H,W;
inline void modify(int &p,int l,int r,int L,int R)
{
if(!p)p=++id;
if(l==r)return ++sum(p),void();
int mid=(l+r)>>1;
if(L<=mid)modify(l(p),l,mid,L,R);
if(R>mid)modify(r(p),mid+1,r,L,R);
sum(p)=sum(l(p))+sum(r(p));
}
inline int ask(int p,int l,int r,int L,int R)
{
if(!p)return 0;
if(L<=l&&R>=r)return sum(p);
int mid=(l+r)>>1;
if(R<=mid)return ask(l(p),l,mid,L,R);
if(L>mid)return ask(r(p),mid+1,r,L,R);
return ask(l(p),l,mid,L,R)+ask(r(p),mid+1,r,L,R);
}
inline void change(int &p,int l,int r,int x,int w)
{
if(!p)p=++id;
if(l==r)return sum(p)=w,void();
int mid=(l+r)>>1;
if(x<=mid)change(l(p),l,mid,x,w);
else change(r(p),mid+1,r,x,w);
sum(p)=sum(l(p))+sum(r(p));
}
inline int ask(int &p,int l,int r,int x)
{
if(!p)p=++id;
if(l==r)return l;
int mid=(l+r)>>1;
if(mid-l+1-sum(l(p))>=x)return ask(l(p),l,mid,x);
return ask(r(p),mid+1,r,x-(mid-l+1-sum(l(p))));
}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(m);
s1=1;s2=100000;
s3=n+100001;s4=n+200000;
modify(rt,1,s4,s1,s2);
modify(rt,1,s4,s3,s4);
rep(1,m,i)
{
int get(op),get(x)-ans;
if(op==1)
{
int get(y)-ans;
int ww=H.find(x);
H.insert(y,ww);
W.insert(ww,y);
put(ans=(ww-ask(rt,1,s4,1,ww)));
}
if(op==2)
{
int ww=H.find(x);
put(ans=(ww-ask(rt,1,s4,1,ww)));
change(rt,1,s4,ww,1);
change(rt,1,s4,s2,0);
W.insert(s2,x);
H.insert(x,s2);--s2;
}
if(op==3)
{
int ww=H.find(x);
put(ans=(ww-ask(rt,1,s4,1,ww)));
change(rt,1,s4,ww,1);
change(rt,1,s4,s3,0);
W.insert(s3,x);
H.insert(x,s3);++s3;
}
if(op==4)put(ans=W.find1(ask(rt,1,s4,x)));
}
return 0;
}
luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树的更多相关文章
- 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树
洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常
Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...
- 洛谷 P3285 - [SCOI2014]方伯伯的OJ(平衡树)
洛谷题面传送门 在酒店写的,刚了一整晚终于调出来了-- 首先考虑当 \(n\) 比较小(\(10^5\) 级别)的时候怎么解决,我们考虑将所有用户按排名为关键字建立二叉排序树,我们同时再用一个 map ...
- 洛谷 P3285 [SCOI2014]方伯伯的OJ
看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap
3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec Memory Limit: 256 MBSubmit: 102 Solved: 54[Submit][Status ...
- bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 314 Solved: 132[Submit][Sta ...
- 洛谷 P3285 / loj 2212 [SCOI2014] 方伯伯的 OJ 题解【平衡树】【线段树】
平衡树分裂钛好玩辣! 题目描述 方伯伯正在做他的 OJ.现在他在处理 OJ 上的用户排名问题. OJ 上注册了 \(n\) 个用户,编号为 \(1\sim n\),一开始他们按照编号排名.方伯伯会按照 ...
- [Scoi2014]方伯伯的OJ(动态开点splay)
开始没看数据范围差点以为是这题了:https://www.cnblogs.com/hfctf0210/p/10911340.html 然后看到n<=1e8,怎么这么大? 所以这题需要用动态开点线 ...
- [SCOI2014]方伯伯的OJ(线段树)
方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...
随机推荐
- SCOI 2009 围豆豆(状压DP)
SCOI 2009 围豆豆 题目描述 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧. 游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗 ...
- 使用@AutoConfigureBefore调整配置顺序竟没生效?
一个人的价值体现在能够帮助多少人.自己编码好,价值能得到很好的体现.若你做出来的东西能够帮助别人开发,大大减少开发的时间,那就功德无量. 作者:A哥(YourBatman) 公众号:BAT的乌托邦(I ...
- linux专题(八):用户组管理
http://dwz.date/UDf 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理.不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个 ...
- Quartz.Net系列(十二):六大Calendar(Annual、Cron、Daily、Holiday、Monthly、Weekly)
Quartz.Net中为了动态排除一些时间,而使用Calendar可以做到 1.DailyCalendar 可以动态的排除一天中的某些时间段 示例:在一天当中的13:00到14:00不要执行 publ ...
- mysql常见数据类型
#常见的数据类型 /* 数值型: 整型 小数: 定点数 浮点数 字符型: 较短的文本:char.varchar 较长的文本:text.blob(较长的二进制数据) 日期型: */ #一.整型 /* 分 ...
- 双网卡bonding
网卡:计算机与外界局域网的连接是通过主机箱内插入一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡).网络接口板又称为通信适配器或网络适配器(adapter)或网络接口卡NIC(Network ...
- Python 实现邮件发送功能(进阶)
上篇文章已经介绍了利用Python发送文本消息的用法,也在文末遗留了如何发送图片和附件的问题,本章主要来回答这两个问题. 本章主要包含知识点: 1. 如何将图片放到邮件主体中发送 2. 如何发送附 ...
- UC 网盘:我又回来了
普通用户不限速下载,免费 10GB 空间,支持离线下载 这个域名非常厉害,某里挑选域名果然是值得称赞的.直接使用手机号即可注册登录,默认赠送 10GB 空间.不过目前好像没看到有电脑客户端,电脑上下载 ...
- Maven原理学习
文章目录 一.Maven概述 二.maven依赖管理 三.maven文件结构 四.maven仓库的种类以及彼此联系 五.maven标准目录结构 六.mvn命令 七.maven生命周期 八.maven的 ...
- 04 . Filebeat简介原理及配置文件和一些案例
简介 Beats轻量型数据采集器 Beats 平台集合了多种单一用途数据采集器.它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据. Beats系列 全 ...