noipd2t3列队
吉老师的题还真是难呢...
正解至今不会,只会平衡树的做法
这种用平衡树上一个点表示一段区间的题还真要做做...想起来挺难受的
建n棵平衡树表示每行的m-1个元素
再建一棵平衡树维护最后一列
中间要支持一个split操作,就是把[l,r]分成[l,x-1],x,[x+1,r]三部分,很好做
相比于bzoj上的诸多神题,这题细节不多,写起来轻松加愉快
这题要tmd动态开节点!!!一个点可以表示一段!!!查询的时候还不一定查到什么鬼地方!!!
还是Naive啊,noip前刚学完平衡树,考场上竟然不会做
这回也算是填了坑吧
Sylvia一点都不可爱
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#define ll long long
#include<queue>
using namespace std;
const int maxn=3e6+;
#define l(x) son[x][0]
#define r(x) son[x][1]
int Size;
int son[maxn][],fa[maxn];
ll size[maxn],lef[maxn],rig[maxn];
struct SplayTree
{
int rt;
inline void pushup(int id){size[id]=size[l(id)]+size[r(id)]++rig[id]-lef[id];}
inline void rotate(int x,int &k)
{
int y=fa[x],z=fa[y],L,R;
L=(r(y)==x);R=L^;
if(y==k)k=x;
else son[z][son[z][]==y]=x;
fa[son[x][R]]=y;fa[y]=x;fa[x]=z;
son[y][L]=son[x][R];son[x][R]=y;
pushup(y);pushup(x);
}
inline void Splay(int x,int &k)
{
while(x!=k)
{
int y=fa[x],z=fa[y];
if(y!=k)
{
if(son[y][]==x^son[z][]==y)rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
pushup(x);
}
inline int getpos()
{
int x=rt;
for(;son[x][];x=son[x][]);
return x;
}
inline int addnode(ll L,ll R)
{
lef[++Size]=L;rig[Size]=R;size[Size]=R-L+;
return Size;
}
inline void addval(ll v)
{
int now=addnode(v,v);
int pos=getpos();
son[pos][]=now;fa[now]=pos;
Splay(now,rt);
}
inline int getpre(int x)
{
int now=son[x][];
for(;son[now][];now=son[now][]);
return now;
}
inline int getnex(int x)
{
int now=son[x][];
for(;son[now][];now=son[now][]);
return now;
}
inline ll split(int now,ll k)
{
Splay(now,rt);
k=k+lef[now]-;
int tmp=addnode(k+,rig[now]);
rig[now]=k-;
if(!son[now][])
{
son[now][]=tmp;
fa[tmp]=now;
}
else
{
int pos=getnex(now);
son[pos][]=tmp;fa[tmp]=pos;
Splay(tmp,rt);
}
return k;
}
inline ll query(ll x)
{
int now=rt;ll len;
while()
{
if(x<=size[son[now][]])now=son[now][];
else
{
x-=size[son[now][]];
len=rig[now]-lef[now]+;
if(x<=len)
{
if(x==)
{
ll res=lef[now];
lef[now]++;
Splay(now,rt);
pushup(now);
return res;
}
if(x==len)
{
ll res=rig[now];
rig[now]--;
Splay(now,rt);
pushup(now);
return res;
}
else return split(now,x);
}
x=x-(rig[now]-lef[now]+);
now=son[now][];
}
}
}
inline void init(ll L,ll R){rt=addnode(L,R);}
}Phalanx[maxn];
ll n,m,q;
void DynaOpen()
{
for(int i=;i<=n;i++)Phalanx[i].init(m*(i-)+,i*m-);
Phalanx[].init(m,m);
for(int i=;i<=n;i++)Phalanx[].addval(i*m);
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&q);
DynaOpen();
int x,y;ll va;
while(q--)
{
scanf("%d%d",&x,&y);
if(y==m)
{
printf("%lld\n",va=Phalanx[].query(x));
Phalanx[].addval(va);
}
else
{
printf("%lld\n",va=Phalanx[x].query(y));
Phalanx[x].addval(Phalanx[].query(x));
Phalanx[].addval(va);
}
}
}
noipd2t3列队的更多相关文章
- 关于PHP堆栈与列队
在PHP中数组常被当作堆栈(后进先出:LIFO)与队列(先进先出:FIFO)结构来使用.PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素.堆栈与 ...
- 在PHP中如何使用消息列队
/** * 消息列队服务 * @author zhou.tingze * @example * -----------------------------------Create----------- ...
- BZOJ2720: [Violet 5]列队春游
2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 173 Solved: 125[Submit][Status] ...
- [NOIp 2017]列队
Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有$n \times m$名学生, ...
- NOIP2017D2T3 列队—Treap
NOIP2017列队 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m ...
- P2649 - 【NOIP2017】列队
Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m 名学生,方阵的行数为 ...
- WebForm应用log4net记录错误日志——使用线程列队写入
我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- [NOIP]2017列队——旋转treap/非旋转treap
Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为m. 为了便 ...
随机推荐
- ios 深入讲解iOS键盘一:控制键盘隐藏显示
在iOS的开发中,我们一般使用UITextField.UITextView处理文字输入等操作,大部分情况下我们只需要一两行代码去手动管理键盘的显示隐藏:让UITextField或UITextView成 ...
- Unity框架入门
介绍Unity框架之前,先要说几个概念DIP依赖倒置原则.IOC控制反转.DI依赖注入 DIP是设计原则之一,定义:上层不应该依赖于底层,两者都依赖于抽象: 抽象不依赖于细节,细节应该依赖于抽象. 像 ...
- 第一章 MATLAB数字图像处理编程基础
1 为什么用MATLAB MATLAB的图像处理工具箱(Image Processing Toolbox,IPT)封装了一系列不同图像处理需求的标准算法,它们都是通过直接或间接调用MATLAB中矩阵运 ...
- ArcGIS API for js InfoWindow
说明:有关该示例中怎么引用部署在iis上的离线arcgis api请参考我前面的博文 1.运行效果 2.HTML代码 <!DOCTYPE html> <html> <he ...
- 九度OJ 1188:约瑟夫环 (约瑟夫环)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1891 解决:817 题目描述: N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3 ...
- Python菜鸟之路:JQuery基础
前言 JQuery可以理解为是一个模块,里边封装了DOM以及JavaScript,可以方便的对JQuery对象进行操作. 版本 尽量选择1.X系统的Jquery版本,例如1.12.jquery.js. ...
- 使用基本 SQL 命令
概述 在本教程中,将学习结构化查询语言 (SQL),包括: 使用基本 SQL 命令 执行基本数据操做 数据库和 SQL 在本系列教程中,目前我们使用平面文本文件来存储数据.平面文本文件可能适合相对较少 ...
- 【Prometheus】第二篇---基本查询语法
这几天忙着开发别的项目,今天抽空写一下Prometheus的查询语法 1,查看指标 直接输入指标名字就行了,grafana会自动补全 2,查看某个指标的使用率,比如cpu使用率 用到rate函数,ra ...
- VS2015 下载 破解
Visual Studio Professional 2015简体中文版(专业版): http://download.microsoft.com/download/B/8/9/B898E46E-CBA ...
- wap网站即手机端网页SEO优化注意事项及方法
定位和页面设计: 无论是PC端还是移动端,网站 都要考虑清楚消费群体的定位问题.虽然智能手机用户数量非常普及,但是要明白中国的大部分手机用户使用的还是2G网络,一直高 喊的3G.4G手机用户只有大约1 ...