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.操作格式为 ...
随机推荐
- 前段人员必藏的7 个 CSS 好用的属性绝对干货
学习CSS是构建好看网页的一种方式. 但是,在学习过程中,我们倾向于(大部分时间)限制自己,一遍又一遍地使用相同的属性. 毕竟,我们是一种习惯性的动物,我们会使用自己习惯且熟悉的东西. 因此,在这篇文 ...
- Log4j的使用说明
Log4j基本使用方法 Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定 ...
- (二)LVS介绍
LVS分3种模式 (a)NAT(网络地址映射):通过网络地址转换的方法来实现调度 优点:支持所有操作系统及私有网络,且只需一个公网 IP 地址 缺点:用户请求和响应报文都必须 ...
- java 和 c++ 的三目运算符的区别
转载请注明出处:http://www.cnblogs.com/liangyongrui/p/6348001.html 以前很少用java,就知道java和c++差不多. 今天就踩了一个坑. 不吐糟,直 ...
- django框架效率
1. django ORM模式提供食物处理类:transaction.Django默认的事务处理方式时改动就提交,每执行一次就立即提交,这就会花费大量的时间用于IO.Django也支持所有工作都完成后 ...
- Windows 最值得推荐的装机必备“神器”软件大合集
工欲善其事,必先利其器.每个人在平时使用电脑的过程中,多多少少都会积累一些好用的软件,我也不例外,从业这么多年,收藏了许多不错的软件,通过这篇文章都分享给大家.如果觉得不错,请把这篇文章分享给你的小伙 ...
- 使用Git GUI工具 上传本地仓库到 gitee码云仓库
前言: 网上关于git的命令操作与使用很多教程和博客,在使用git工具时我发现有一个 git Gui 可视化工具,我觉得十分的亲切,由于我之前一直是使用svn作为版本控制管理工具,都是可视化操作,使用 ...
- python面试题六: 剑指offer
面试题3 二维数组中的查找 LeetCode题目:二维数组中,每行从左到右递增,每列从上到下递增,给出一个数,判断它是否在数组中思路:从左下角或者右上角开始比较 def find_integer(ma ...
- 数据可视化之powerBI基础(十八)Power BI度量值的格式如何修改?这里有三种方式
https://zhuanlan.zhihu.com/p/99818030 在知识星球遇到的问题中,有不少朋友问如何修改数值型度量值的格式,比如,新建的度量值如何显示为百分比或者千分位等等,这篇文章 ...
- 06 flask源码剖析之路由加载
06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...