洛谷 P3960 [ NOIP 2017 ] 列队 —— 线段树
题目: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 ] 列队 —— 线段树的更多相关文章
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- 洛谷 P3951 NOIP 2017 小凯的疑惑
洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...
- 洛谷P3372 【模板】线段树 1
P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...
- 洛谷P4891 序列(势能线段树)
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...
- 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)
To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...
- Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)
题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...
- 【题解】洛谷P1198 [JSOI2008] 最大数(线段树)
洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Laz ...
- bzoj3064/洛谷P4314 CPU监控【线段树】
好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...
随机推荐
- PHP条件运算符的“坑”
今天遇到一个关于PHP 嵌套使用条件运算符(ternary expressions)的问题 现象 先来看一段C语言代码(test.c): #include<stdio.h> int mai ...
- buf.includes()
buf.includes(value[, byteOffset][, encoding]) value {String} | {Buffer} | {Number} byteOffset {Numbe ...
- Numpy第一课
import numpy as np a = np.array([1,2,3]) print(a) # [1 2 3] a2 = np.array([[1, 2], [3, 4]]) print('a ...
- 慕课笔记利用css进行布局【三列布局】
三个div中间自适应,两侧固定大小 <html> <head> <title>三列布局</title> <style type="tex ...
- 62. mybatis 使用PageHelper不生效【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 在Spirng Boot中集成了PageHelper,然后也在需要使用分页的地方加入了如下代码: PageHelper.startPage(1,1 ...
- JPA的一些坑
推荐一篇比较好的介绍JPA的文章:使用 Spring Data JPA 简化 JPA 开发 JPA坑1:不支持Limit查询 JPA是不支持Limit分页查询,而我们有时又因为某些原因不想用JPA提供 ...
- 【错误解决】 java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp
转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 今天建立Spring MVC骨架的时候,突然遇到这么一个问题~~ HTTP Stat ...
- idea使用之maven中央仓库索引更新
接着上篇,上篇是更新本地已有的索引,这样在编写pom文件的时候,可以自动提示,但如果我们能够把整个中央仓库的索引更新下来,那不是更方便啦. 打开settings-->Build,Executio ...
- n个点中求任意两点组成斜率的最大值
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1100 首先按x坐标排序,然后相邻的三个点A,B,C 组成的三条直线必然有 ...
- 使用idea编译spring-framework5.0源码
自从迈入java开发这个行当,从来没有好好的研究过源码,深感惭愧,话不多说,今天上一篇使用idea编译spring5.0源码. 以下在win中构建和编译过程分为 jdk环境的配置 gradle的下载和 ...