Sol

考场上:

这不是送\(50\)吗,\(Q^2\)递推就好了

然后,怎么又送\(20\)分???

\(woc\),只有半个小时了,顺利没调出来只有\(50\)分

考后:

神\(TM\)一个大于号写成小于号。。。

\(20\)分没了

\(TAT\)


正解的一种

\(n\)棵线段树维护每一行的前\(m-1\)列

再开一棵维护最后一列的情况

长度为\(max(n, m)+q\)

动态开点

每次就变成删除节点,插入节点了

维护区间元素个数

查找就是全局第\(k\)小

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
const int _(3e5 + 5);
typedef long long ll; IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int n, m, q, rt[_], num, len, tp, tail[_], now;
struct Segment{
int ls, rs, sz;
ll val;
} T[_ * 40]; IL int Size(RG int l, RG int r){
if(now == n + 1){
if(r <= n) return r - l + 1;
if(l <= n) return n - l + 1;
return 0;
}
if(r < m) return r - l + 1;
if(l < m) return m - l;
return 0;
} IL ll Query(RG int &x, RG int l, RG int r, RG int p){
if(!x) x = ++num, T[x].sz = Size(l, r);
--T[x].sz;
if(l == r){
if(!T[x].val) T[x].val = (now == n + 1) ? 1LL * l * m : 1LL * (now - 1) * m + l;
return T[x].val;
}
RG int mid = (l + r) >> 1, sz = T[x].ls ? T[T[x].ls].sz : Size(l, mid);
if(p <= sz) return Query(T[x].ls, l, mid, p);
return Query(T[x].rs, mid + 1, r, p - sz);
} IL void Modify(RG int &x, RG int l, RG int r, RG int p, RG ll v){
if(!x) x = ++num, T[x].sz = Size(l, r);
++T[x].sz;
if(l == r){
T[x].sz = 1, T[x].val = v;
return;
}
RG int mid = (l + r) >> 1;
if(p <= mid) Modify(T[x].ls, l, mid, p, v);
else Modify(T[x].rs, mid + 1, r, p, v);
} int main(RG int argc, RG char* argv[]){
n = Input(), m = Input(), q = Input(), len = max(n, m) + q;
for(RG int i = 1; i <= n; ++i) T[rt[i] = ++num].sz = tail[i] = m - 1;
T[rt[n + 1] = ++num].sz = tail[n + 1] = n;
for(RG int i = 1; i <= q; ++i){
RG int x = Input(), y = Input(); RG ll id1, id2;
if(y == m){
now = n + 1, id1 = Query(rt[n + 1], 1, len, x);
++tail[n + 1], Modify(rt[n + 1], 1, len, tail[n + 1], id1);
}
else{
now = x, id1 = Query(rt[x], 1, len, y);
++tail[now = n + 1], Modify(rt[n + 1], 1, len, tail[n + 1], id1);
id2 = Query(rt[n + 1], 1, len, x);
++tail[now = x], Modify(rt[x], 1, len, tail[x], id2);
}
printf("%lld\n", id1);
}
return 0;
}

NOIP2017:列队的更多相关文章

  1. [NOIP2017]列队 离线+SBT

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

  2. 题解[NOIP2017] 列队

    题解[NOIP2017] 列队 题面 解析 看到这题时感觉这个编号很难维护啊? 后来看了lzf大佬的题解才会.. 首先,考虑一个稍微暴力的做法, 维护每一行的前\(m-1\)个人和最后一列的\(n\) ...

  3. NOIP2017列队(phalanx)解题报告

    列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先 ...

  4. NOIP2017 列队 题解报告【56行线段树】

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

  5. [NOIP2017]列队 (Splay)

    题目链接 NOIP2017真的是不按常理出牌: 1.数学题不在Day2T1 2.一道水题一道细节极多的模拟题一道不知道怎么形容的题(小凯的疑惑)(因为我太菜了) 3.3道大火题 当时看到列队这题是毫无 ...

  6. NOIP2017 列队

    https://www.luogu.org/problemnew/show/P3960 p<=500 50分 模拟 每个人的出队只会影响当前行和最后一列 p<=500,有用的行只有500行 ...

  7. [NOIP2017] 列队(平衡树)

    考虑转化题意: 设这次操作删掉点\((x, y)\) 对于每一次向左看齐:在第x行删除\((x, y)\),并将y以后的点全部前移一位 对于每一次向前看齐:x以后的点全部上移一位,并在最后一列插入\( ...

  8. <noip2017>列队

    题解: 考场实际得分:45 重新看了一下,发现至少80分是很好拿的 对于前30% 暴力 另20% 显然离线搞一下就可以了(大概当初连离线是啥都不知道) 另另30%其实只要维护第一行和最后一列就可以了, ...

  9. NOIP2017 列队——动态开点线段树

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

  10. Luogu 3960 [NOIP2017] 列队 - splay|线段树

    题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$ ...

随机推荐

  1. Determining the Size of a Class Object---sizeof(class)---By Girish Shetty

    There are many factors that decide the size of an object of a class in C++. These factors are: Size ...

  2. POJ2279 Mr Young's Picture Permutations

    POJ2279 Mr Young's Picture Permutations 描述: 有N个学生合影,站成左对齐的k排,每行分别有N1,N2…NK个人,第一排站最后,第k排站之前.学生身高依次是1… ...

  3. 网络传输层之TCP/UDP详解

    一.运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层. 运输层的任务就是负责主机中两个进程之间的通信,其数据传输的单 ...

  4. kaggle kernel使用指南

    有几个要注意的地方: 1.可以选择CPU或GPU,但是机器学习模型一般的CPU就够了,最近(2019.04)使用GPU的话一小时后总是会断开连接,这时候要跑久一点的cell就凉了. 2.导入文件:支持 ...

  5. 洛谷 P2053 [SCOI2007]修车(最小费用最大流)

    题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...

  6. 【实战分享】安卓app测试的一些记录

    一.app代码未混淆1.使用7zip解压apk文件2.执行命令:dex2jar.bat apk解压后文件夹中的classes.dex文件3.上述命令执行后会在apk文件夹中生成java源码文件clas ...

  7. 持续集成、持续交付、持续部署、Jkens、git

    一  持续集成.持续交付.持续部署 1. 持续集成 持续集成指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的,就是让产品可以快速迭代,同时还能 保持高质量.它的核心措施是,代码集成到主干之前 ...

  8. Ntp客户端

    function parseMsg (buffer) { if (buffer.length !== 48) return; const pkt = {}, now = new Date().getT ...

  9. 后台微信开发入口+关键字 回复等 关注公众号回复 注意获取随机Token 微信的对接校验Token保存到数据库的只是做第一次的校验 其他对微信公众号的操作是去缓存中获取7200S的随机Token

    package com.epalmpay.controller.apiweixin; import com.epalmpay.commom.BaseController;import com.epal ...

  10. 3dsmax2015卸载/安装失败/如何彻底卸载清除干净3dsmax2015注册表和文件的方法

    3dsmax2015提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2015失败提示3dsmax2015安装未完成,某些产品无法安装,也有时候想重新 ...