https://www.luogu.org/problemnew/show/P3960

作为一个初二蒟蒻要考提高组,先做一下17年的题目

我们发现进行一次操作相当于

  • 把第 x 行的第 y 个弹出记为 a,其余向左移 = splay 中弹出第 y 个
  • 把第 m 列的第 x 个弹出记为 b,其余向上移 = splay 中弹出第 x 个
  • 把 b 插到第 x 行末尾 = splay 在队尾插入 b
  • 把 a 插到第 m 列末尾 = splay 在队尾插入 a

然后对于没有用到的节点先合并着,要用就拆开

#include <bits/stdc++.h>
#define int long long
using namespace std; typedef unsigned long long ull;
typedef long long ll; template <typename _T>
inline void read(_T &f) {
f = 0; _T fu = 1; char c = getchar();
while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}
while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}
f *= fu;
} const int N = 300000 + 10; struct Node {
int l, r, size, id;
Node *ch[2];
Node (int a, int b, int c, int d, Node *e, Node *f) {
l = a, r = b, size = c, id = d;
ch[0] = e, ch[1] = f;
}
}*root[N], *null; int w[N];
int n, m, q; void update(Node *u) {
u -> size = u -> ch[0] -> size + u -> ch[1] -> size + u -> r - u -> l + 1;
} void rotate(Node *&u, int d) {
Node *tmp = u -> ch[d];
u -> ch[d] = tmp -> ch[d ^ 1];
tmp -> ch[d ^ 1] = u;
update(u); update(tmp);
u = tmp;
} void splay(Node *&u, int k) {
int ltree = u -> ch[0] -> size;
if(ltree < k && (ltree + (u -> r - u -> l + 1) >= k)) return;
int d = k > ltree;
int k2 = d ? k - ltree - (u -> r - u -> l + 1) : k;
int ltree2 = u -> ch[d] -> ch[0] -> size;
if(ltree2 >= k2 || (ltree2 + u -> ch[d] -> r - u -> ch[d] -> l + 1) < k2) {
int d2 = k2 > ltree2;
splay(u -> ch[d] -> ch[d2], d2 ? k2 - ltree2 - (u -> ch[d] -> r - u -> ch[d] -> l + 1) : k2);
if(d == d2) rotate(u, d2);
else rotate(u -> ch[d], d2);
}
rotate(u, d);
} Node *build(int l, int r) {
if(l > r) return null;
if(l == r) return new Node(w[l], w[l], 1, w[l], null, null);
int mid = (l + r) >> 1;
return new Node(w[mid], w[mid], r - l + 1, w[mid], build(l, mid - 1), build(mid + 1, r));
} void merge(Node *&a, Node *&b) {
if(a == null) a = b, b = null;
if(b == null) return;
splay(a, a -> size);
a -> ch[1] = b;
update(a);
} int split(Node *&u, int k) {
splay(u, k);
int ltree = u -> ch[0] -> size;
int K = k - ltree, l = u -> l, r = u -> r;
if(K != 1) {
Node *tmp = new Node(l, l + K - 2, K - 1, l, u -> ch[0], null);
u -> ch[0] = tmp; u -> l = l + K - 1; update(u -> ch[0]);
}
if(K != r - l + 1) {
Node *tmp = new Node(l + K, r, r - l - K + 1, l + K, null, u -> ch[1]);
u -> ch[1] = tmp; u -> r = l + K - 1; update(u -> ch[1]);
}
Node *t2 = u -> ch[1]; u -> ch[1] = null; u -> id = u -> l;
int ans = u -> id; u = u -> ch[0]; merge(u, t2); return ans;
} void ins(Node *&u, int x) {
if(u == null) u = new Node(x, x, 1, x, null, null);
else {
splay(u, u -> size);
u -> ch[1] = new Node(x, x, 1, x, null, null);
update(u);
}
} signed main() {
null = new Node(0, -1, 0, 0, 0, 0);
read(n); read(m); read(q);
for(int i = 1; i <= n; i++) {
root[i] = new Node(1 + (i - 1) * m, m - 1 + (i - 1) * m, m - 1, 1 + (i - 1) * m, null, null);
}
for(int i = 1; i <= n; i++) w[i] = i * m;
root[0] = build(1, n);
for(int i = 1; i <= q; i++) {
int a, b;
read(a); read(b);
if(b == m) {
int ans = split(root[0], a);
printf("%lld\n", ans);
ins(root[0], ans);
continue;
}
int ans = split(root[a], b);
printf("%lld\n", ans);
int tmp = split(root[0], a);
ins(root[a], tmp);
ins(root[0], ans);
}
return 0;
}

luoguP3690 列队的更多相关文章

  1. 关于PHP堆栈与列队

    在PHP中数组常被当作堆栈(后进先出:LIFO)与队列(先进先出:FIFO)结构来使用.PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素.堆栈与 ...

  2. 在PHP中如何使用消息列队

    /** * 消息列队服务 * @author zhou.tingze * @example * -----------------------------------Create----------- ...

  3. BZOJ2720: [Violet 5]列队春游

    2720: [Violet 5]列队春游 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 173  Solved: 125[Submit][Status] ...

  4. [NOIp 2017]列队

    Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有$n \times m$名学生, ...

  5. NOIP2017D2T3 列队—Treap

    NOIP2017列队 Description Sylvia 是一个热爱学习的女孩子.  前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m ...

  6. P2649 - 【NOIP2017】列队

    Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m 名学生,方阵的行数为 ...

  7. WebForm应用log4net记录错误日志——使用线程列队写入

    我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...

  8. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  9. [NOIP]2017列队——旋转treap/非旋转treap

    Sylvia 是一个热爱学习的女孩子.  前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为m.  为了便 ...

随机推荐

  1. linux grep打印匹配的上下几行

    $grep -5 'parttern' inputfile //打印匹配行的前后5行 $grep -C 5 'parttern' inputfile //打印匹配行的前后5行 $grep -A 5 ' ...

  2. GridView导出成Excel字符"0"丢失/数字丢失的处理方式 收藏

    GridView导出成Excel字符"0"丢失/数字丢失的处理方式 收藏 GridView 导出成Excel文件,这个代码在网上比较多.但是发现存在一个问题,导出的数据中如果有&q ...

  3. NUnit属性

    TestFixture:它标记一个类包含测试,申明该类是用来测试的.一般用在class的定义之前: Test一般是放在method之前,表示对该方法的测试:如前一篇文章所示的class. SetUp/ ...

  4. 我的笔记,有关 PhotoShop,给自己的记忆宫殿

    一直有心学习 PhotoShop ,各种教程也 download 了不少,什么祁连山.PS大师之路.Oeasy 等等.看了吗?丫蛋的只看了前面两集!还是在博客上写写坐下笔记,好记性不如烂笔头. 0.先 ...

  5. php 读取和下载execl

    最近用到php 对excel 的操作 下来 小弟为大家 先贴一下自己的代码  有什么补充的 大神们请指点下.感激不尽. 我用的是yii2   yii2中有类 phpexcel 先说说下载吧. 首先下载 ...

  6. instanceof php

    instdnceof php5  的一个新成员 功能: 使用这个关键字可以确定一个对象是否是类的实例,是否是累的子类 ,还是实现了某个特定的接口. <?php class A{} class B ...

  7. solr第二天 京东案例

    一.案例 电商网站的搜索 在互联网项目中做搜索都应该使用全文检索. 查询的是索引库,搜索功能跟数据库没有关系.实现分析: 1.先创建索引库 需要把数据库中的数据导入到索引库中. 需要把数据库中每个字段 ...

  8. javac老提示无效的标记

    加上-cp libs/*后,就开始提示无效的标记,搞了半天,似乎是shell展开的问题,估计是把后面的jar文件当源文件了? 加上引号就行了-cp "libs/*",不让shell ...

  9. JAVA中mark()和reset()用法

    根据JAVA官方文档的描述,mark(int readlimit)方法表示,标记当前位置,并保证在mark以后最多可以读取readlimit字节数据,mark标记仍有效.如果在mark后读取超过rea ...

  10. Office Web APP预览如何去掉顶部版权标志“Microsoft Office Web Apps”

    在Office Web APP的预览会涉及4中类型的文 件:Word.Excel.PowerPoint.PDF,不同的类型在预览时调用的文件是不一样的,其中Word和 PDF调用的是同一个文件.每个预 ...