codeforces 1326 E.Bombs

题意:

给定[1,n][1,n][1,n]的排列p,q,将pip_ipi​依次加入初始为空的集合S,qiq_iqi​的值表示第i次加入的值为bomb。若加入的是bomb就把当前集合最大值从集合中移出(先加再移出)。现在规定对于每一个i,q1...qi−1q_1...q_{i-1}q1​...qi−1​都是bomb。求对于每一个i∈[1,n]i∈[1,n]i∈[1,n]每次操作后集合中的最大值。

题解:

  1. 首先bomb越多,最大值一定不会变的更大,所以该序列一定为非递增序列。
  2. 用线段树维护一下每个节点右侧炸弹的个数 - 右侧大于 x 的数的个数 ,显然对于每个节点而言,如果这个值大于等于 0 的话,那么 x + 1 及以上的答案是肯定不可能的,因为全都被炸弹炸没了,我们就可以用一个 while 维护符合条件的答案了,又因为我们需要所有的答案都大于等于 0 时才满足条件,所以我们只需要维护一下区间最小值就好了,最小值如果大于等于 0 的话,那么就说明所有节点都满足这个条件了。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
const int N = 3e5 + 100;
int pos[N];
struct Node{int l, r, mmin, lazy;
} tree[N << 2];void build(int k, int l, int r){tree[k].l = l;tree[k].r = r;tree[k].lazy = tree[k].mmin = 0;if (l == r)return;int mid = l + r >> 1;build(k << 1, l, mid);build(k << 1 | 1, mid + 1, r);
}void pushdown(int k){if(tree[k].lazy){int lz = tree[k].lazy;tree[k].lazy = 0;tree[k << 1].mmin += lz;tree[k << 1].lazy += lz;tree[k << 1 | 1].mmin += lz;tree[k << 1 | 1].lazy += lz;}
}void pushup(int k){tree[k].mmin = min(tree[k << 1].mmin, tree[k << 1 | 1].mmin);
}void update(int k, int l, int r, int val){if(tree[k].l > r || tree[k].r < l)return;if(tree[k].l >= l&&tree[k].r <= r){tree[k].mmin += val;tree[k].lazy += val;return;}pushdown(k);update(k << 1, l, r, val);update(k << 1 | 1, l, r, val);pushup(k);
}int main(){ios_base::sync_with_stdio(false);int n;cin >> n;build(1, 1, n);for (int i = 1; i <= n; i++){int num;cin >> num;pos[num] = i;}int ans = n + 1;for (int i = 1; i <= n; i++){int q; cin >> q;while(tree[1].mmin >= 0){ans--;update(1, 1, pos[ans], -1);}cout << ans << " ";update(1, 1, q, 1);}return 0;
}

codeforces 1326 E.Bombs相关推荐

  1. Codeforces 1326 E. Bombs (线段树)

    题目链接 题目大意: 一个序列p和一个序列q.按p1p2-pn将炸弹放到第1,2,-n的位置之上,每个炸弹都有一个值,然后q的序列是表示当前qi的位置上已经存在炸弹,如果已经存在炸弹,就把当前已经放的 ...

  2. 【codeforces 350C】Bombs

    [链接] 我是链接,点我呀:) [题意] [题解] 会发现在x轴以及y轴上的炸弹,能用较少的操作数除掉. 而其他的点,会发现操作数都是一样的. 那么先把x,y轴上的点都除掉. 其他点. 我们优先沿着横 ...

  3. Codeforces - Bombs

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

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

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

  5. CodeForces - 1326E Bombs(线段树+思维)

    题目链接:点击查看 题目大意:给出一个 n 的排列记为 p[ i ] ,现在有一个初始时为空的集合A,对于每个 i 遍历 1 ~ n ,每次的操作如下: 向集合中添加 p[ i ] 如果位置 i 有炸 ...

  6. Codeforces Global Round 7 E. Bombs(线段树)

    题目: 给你一个置换,p1,p2,-,pn.假设排列的某些位置包含炸弹,这样至少存在一个没有炸弹的位置.对于某些固定的炸弹配置,请考虑以下过程.最初,有一个空集合,A.对于从1到n的每个i:将pi添加 ...

  7. Bombs CodeForces - 350C

     题意:给定n个炸弹和炸弹的坐标,要求把所有炸弹拆除而且拆炸弹时不能踩到其它炸弹 题解:直接按路径长度排序然后拆就行了 #include<iostream> #include<cst ...

  8. Codeforces 1326F Wise Men (容斥原理、状压 DP、划分数)

    题目链接 F1: https://codeforces.com/contest/1326/problem/F1 F2: https://codeforces.com/contest/1326/prob ...

  9. Codeforces 1326F Wise Men (容斥原理、状压 DP、子集和变换、划分数)

    题目链接 F1: https://codeforces.com/contest/1326/problem/F1 F2: https://codeforces.com/contest/1326/prob ...

最新文章

  1. 恢复Linux误删除文件系列之scalpel工具
  2. github新建repositories后import已有code 随后同步更新
  3. 关于SQL视图的创建和使用方法
  4. 神奇的用法_续行符——反斜杠
  5. 高晓松谈管理:自嘲总被员工管
  6. oninput,onpropertychange,onchange的使用方法和差别
  7. 拯救不靠谱:他是怎样将技术外包做到纠纷率3%?
  8. CRC32(Cyclic Redundancy Check)循环冗余校验:推导
  9. 爱奇艺开源轻量级插件化方案 Neptune
  10. WebStorm 自定义字体+颜色+语法高亮+导入导出用户设置
  11. u盘锁电脑_如何给u盘设置密码 给u盘设置密码方法【步骤详解】
  12. unordered_set/unordered_map 增删查操作
  13. java 基础知识2
  14. 34.卷1(套接字联网API)---常用函数
  15. 解决进入XP系统无法响应故障
  16. linux创建目录快捷方式,linux创建快捷方式命令
  17. maya如何查看资源大纲_怎样才算入门了Maya
  18. 学会“狼”的思维(二)
  19. 填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)...
  20. Java判断一个字符串是否有中文

热门文章

  1. 基于cc3200开发
  2. C语言关于qsort函数的用法详细说明
  3. java线程状态和状态切换
  4. oracle创建用户saler,Linux环境下sqlldr一个csv文件
  5. 比bitblt和stretchblt效率更高的函数
  6. KL Divergence 与 JS Divergence
  7. 2022hit计算机系统大作业
  8. self training
  9. Google chrome谷歌浏览器,打开后是百度搜索或其他搜索怎么办?
  10. 手把手教你学习Solidity|Solidity开发【一】