CF1326E Bombs(思维题)
题意
给出一个排列 {pi}\{p_i\}{pi},同时给出一个炸弹顺序 {qi}\{q_i\}{qi},第 iii 颗炸弹放在第 qiq_iqi 处。每次从左往右加入 pip_ipi,遇到炸弹时炸掉当前最大值。输出放前 iii 颗炸弹最终序列的最大值(i=0,1,2...,n−1i=0,1,2...,n-1i=0,1,2...,n−1)。
分析
这题真是巧妙啊!我太蒻了!
首先,ansi≥ansi+1ans_i\geq ans_{i+1}ansi≥ansi+1。于是我们每次要得到 ansi+1ans_{i+1}ansi+1,只需要从 ansians_iansi 不断减 111 减过来即可。那么要减多少次 111 呢?这就要观察答案的性质了。
当 ans<xans<xans<x 时,有以下事实:
每个大于等于 xxx 的数 vvv 都会被炸掉!也就是说,每个 vvv 后面都有一个炸弹专门炸它的。每个 vvv 和离它最近的炸弹形成一个匹配。
那么,我们让每个 vvv 所在位置 +1+1+1,让每个炸弹所在位置 −1-1−1,令 bib_ibi 为 [i,n][i,n][i,n] 的后缀和。(有点像括号序列)
现在 ans<xans<xans<x 的条件即为:对于每个 bib_ibi,bi≤0b_i\leq 0bi≤0。
所以我们用线段树找到最大的 bib_ibi 即可。
每次加数或者遇到炸弹都是修改一个区间的后缀和,用线段树实现区间加即可。
时间复杂度 O(nlogn)O(nlogn)O(nlogn)
此题的关键在于每次判断 ansansans 要减到多少,然而我太蒻了根本不会QAQ
代码如下
#include <bits/stdc++.h>
#define N 300005
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
int p[N], q[N];
LL val[N * 4], tag[N * 4];
void pushdown(int rt){if(tag[rt]){tag[rt << 1] += tag[rt];tag[rt << 1 | 1] += tag[rt];val[rt << 1] += tag[rt];val[rt << 1 | 1] += tag[rt];tag[rt] = 0;}
}
void update(int l, int r, int rt, int a, int b, int c){if(l >= a && r <= b){val[rt] += c;tag[rt] += c;return;}pushdown(rt);int m = l + r >> 1;if(a <= m) update(lson, a, b, c);if(b > m) update(rson, a, b, c);val[rt] = max(val[rt << 1], val[rt << 1 | 1]);
}
int main(){int i, j, n, m, ret;scanf("%d", &n);for(i = 1; i <= n; i++) scanf("%d", &j), p[j] = i;for(i = 1; i <= n; i++) scanf("%d", &q[i]);ret = n;update(1, n, 1, 1, p[ret], 1);printf("%d ", ret);for(i = 1; i < n; i++){update(1, n, 1, 1, q[i], -1);while(val[1] <= 0){ret--;update(1, n, 1, 1, p[ret], 1);}printf("%d ", ret);}return 0;
}
CF1326E Bombs(思维题)相关推荐
- little w and Soda(思维题)
链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- ZOJ 3829 贪心 思维题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...
- yoyo思维题(困难) 组合数学
问题 B: yoyo思维题(困难) 时间限制: 1 Sec 内存限制: 256 MB 提交: 11 解决: 3 [提交][状态][讨论版][命题人:qianyouyou][Edit] [TestD ...
- 1884: 三个家庭(思维题)
1884: 三个家庭 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 244 Solved: 81 [Submit][Status][Web Board] ...
- 思维题 UVA 10881 Piotr's Ants
题目传送门 1 /* 2 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 3 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 4 关键2:蚂蚁的相对位置 ...
- CF--思维练习-- CodeForces - 215C - Crosses(思维题)
ACM思维题训练集合 There is a board with a grid consisting of n rows and m columns, the rows are numbered fr ...
- ACM思维题训练 Section A
题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...
- CodeForces - 1102A(思维题)
https://vjudge.net/problem/2135388/origin Describe You are given an integer sequence 1,2,-,n. You ha ...
- ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
题干: Each New Year Timofey and his friends cut down a tree of n vertices and bring it home. After tha ...
- 【HDU - 2203】 亲和串 (思维题,可选KMP)
题干: Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了, ...
最新文章
- TNS-12560: TNS: 协议适配器错误 Oracle11g 创建数据库中问题处理(必须运行Netca以配置监听程序)
- mysql外键引用语法_mysql – 外键语法
- Flink中的状态管理
- linux arm寄存器,ARM寄存器总结
- SaltStack Salt 开源管理框架修复2个严重漏洞,多款开源产品等受影响
- JavaScript视频教程
- 一键修改分辨率bat_设置分辨率的批处理 | 学步园
- Web前端面试:这40个经典Web前端面试题面试者必看!
- 今天开始写博客记录程序媛成长过程
- C++ 如何改变鼠标光标位置
- 二进制转8421bcd码_码制 || BCD码 || 格雷码 || 奇偶校验码 || 字母数字码 || 数电
- 人这一辈子,都在为选择买单
- 基于SVM算法的男女生分类器
- 使用rest_framework的routers模块添加路由
- 面试|复习小册(2022-9)
- 玩客云root成功一键获取root权限
- 从零开始安装VMwareTools的详细步骤
- centos7安装gitlab-ce社区版全过程,详细到爆炸
- 哔哩哔哩视频下载(python3+asyncio+断点续传+有注释)
- 【Python】找到含有指定关键词的PDF