题干:

给定一个有n个数的序列a1,a2, ..., an

你每次可以将序列中一个数删去,剩下的数会被分割为一段一段连续的数列

给定一个删除数的顺序,问在每次删除之后,剩下的连续的数列中,数列和的最大值为多少

Input

第一行输入仅有一个正整数n(1<=n<=100000)

第二行包括n个整数a1,a2, ..., an(0<=ai<=1,000,000,000)

第三行为n个正整数的一个全排列,为删除元素的顺序。

Examples

Input

4
1 3 2 5
3 4 1 2

Output

5
4
3
0

Input

5
1 2 3 4 5
4 2 3 5 1

Output

6
5
5
1
0

Input

8
5 5 4 4 6 6 5 5
5 2 8 7 1 3 4 6

Output

18
16
11
8
8
6
6
0

Note

Consider the first sample:

  1. Third element is destroyed. Array is now 1 3  *  5. Segment with maximum sum 5consists of one integer 5.
  2. Fourth element is destroyed. Array is now 1 3  *   * . Segment with maximum sum 4consists of two integers 1 3.
  3. First element is destroyed. Array is now  *  3  *   * . Segment with maximum sum 3consists of one integer 3.
  4. Last element is destroyed. At this moment there are no valid nonempty segments left in this array, so the answer is equal to 0.

解题报告:

倒着考虑操作,并查集维护最大值即可。具体就是如果当前操作位置idx,如果左边已经操作过,那就可以想做合并,同理可以向右合并,注意a[i]可以为0,所以不能用sum数组来判断是否出现过,而应该新开一个数组ok来记录。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int n,op[MAX],f[MAX];
ll a[MAX],sum[MAX],ans[MAX],mx;
int getf(int v) {return f[v] == v ? v : f[v] = getf(f[v]);
}
void merge(int u,int v) {int t1 = getf(u),t2 = getf(v);if(t1 == t2) return;f[t2] = t1;sum[t1] += sum[t2];mx = max(mx,sum[t1]);
}
bool ok[MAX];
int main()
{cin>>n;for(int i = 1; i<=n; i++) scanf("%lld",a+i),f[i] = i;for(int i = 1; i<=n; i++) scanf("%d",op+i);for(int i = n; i>=1; i--) {sum[op[i]] = a[op[i]];ok[op[i]]=1;mx = max(mx,sum[op[i]]);if(ok[op[i]+1] != 0) merge(op[i],op[i]+1);if(ok[op[i]-1] != 0) merge(op[i],op[i]-1);ans[i]=mx;}for(int i = 2; i<=n; i++) printf("%lld\n",ans[i]);puts("0");return 0 ;
}

【CodeForces - 722C】Destroying Array(并查集,时光倒流)相关推荐

  1. 第 254 场力扣周赛(KMP、贪心、快速幂、二分+多源bfs、并查集 + 时光倒流)

    第 254 场力扣周赛 稀里糊涂双眼双眼惺忪的做了三道,错了4次...还是600来名 5843. 作为子字符串出现在单词中的字符串数目 题目描述 给你一个字符串数组 patterns 和一个字符串 w ...

  2. CodeForces - 722C Destroying Array (并查集/集合的插入和删除)

    原题链接:https://vjudge.net/problem/511814/origin Description: You are given an array consisting of n no ...

  3. CodeForces - 722C Destroying Array(倒着并查集+离线处理)

    题目链接:点击查看 题目大意:给出一个数列a,现在给出操作b,每次操作都会删除掉数列a中指定位置的数,问每次删除后,最大连续字段和是多少 题目分析:一开始看到最大连续字段和,以为是要用dp,又看了一下 ...

  4. Codeforces 722C. Destroying Array

    C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. CodeForces 722C Destroying Array

    并查集,离线操作. 将操作倒着进行,一开始所有数字都没有加入到数组中,然后倒着一个一个加入,更新最大值. #pragma comment(linker, "/STACK:1024000000 ...

  6. codeforces 722C Destroying Array

    题意:给出长度为n的序列,每次去掉一个数,使得序列分成几块,问当前权值最大块的权值. 思路:提供两种,第一种用multiset和前缀和直接暴力模拟. 第二种用并差集,假设坐标i为一个去掉的数,那么f[ ...

  7. Codeforces C. Destroying Array

    C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. CodeForces - 123A prime permutation(并查集,水题)

    题目链接:点击查看 题目大意:给出一个字符串s,问能否通过重组其字母顺序,从而满足:若字符串下标从1开始,对于每一个质数下标,满足 题目分析:其实在纸上稍微写写画画就能看出个大概的规律,当字符串的长度 ...

  9. CodeForces - 468B Two Sets(并查集+思维)

    题目链接:点击查看 题目大意:现在给出两个集合A和B,再给出两个数a和b,现在规定在集合A中的数x必须满足x和a-x同时在集合a中,而在集合B中的数x也同样需要满足x和b-x同时在集合B中,现在给出一 ...

  10. Harmonious Graph CodeForces - 1253D(思维+并查集)

    You're given an undirected graph with n nodes and m edges. Nodes are numbered from 1 to n. The graph ...

最新文章

  1. 微信小程序的数字有部分会自动加粗的解决方法
  2. 1.6万亿参数,秒杀GPT-3!谷歌推出超级语言模型Switch Transformer,比T5快4倍
  3. Adam公式+参数解析
  4. 链接写不到txt文件该怎么办呢
  5. 解决:delphi7 license is invalid or has expired
  6. mysql seconds_behind_master_MySQL中的seconds_behind_master的理解
  7. 腾讯:干掉头条,先拿抖音开刀!
  8. python使用级数pi的近似值_JavaScript与Python计算pi的近似值运行时间对比
  9. python界面-Python GUI 编程(Tkinter)
  10. oracle sql 导入mysql数据库备份_使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复...
  11. octave c++函数中调用fortran77子程序
  12. 用matlab模拟3电荷,基于Matlab模拟点电荷电场线和等势线
  13. 高等代数——大学高等代数课程创新教材(丘维声)——1.3笔记+习题
  14. 教职工信息管理系统(C++)
  15. android apk反编译(Doapk工具和dex2jar工具介绍)
  16. python输出姓名_Python简单生成随机姓名的方法示例
  17. Ionic之自定义icon大小
  18. ICCV2021中的时序动作检测算法
  19. 从零搭建Spring Boot脚手架(2):增加通用的功能(转载)
  20. 你都为美白缴过哪些智商税? | Alfred数据室

热门文章

  1. 制作完整的java可执行文件
  2. 工程中选择数据结构和算法的依据
  3. [算法][二分查找][排除法]
  4. python可以开发exe软件吗_python能开发exe软件吗
  5. python抓取交易所_Python百行代码抓取美股三大交易所历史数据
  6. for循环数据量太大_中文文本分类roberta大力出奇迹之数据量大的问题
  7. Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件
  8. 如何根据原理图画封装_常用原理图封装
  9. 芯片设计中的latch_Latch-up (闩锁效应)
  10. 让一个动画一直执行的属性是_iOS 动画 一