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 线段树的更多相关文章

  1. 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树

    洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...

  2. BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常

    Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...

  3. 洛谷 P3285 - [SCOI2014]方伯伯的OJ(平衡树)

    洛谷题面传送门 在酒店写的,刚了一整晚终于调出来了-- 首先考虑当 \(n\) 比较小(\(10^5\) 级别)的时候怎么解决,我们考虑将所有用户按排名为关键字建立二叉排序树,我们同时再用一个 map ...

  4. 洛谷 P3285 [SCOI2014]方伯伯的OJ

    看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...

  5. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

  6. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...

  7. 洛谷 P3285 / loj 2212 [SCOI2014] 方伯伯的 OJ 题解【平衡树】【线段树】

    平衡树分裂钛好玩辣! 题目描述 方伯伯正在做他的 OJ.现在他在处理 OJ 上的用户排名问题. OJ 上注册了 \(n\) 个用户,编号为 \(1\sim n\),一开始他们按照编号排名.方伯伯会按照 ...

  8. [Scoi2014]方伯伯的OJ(动态开点splay)

    开始没看数据范围差点以为是这题了:https://www.cnblogs.com/hfctf0210/p/10911340.html 然后看到n<=1e8,怎么这么大? 所以这题需要用动态开点线 ...

  9. [SCOI2014]方伯伯的OJ(线段树)

    方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...

随机推荐

  1. css3盒子模型中的box-sizing属性的使用_box sizing常用的3种属性

    box-sizing属性用来定义元素的width和height所表示的区域,该属性一般有三种值:content-box.border-box.inherit.其中inherit表示box-sizing ...

  2. 如何基于 echarts 实现区间柱状图(包括横向)?

    目录 需求 借鉴 echarts 的 demo 最终实现思路 实现效果 遇到的问题: 代码映射 源码 最后 始终如一 需求 需要利用 echarts 实现区间柱状图,效果如下: 效果来源于:g2-柱状 ...

  3. 数据库基础01-SQL基础语法

    数据库查询语言(Structured Query Language) 数据库查询语言: DDL(data definition language) -数据定义语言,建库建表 DML (data man ...

  4. 面试必杀技,讲一讲Spring中的循环依赖

    本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...

  5. Buy A Ticket(图论)

    Buy A Ticket 题目大意 每个点有一个点权,每个边有一个边权,求对于每个点u的\(min(2*d(u,v)+val[v])\)(v可以等于u) solution 想到了之前的虚点,方便统计终 ...

  6. 洛谷 P1640 SCOI2010 连续攻击游戏 并查集

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  7. day14总结

    装饰器 """1.什么是装饰器 器指的是工具/功能 装饰指的是为被装饰对象添加额外的功能 大白话:定义装饰器就是定义了一个函数,该函数就是用来为其他函数添加额外的功能的 ...

  8. day8 for循环+基本数据类型(上)

    目录 一 for循环 1 什么是for循环 2 为什么要有for循环 3 如何使用for循环 二 基本数据类型的内置方法 2 字符串 2.1 类型转化 2.2 内置方法(优先掌握) 2.2.1 按索引 ...

  9. sass-loader安装+Failed to resolve loader: sass-loader You may need to install it.解决方法

    方式一: 通过 cnpm 安装node-sass cnpm install node-sass --save 方式二: 通过npm 安装 1.安装sass-loader npm install sas ...

  10. Maven 专题(六):Maven核心概念详解(二)

    5 仓库 5.1 分类 [1]本地仓库:为当前本机电脑上的所有 Maven 工程服务.[2]远程仓库:        (1)私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务 ...