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. 为了便 ...
随机推荐
- Python的Django框架中的Context使用
Python的Django框架中的Context使用 近期整理些Python方面的知识,一旦你创建一个 Template 对象,你能够用 context 来传递数据给它. 一个context是一系列变 ...
- 装服务器,测试数据库,简单的maven命令
[说明]今天总体回顾一下:大概是早上装服务器,下午测试数据库,晚上了解简单的maven命令 一:今日完成 1)在远程服务器的tomcat 设置好管理员的登录账号 2)登录tomcat 的项目管理 查看 ...
- 九度OJ 1334:占座位 (模拟)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:864 解决:202 题目描述: sun所在学校的教室座位每天都是可以预占的. 一个人可以去占多个座位,而且一定是要连续的座位,如果占不到他所 ...
- Android异步载入全解析之使用AsyncTask
Android异步载入全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅能够对并发线程进行管理.更能够提高他们运行的效率.优化整个App.当然我们能够自己 ...
- easyui的 一些经验
1. 渲染网络表格时,行操作 <th field="sort_num" width="10" data-options="field:'id', ...
- 牛客小白月赛1 C 分元宵【快速幂】
题目链接 https://www.nowcoder.com/acm/contest/85/C 思路 有 A 种 元宵馅,B 种元宵皮 所以 我们可以认为 有Q = A * B 种 元宵 有 C 张桌子 ...
- 【leetcode刷题笔记】Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题 ...
- 20145229吴姗珊 《Java程序设计》第9周总结
20145229吴姗珊 <Java程序设计>第9周总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交 ...
- 斐波那契 (Fibonacci)数列
尾递归会将本次方法的结果计算出来,直接传递给下个方法.效率很快. 一般的递归,在本次方法结果还没出来的时候,就调用了下次的递归, 而程序就要将部分的结果保存在内存中,直到后面的方法结束,再返回来计算. ...
- <Perl算法小菜>排序加速--Schwatzian变换及Guttman-Rosler变换
原创博客,转载请联系博主! perl里的数据都是以双精度为单元存储的,也就是相当于C/Cpp中的double型,而正则的解析是由perl内置的正则引擎完成的,那么除了重写一个属于自己的排序方法之外,我 ...