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.操作格式为 ...
随机推荐
- Django---进阶1
目录 静态文件配置 request对象方法初识 pycharm链接数据库(MySQL) django链接数据库(MySQL) Django ORM 字段的增删改查 数据的增删改查 今日作业 静态文件配 ...
- 三种存储方式DAS、NAS、SAN
------------恢复内容开始------------ 一.DAS.NAS.SAN在存储领域的位置 随着主机.磁盘.网络等技术的发展,数据存储的方式和架构也在一直不停改变,本文主要介绍目前主流的 ...
- Flutter 1.17 新 Material motion 规范的预构建动画
老孟导读:在 Flutter 1.17 发布大会上,Flutter 团队还发布了新的 Animations 软件包,该软件包提供了实现新的 Material motion 规范的预构建动画. 软件包 ...
- 我们现在的git版本管理
1.git发布正式版都统一用master分支的代码发布2.每次开发下一版本的需求时,将master分支的代码打一个tag,版本号与后台一致3.需要紧急修复线上的bug时,从master分支拉一个分支出 ...
- 北航2018级算法期末上机实录随笔1st
简单记录下题目类型和做题情况,理性复习同时也希望提供一些参考 题目描述 共计八个题目,按照助教的划分,题目分类如下 一个签到(二分查找),两个板子(活动选择.KMP(洛谷kmp模板题)),一个板子变形 ...
- CTF_show平台 web题解 part3
web13 题目显示文件上传,各类型上传均提示错误,在使用ctf-scan扫描的时候,发现upload.php.bak. 查看源码: <?php header("content-typ ...
- 05 drf源码剖析之认证
05 drf源码剖析之认证 目录 05 drf源码剖析之认证 1. 认证简述 2. 认证的使用 3. 源码剖析 4. 总结 1. 认证简述 当我们通过Web浏览器与API进行交互时,我们可以登录,然后 ...
- CSS定位布局
CSS定位布局 基础知识 在CSS布局中,定位布局也是一种非常常见的技术手段,我们以京东为例: 上面是非常好的例子,对于定位布局来说它可以将一个元素放在页面上的任意一个位置. 但是定位布局也不能滥用, ...
- 解决使用resin服务器Unsupported major.minor version 51.0错误
是因为jdk版本不对,更换成需要的版本
- 少儿编程:python趣味编程第一课
本文仅针对8-16岁的青少年,所以流程是按如何去教好中小学生走的,并不适合成人找工作学习,因为进度也是按照青少年走的 大家好,我是C大叔,从事少儿编程行业三年有余(2016年从事少儿编程行业,少儿编程 ...