Link

Link

Solution

挺巧妙的

考虑这个问题:什么时候x,x+1,…,nx,x+1,\dots,nx,x+1,…,n才会被全删掉?

先考虑x=nx=nx=n

那么很显然,只要xxx的位置后方有至少一个炸弹就行了

在考虑x=n−1x=n-1x=n−1

这个稍微想想也能知道,假设我把n−1,nn-1,nn−1,n这两个数字在序列里标出来,两个数字中比较靠左的那个数右边至少有两个炸弹,靠右的那个数字右边至少有一个炸弹。这个结论的充分性很显然,必要性用反证法也能想出来,所以是充要条件。

这样考虑下去就会发现,对于任意的一个xxx,只要倒数第kkk个数的右边至少有kkk个炸弹(∀k∈[1,n−x+1])(\forall\ k\ \in [1,n-x+1])(∀ k ∈[1,n−x+1]),那么x,x+1,…,nx,x+1,\dots,nx,x+1,…,n就全都被删除了

这个题如果单纯考虑xxx什么时候被删掉的话思路就比较偏,而如果从“x,x+1,…,nx,x+1,\dots,nx,x+1,…,n”全都被删掉来考虑的话,就很容易到达正解。

那么剩下的交给线段树就好了。(维护一个需求量,>0>0>0表示还没满足需求)

Code

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 300010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{ll c, f(1);for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;for(;isdigit(c);c=getchar())x=x*10+c-0x30;return f*x;
}
struct SegmentTree
{ll mn[maxn<<2], mx[maxn<<2], sum[maxn<<2], add[maxn<<2], set[maxn<<2], L[maxn<<2], R[maxn<<2];void maketag_set(ll o, ll v){add[o]=0;set[o]=v;mx[o]=mn[o]=v;sum[o]=(R[o]-L[o]+1)*v;}void maketag_add(ll o, ll v){add[o]+=v;mx[o]+=v, mn[o]+=v;sum[o]+=(R[o]-L[o]+1)*v;}void pushdown(ll o){if(L[o]==R[o])return;if(~set[o]){maketag_set(o<<1,set[o]);maketag_set(o<<1|1,set[o]);set[o]=-1;}if(add[o]){maketag_add(o<<1,add[o]);maketag_add(o<<1|1,add[o]);add[o]=0;}}void pushup(ll o){mx[o]=max(mx[o<<1],mx[o<<1|1]);mn[o]=min(mn[o<<1],mn[o<<1|1]);sum[o]=sum[o<<1]+sum[o<<1|1];}void build(ll o, ll l, ll r, ll* array=NULL){ll mid(l+r>>1);L[o]=l, R[o]=r;add[o]=0;set[o]=-1;if(l==r){if(array)mn[o]=mx[o]=sum[o]=array[l];else mn[o]=mx[o]=sum[o]=0;return;}build(o<<1,l,mid,array);build(o<<1|1,mid+1,r,array);pushup(o);}void Set(ll o, ll l, ll r, ll v){ll mid(L[o]+R[o]>>1);if(l<=L[o] and r>=R[o]){maketag_set(o,v);return;}pushdown(o);if(l<=mid)Set(o<<1,l,r,v);if(r>mid)Set(o<<1|1,l,r,v);pushup(o);}void Add(ll o, ll l, ll r, ll v){ll mid(L[o]+R[o]>>1);if(l<=L[o] and r>=R[o]){maketag_add(o,v);return;}pushdown(o);if(l<=mid)Add(o<<1,l,r,v);if(r>mid)Add(o<<1|1,l,r,v);pushup(o);}ll Sum(ll o, ll l, ll r){pushdown(o);ll mid(L[o]+R[o]>>1), ans(0);if(l<=L[o] and r>=R[o])return sum[o];if(l<=mid)ans+=Sum(o<<1,l,r);if(r>mid)ans+=Sum(o<<1|1,l,r);return ans;}ll Min(ll o, ll l, ll r){ll mid(L[o]+R[o]>>1), ans(linf);if(l<=L[o] and r>=R[o])return mn[o];pushdown(o);if(l<=mid)ans=min(ans,Min(o<<1,l,r));if(r>mid)ans=min(ans,Min(o<<1|1,l,r));return ans;}ll Max(ll o, ll l, ll r){ll mid(L[o]+R[o]>>1), ans(-linf);if(l<=L[o] and r>=R[o])return mx[o];pushdown(o);if(l<=mid)ans=max(ans,Max(o<<1,l,r));if(r>mid)ans=max(ans,Max(o<<1|1,l,r));return ans;}
}segtree;
ll p[maxn], q[maxn], n, pos[maxn];
int main()
{ll i, now;n=read();rep(i,1,n)p[i]=read(), pos[p[i]]=i;rep(i,1,n)q[i]=read();segtree.build(1,1,n);segtree.Set(1,1,n,-iinf);now=n;segtree.Add(1,pos[now],pos[now],iinf);segtree.Add(1,1,pos[now],+1);rep(i,1,n){printf("%lld ",now);segtree.Add(1,1,q[i],-1);while(segtree.Max(1,1,n)<=0 and now){now--;segtree.Add(1,pos[now],pos[now],iinf);segtree.Add(1,1,pos[now],+1);}}return 0;
}

cf1326 E. Bombs相关推荐

  1. Defuse the Bombs Gym - 102822D

    Defuse the Bombs Gym - 102822D 题目: 给你n个数,现在每轮会有三个操作: 1.选择一个数,使他加一 2.所有数减一 3.当有一个数变成负数时结束操作,否则回到第一步 问 ...

  2. [逆向工程] 二进制拆弹Binary Bombs 快乐拆弹 详解

    二进制拆弹 binary bombs 教你最快速解题,成功拆弹 最近计算机基础课,的实验lab2,二进制拆弹,可以说是拆的我很快乐了(sub n, %hair) 此处头发减n 我刚开始做的时候很是懵逼 ...

  3. CSAPP LAB Binary bombs实验报告

    CSAPP LAB Binary bombs实验报告 文章目录 CSAPP LAB Binary bombs实验报告 更好的阅读体验 一.实验目的: 二.实验要求 三.实验内容(所修改函数代码,功能以 ...

  4. Codeforces - Bombs

    题目链接:Codeforces - Bombs 显然从右往左枚举的时候,答案具有单调性. 所以我们可以依次看当前的值能否成为答案. 当前值可以是答案的充要条件为:存在一个点,这个点后面大于等于ans的 ...

  5. C.Defuse the Bombs(简单二分)

    C.Defuse the Bombs WA了九次,让我来看看简单二分有多简单 The terrorists have planted some bombs in a building! Our her ...

  6. codeforces 1326 E.Bombs

    codeforces 1326 E.Bombs 题意: 给定[1,n][1,n][1,n]的排列p,q,将pip_ipi​依次加入初始为空的集合S,qiq_iqi​的值表示第i次加入的值为bomb.若 ...

  7. M - Bombs CodeForces - 350C(方格,模拟)

    You've got a robot, its task is destroying bombs on a square plane. Specifically, the square plane c ...

  8. Doves and bombs UVA - 10765

    求割掉一个点后的连通分量个数最多的m个点 It is the year 95 ACM (After the Crash of Microsoft). After many years of peace ...

  9. 2020CCPC绵阳站 Defuse the Bombs(简单二分)

    2020CCPC绵阳站 Defuse the Bombs(简单二分) 题目 https://pintia.cn/problem-sets/1322796904464203776/problems/13 ...

最新文章

  1. android实现分类搜索功能,android应用中的搜索功能怎么实现的
  2. DELL服务器结合nagios硬件监控、报警
  3. Dynamips与VMware配合搭建网络实验环境
  4. php将配置信息写入文件,Php写入配置文件的经典漏洞
  5. Dockerfile的ONBUILD指令
  6. linux挂载wondiws目录,linux cifs自动挂载windows硬盘或文件夹
  7. 详解使用VueJS开发项目中的兼容问题
  8. mysql 安全问题_浅谈MySQL数据库的Web安全问题
  9. 八皇后-韩顺平java
  10. centos7安装wget
  11. npm安装依赖报错:npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\misal\AppData\R
  12. Winrar 4.0破解
  13. 合天网安实验室CTF-解密100-Funny Crypto
  14. (困难)SQL练习25:获取员工其当前的薪水比其manager当前薪水还高的相关信息
  15. 为什么程序员面试官总喜欢问你有什么技术亮点?
  16. python 3教程:基于python3实现倒叙字符串
  17. 使用自然语言处工具HanLP获取人名
  18. java 线框图_十个完全免费的网页原型(线框图)工具
  19. 计算机架构设计的8个伟大思想
  20. openwrt linux rootfs 分区表,arm盒子快速移植OpenWrt rootfs

热门文章

  1. NLP-基础任务-中文分词算法(1)-基于词典: 机械分词(词典字符串匹配):前向最大匹配、后向最大匹配、双向最大匹配【OOV:基于现有词典,不能进行新词发现处理】
  2. PHP孟加拉钢厂_孟加拉国帕德玛大桥合龙
  3. shell字符串,字符数组,遍历
  4. 自定义控件 仿微信朋友圈文字展开全文功能
  5. 常用ASCII URL编码对照表,JavaScript中如何把url的%20、%22、%28、%29、%7B、%7D解析还原成真实的字符
  6. 关于C语言延时时间的问题
  7. android hwcomposer
  8. unity3d Daikon GUI 图片查看器 Demo 说明
  9. 乌鸦搜索算法和粒子集群算法_乌鸦和乌鸦
  10. Vss2005 的使用方法