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

NOIP 题,不用很复杂的数据结构...但又参考了许多;

要求支持维护删除第 k 个和在末尾插入的数据结构,线段树就很好;

所以每行一个线段树维护前 m-1 个元素,最后一列一个线段树即可;

但 n+1 个线段树显然空间太大,考虑利用一开始是按顺序排列的特点;

也就是不用实际开出来所有线段树的点,只要它是满的就可以直接算出来;

对于新加入线段树的点,如果真的加入线段树里,又不会算空间了...

但是新加入的点只有 2*q 个,可以给每行和最后一列开一个 vector 记录新加入的点,查询时如果不是原装点,就去 vector 里提取;

也不需要去 vector 里删除元素,在对应线段树上动态开出这个点的位置表示一下就行了,将来查询的时候就不会算这个元素;

把基础数据结构组合起来,得到简洁的做法...希望下次能自己想出来。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
int const maxn=3e5+,maxm=;
int n,m,q,rt[maxn],cnt,sum[maxm],ls[maxm],rs[maxm],mx;
vector<ll>v[maxn];//ll
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return ret*f;
}
int query(int x,int l,int r,int k)
{
if(l==r)return l; int num=(mid-l+)-sum[ls[x]];
if(num>=k)return query(ls[x],l,mid,k);
return query(rs[x],mid+,r,k-num);
}
void update(int &x,int l,int r,int pos)
{
if(!x)x=++cnt; sum[x]++;//sum 是删除的数量
if(l==r)return;//
if(pos<=mid)update(ls[x],l,mid,pos);
else update(rs[x],mid+,r,pos);
}
ll del(int x,int y)
{
int pos=query(rt[x],,mx,y);
update(rt[x],,mx,pos);
if(pos<m)return (ll)(x-)*m+pos;
return v[x][pos-m];
}
ll del2(int x)
{
int pos=query(rt[n+],,mx,x);
update(rt[n+],,mx,pos);
if(pos<=n)return (ll)pos*m;
return v[n+][pos-n-];
}
int main()
{
n=rd(); m=rd(); q=rd();
mx=max(n,m)+q;
for(int i=,x,y;i<=q;i++)
{
x=rd(); y=rd();
if(y==m)
{
ll tmp=del2(x);
printf("%lld\n",tmp);
v[n+].push_back(tmp);
}
else
{
ll tmp=del(x,y);
printf("%lld\n",tmp);
v[n+].push_back(tmp);
ll tmp2=del2(x);
v[x].push_back(tmp2);
}
}
return ;
}

洛谷 P3960 [ NOIP 2017 ] 列队 —— 线段树的更多相关文章

  1. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  2. 洛谷 P3951 NOIP 2017 小凯的疑惑

    洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...

  3. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  4. 洛谷P4891 序列(势能线段树)

    洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...

  5. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  6. 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块

    !!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...

  7. Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)

    题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...

  8. 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)

    洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...

  9. bzoj3064/洛谷P4314 CPU监控【线段树】

    好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...

随机推荐

  1. 78-DeMarker,价格波动指数.(2015.7.1)

    DeMarker 价格波动指数 观井映天 2015.7.1

  2. 第二周习题O题

    Description   Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an or ...

  3. 使用C++调用pytorch模型(Linux)

    前言 模型转换思路通常为: Pytorch -> ONNX -> TensorRT Pytorch -> ONNX -> TVM Pytorch -> 转换工具 -> ...

  4. String字符串类的获取功能

    StringDemo.java /* * String类的获取功能: * int length():获取字符串的长度,其实也就是字符个数 * char charAt(int index):获取指定索引 ...

  5. .DS_Store的说明

    今天清理电脑时,突然发现好像有文件的地方都会出现一个.DS_Store文件,今天有时间,索性就查了一下,并做总结发表一篇吧,怕有什么影响,并未真正实施,仅仅供自己收藏,仅供大家参考.      DS_ ...

  6. 【HDOJ6118】度度熊的交易计划(费用流)

    题意: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个 ...

  7. 【BZOJ2142】礼物(扩展lucas定理,中国剩余定理合并方程)

    题意:有n件礼物,m个人,每个人分别需要w[i]件礼物,求分礼物的不同方案数 mod P 提示:设P=p1^c1 * p2^c2 * p3^c3 * … *pt ^ ct,pi为质数. 1≤n≤10^ ...

  8. 自己打断点走的struts流程&拦截器工作原理

    ①. 请求发送给 StrutsPrepareAndExecuteFilter ②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请 求(Actio ...

  9. 将windows应用程序注册为windows服务

    @echo off::设置服务名称set service_name=ServiceManagement ::设置服务描述set service_description=文件安全上传服务 ::设置服务程 ...

  10. JavaScript高级篇之Function对象

    JavaScript高级篇之Function对象 一: Function对象引入: Function对象是js的方法对象,可以用Function实例化出任何js方法对象. 例如: <%@ pag ...