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.操作格式为 ...
随机推荐
- 用WebIDE(coding)编写c语言
本期教程有对应视频 首先注册登录coding,打开coding的Cloud Studio 创建一个新的工作环境 安装依赖命令build-essential sudo apt-get update su ...
- web单页应用是什么?它的好处与坏处有哪些(如何解决这些缺点)
web单页应用是什么? Web单页应用就是指只有一个Web页面作为入口的应用,在浏览器中运行期间不会重新加载页面.也就是说浏览器一开始会加载它必需的thml.css和Js,之后所有的交互操作都在一个页 ...
- js element类型的属性和方法整理
Element类型 除了Document类型,我们Web编程中最常用的类型就是Element类型啦.Element 类型用于表现XML或HTML元素,提供了对元素标签名,子节点,特性的访问 特征 no ...
- bootstrap悬停下拉菜单显示
使用Bootstrap导航条组件时,如果你的导航条带有下拉菜单,那么这个带下拉菜单的导航在点击时只会浮出下拉菜单,它本身的href属性会失效,也就是失去了超链接功能,这并不是我想要的,我希望导航条的链 ...
- 多线程01-CAS (CompareAndSwap)
1.基本概念 原子性是不可中断的最小操作:在Java中,一般通过加锁或者自旋CAS方式来确保原子操作: 而CAS(compareAnd swap)作为Java中常用的保证原子性的手段,JDK1.5之后 ...
- session + cookie 实现登录功能
前端部分代码实现 <div id="mainCp"> <div class="postForm"> <p> <labe ...
- scala 数据结构(四):列表 List
1 列表 List-创建List 基本介绍 Scala中的List 和Java List 不一样,在Java中List是一个接口,真正存放数据是ArrayList,而Scala的List可以直接存放数 ...
- java 数据结构(十一):Map接口
双列集合框架:Map1.常用实现类结构 |----Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x) * |----HashMap:作为Map的主要实现类:线程 ...
- 爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式
爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy ...
- Django之Model、Form、ModelForm区别
本节内容: 1:Model https://www.cnblogs.com/shuai1991/p/10844662.html 2:Form ...