题解-Bombs

前置知识:

线段树


\(\color{orange}{\texttt{Bombs on luogu}}\) / \(\color{orange}{\texttt{Bombs on CF}}\)

有一个 \(n\) 的排列 \(p_i\)。其中有一些 \(i\) 被打了标记。对于 \(i=1\to n\),将 \(p_i\) 放入集合,如果 \(i\) 被标记,就删除集合中的最大数。最后剩下的集合的最大数就是这种标记状态下该序列的值。给定另一个 \(n\) 的排列 \(q_j\),求对于 \(j=1\to n\),将 \(q_1\sim q_j\) 标记后对应的序列值

数据范围:\(1\le n\le 3\times 10^5\)。


考虑当前序列值为 \(p_i\),如果打上标记 \(q_j\) 后的序列值变化。

  1. 如果 \(q_j<i\):序列值不改变。
  2. 如果 \(q_j\ge i\):序列值变小

所以打上标记 \(q_j\) 相当于破坏 \(1\sim q_j\) 的最大值

可以把打标记 \(q_j\) 变化为令 \([1,q_j]\) 的 \(w\) 区间值 \(-1\)。

而将当前序列值 \(p_i\) 退让成 \(p_k=p_i-1\) 则相当于树立 \(1\sim k\) 的最大值

可以把退让序列值变化为令 \([1,k]\) 的 \(w\) 区间值 \(+1\)。

这样的话如果有 \(w_i>0\) 就说明当前序列值未被删除,否则就该退让最大值


因为要看是否满足有 \(w_i>0\),所以可以线段树维护 \(w\) 区间最大值

Code

#include <bits/stdc++.h>
using namespace std; //&Start
#define re register
#define il inline
#define inf 0x3f3f3f3f
typedef long long lng; //&Data
#define N 300000
int n,p[N+10],q[N+10],I[N+10]; //&Segmenttree
struct smt{ //线段树
int mx[N<<2|7],mk[N<<2|7];
il void pushdown(re int k){
if(mk[k]!=0) mx[k<<1]+=mk[k],mx[k<<1|1]+=mk[k],mk[k<<1]+=mk[k],mk[k<<1|1]+=mk[k],mk[k]=0;
}
il void add(re int x,re int y,re int z,re int k=1,re int l=1,re int r=n){
if(x<=l&&r<=y){mx[k]+=z,mk[k]+=z;return;}
int mid=(l+r)>>1; pushdown(k);
if(mid>=x) add(x,y,z,k<<1,l,mid);if(mid<y) add(x,y,z,k<<1|1,mid+1,r);
mx[k]=max(mx[k<<1],mx[k<<1|1]);
}
}tree; //&Main
int main(){
scanf("%d",&n);
for(re int i=1;i<=n;i++) scanf("%d",p+i),I[p[i]]=i; //记录pk对应的k,方便退让
for(re int i=1;i<=n;i++) scanf("%d",q+i);
re int res=n;
tree.add(1,I[res],1),printf("%d%c",res,"\n "[1<n]);
for(re int i=1;i<n;i++){
tree.add(1,q[i],-1); //打标记-删除
while(tree.mx[1]<=0) tree.add(1,I[--res],1);//退让知道未被删除
printf("%d%c",res,"\n "[i<n-1]); //未被删除的序列值
}
return 0;
}

祝大家学习愉快!

题解-Bombs的更多相关文章

  1. codechef Little Elephant and Bombs题解

    The Little Elephant from the Zoo of Lviv currently is on the military mission. There are N enemy bui ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. 微服务下的持续集成-Jenkins自动化部署GitHub项目

    @ 目录 一.前言 二.DevOps概念 三.为什么要做持续集成 四.常见云服务 五.手动部署Jenkins 5.1 准备工作 5.2 下载 5.3 启动 5.4 配置 5.5 Jenkins 首页 ...

  2. mysql多表查询之子语句查询

    1.子语句查询 1.1子语句查询出来的结果集作为临时表名使用 select * from (select * from person) as aaa; -- as这个起别名关键字是可以省略的 1.2查 ...

  3. Java的BigDecimal,对运算封装

    添加maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...

  4. 理解Volatile关键字,其实看这一篇就够了,写的非常细致

    前言 volatile是Java虚拟机提供的轻量级的同步机制. volatile关键字作用是什么? 两个作用: 1.保证被volatile修饰的共享变量对所有线程总数可见的,也就是当一个线程修改了一个 ...

  5. C# Random类的正确应用

    Random类介绍 Random类一个用于产生伪随机数字的类.这里的伪随机表示有随机性但是可以基于算法模拟出随机规律. Random类的构造方式有两种. Random r= new Random(). ...

  6. php数组学习记录01

    array_change_key_case array_change_key_case - 将数组中的所有键名修改为全大写或小写 <?php $input_array = array(" ...

  7. [poi使用]使用excel模版导出excel

    ​ Apache POI是基于Office Open XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)处理各种文件格式的开源项目.简而言之,您可以使用Java读写MS ...

  8. JS&Swift相互交互

    加载本地HTML文件       x         override func loadView() {    super.loadView()    let conf = WKWebViewCon ...

  9. 分布式监控系统之Zabbix proxy

    前文我们了解了zabbix 使用snmp和jmx信道采集数据的相关使用配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14029864.html:今天我们来 ...

  10. 自学linux——12.shell进阶

    Shell进阶 当把在Windows中写好的脚本传到linux中使用时,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以会多出来\r,在linux中运行脚本时,需执行: sed - ...