传送门

Luogu

解题思路

一眼平衡树,应该没问题吧?

但我们一定要反应过来,单点的维护是非常之困难的,因为这是一个网格图而不仅仅是一条序列。

我们要考虑把修改操作全都放在序列上进行。

其实题面里是给了提示的,找一找在哪里。

于是我们可以考虑维护一些区间:

对于每一行,将前 \(m-1\) 个数的区间作为一个节点;将最后一列的 \(n\) 个数的的区间作为一个节点。

但是我们会遇到这样一个问题:当前的区间需要被切开,也就是要把一个节点分裂成两个节点。

其实这个和普通的序列操作是没什么区别的,具体实现看看代码就很显然了。

细节注意事项

  • 节点空间开两倍
  • long long

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} typedef long long LL;
const int _ = 3000002 * 2; int n, m, q, rt[_];
int tot, siz[_], pri[_], lc[_], rc[_];
LL r[_], l[_]; inline int newnode(LL L, LL R)
{ return siz[++tot] = R - L + 1, r[tot] = R, l[tot] = L, pri[tot] = rand(), tot; } inline void pushup(int p) { siz[p] = siz[lc[p]] + siz[rc[p]] + r[p] - l[p] + 1; } inline int merge(int x, int y) {
if (!x || !y) return x + y;
if (pri[x] > pri[y])
return rc[x] = merge(rc[x], y), pushup(x), x;
else
return lc[y] = merge(x, lc[y]), pushup(y), y;
} inline void _split(int p, int k) {
if (k >= r[p] - l[p] + 1) return ;
LL pos = l[p] + k - 1;
int New = newnode(pos + 1, r[p]);
return r[p] = pos, rc[p] = merge(New, rc[p]), pushup(p);
} inline void split(int p, int k, int& x, int& y) {
if (!p) { x = y = 0; return ; }
if (siz[lc[p]] >= k)
return y = p, split(lc[p], k, x, lc[y]), pushup(p);
else { _split(p, k - siz[lc[p]]);
return x = p, split(rc[p], k - siz[lc[p]] - (r[p] - l[p] + 1), rc[x], y), pushup(p);
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
#endif
srand(time(0));
read(n), read(m), read(q);
for (rg int i = 1; i <= n; ++i)
rt[i] = newnode((LL) (i - 1) * m + 1, (LL) i * m - 1);
for (rg int i = 1; i <= n; ++i)
rt[n + 1] = merge(rt[n + 1], newnode((LL) i * m, (LL) i * m));
for (rg int x, y; q--; ) {
read(x), read(y);
if (y == m) {
int a, b, c;
split(rt[n + 1], x, a, c);
split(a, x - 1, a, b);
printf("%lld\n", l[b]);
rt[n + 1] = merge(a, merge(c, b));
} else {
int a, b, c, aa, bb, cc;
split(rt[x], y, a, c);
split(a, y - 1, a, b);
printf("%lld\n", l[b]);
split(rt[n + 1], x, aa, cc);
split(aa, x - 1, aa, bb);
rt[x] = merge(a, merge(c, bb));
rt[n + 1] = merge(aa, merge(cc, b));
}
}
return 0;
}

完结撒花 \(qwq\)

「NOIP2017」列队的更多相关文章

  1. 2018.11.01 loj#2319. 「NOIP2017」列队(线段树)

    传送门 唉突然回忆起去年去noipnoipnoip提高组试水然后省二滚粗的悲惨经历... 往事不堪回首. 所以说考场上真的有debuffdebuffdebuff啊!!!虽然当时我也不会权值线段树 这道 ...

  2. LOJ2319. 「NOIP2017」列队【线段树】

    LINK 思路 神仙线段树 你考虑怎么样才能快速维护出答案 首先看看一条链怎么做? 首先很显然的思路是维护每个节点的是否出过队 然后对于重新入队的点 直接在后面暴力vector存一下就可以了 最核心的 ...

  3. 「NOIP2017」宝藏

    「NOIP2017」宝藏 题解 博客阅读效果更佳 又到了一年一度NOIPCSP-S 赛前复习做真题的时间 于是就遇上了这道题 首先观察数据范围 \(1 \le n \le 12\) ,那么极大可能性是 ...

  4. 逛公园「NOIP2017」最短路+DP

    大家好我叫蒟蒻,这是我的第一篇信竞题解blog [题目描述] 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园 ...

  5. BZOJ5319/LOJ2551「JSOI2018」列队

    问题描述 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置.每次训练开始前,所有学生都在各自的休息位置休息 ...

  6. LOJ 2551 「JSOI2018」列队——主席树+二分

    题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...

  7. 【LOJ】#2551. 「JSOI2018」列队

    题解 老年选手一道裸的主席树都要看好久才看出来 首先熟练的把这个区间建成\(n\)个主席树 然后对于一个询问,我们相当于在主席树上二分一个mid,使得\(mid - K + 1\)正好和\([l,r] ...

  8. LOJ2316. 「NOIP2017」逛公园【DP】【最短路】【思维】

    LINK 思路 因为我想到的根本不是网上的普遍做法 所以常数出奇的大,而且做法极其暴力 可以形容是带优化的大模拟 进入正题: 首先一个很显然的思路是如果在合法的路径网络里面存在零环是有无数组解的 然后 ...

  9. 「NOIP2017」「LuoguP3952」 时间复杂度(模拟,栈

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

随机推荐

  1. 吴裕雄 python 神经网络——TensorFlow TFRecord样例程序

    import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...

  2. vc code js 配置

    VSCode (for JS develop) https://www.jianshu.com/p/c56ea43b2b34 前言 编辑器之间的竞争一直也十分的激烈,用过Webstom,Hbuilde ...

  3. RTT学习之SPI设备

    SPI分为主.从.设备:具体又分标准SPI/DUAL SPI/QUAD SPI(用80字节的RAMrt_err_t rt_spi_take_bus(struct rt_spi_device *devi ...

  4. 实验一&#160;&#160;GIT 代码版本管理

    实验一  GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)   熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git ...

  5. Sqoop 一点通

    sqoop 是什么? sqoop 主要用于异构数据: 1. 将数据从hadoop,hive 导入.导出到关系型数据库mysql 等; 2. 将关系型数据库 mysql 中数据导入.导出到 hadoop ...

  6. 同一台服务器lnmpa环境下配置ip或域名访问不同站点

    1.配置域名访问 (1)添加虚拟主机 (2)nginx配置 cd /usr/local/nginx/conf/vhost vim zkadmin.zouke.com.conf (3)apache配置 ...

  7. JavaScript - onunload失效

    参考 https://stackoverflow.com/questions/7794301/window-onunload-is-not-working-properly-in-chrome-bro ...

  8. 使用win32com操作woord的方法记录

    CSDN博客平台中有众多的 win32com 库操作word 的说明,对于通用的内容将一笔带过,主要介绍目前看来独一无二的内容. import win32com from win32com.clien ...

  9. Cookie信息保存到本地(MozillaCookieJar)

    from urllib import request from http.cookiejar import MozillaCookieJar cookiejar = MozillaCookieJar( ...

  10. JS闭包(2)

    利用闭包的特点,我们可以在封装自己的模块的时候只向外暴露我们模块中的数据,而不让其修改. 1.第一中封装的方式,新建一个myModule.js文件,这个模块的作用是对外部提供明天和后天的天气. 在my ...