CodeForces 722C Destroying Array(数组删除区间最大值)
2016-10-11 22:15
405 查看
http://codeforces.com/contest/722/problem/C
C. Destroying Array
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given an array consisting of n non-negative integers a1, a2, ..., an.
You are going to destroy integers in the array one by one. Thus, you are given the permutation of integers from 1 to n defining
the order elements of the array are destroyed.
After each element is destroyed you have to find out the segment of the array, such that it contains no destroyed elements and the sum of its elements is maximum possible. The sum of elements in the empty segment is considered to be 0.
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) —
the length of the array.
The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).
The third line contains a permutation of integers from 1 to n —
the order used to destroy elements.
Output
Print n lines. The i-th
line should contain a single integer — the maximum possible sum of elements on the segment containing no destroyed elements, after first i operations
are performed.
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:
Third element is destroyed. Array is now 1 3 * 5. Segment with maximum sum 5 consists
of one integer 5.
Fourth element is destroyed. Array is now 1 3 * * . Segment with maximum sum 4 consists
of two integers 1 3.
First element is destroyed. Array is now * 3 * * . Segment with maximum sum 3 consists
of one integer 3.
Last element is destroyed. At this moment there are no valid nonempty segments left in this array, so the answer is equal to 0.
题意:
给定两组数字,第一组是数字的大小,第二组是删除的次序,问删除后的最大区间和思路:
并查集反向建立关系图即可ac code:
#include<stdio.h> #include<cstring> #include<algorithm> #define AC main() using namespace std; typedef __int64 LL; const int MYDD = 1103 + 1e5; int Set[MYDD], pos[MYDD]; LL Ans[MYDD], a[MYDD], sum[MYDD]; bool used[MYDD]; void init(int n) { for(int j = 0; j <= n; j++){ Set[j] = j; used[j] = 0;//标记未使用 sum[j] = 0;//临时记录的和 } } int Find(int x) { return x == Set[x] ? x:Find(Set[x]); } void Combine(int x, int y) { int fx = Find(x), fy = Find(y); if(fx != fy) { Set[fx] = fy; sum[fy] += sum[fx]; } } int AC { // while(1) { int n; scanf("%d", &n); init(n); for(int j = 1; j <= n; j++) scanf("%I64d", &a[j]); for(int j = 1; j <= n; j++) scanf("%d", &pos[j]); LL tmp = 0; for(int j = n; j >= 1; j--) { int Now = pos[j]; sum[Now] = a[Now]; used[Now] = 1; if(Now < n && used[Now+1]) Combine(Now, Now+1); if(Now > 1 && used[Now-1]) Combine(Now, Now-1); Ans[j] = tmp; tmp = max(tmp, sum[Find(Now)]); } for(int j = 1; j <= n; j++) printf("%I64d\n", Ans[j]); // } return 0; }
相关文章推荐
- POJ 3616【数状数组求区间最大值 + 简单DP】
- hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)
- codeforces 366D 求1-n点最大区间长度 枚举区间左端+二分区间右端dfs判可行
- 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值
- 一维数组的增加,删除,找最大数
- [HDU 1754]I Hate It[树状数组查询+更新区间最大值]
- Codeforces 703D Mishka and Interesting sum (树状数组求区间内不同的数的异或和)
- [POJ 3264]Balanced Lineup[树状数组查询区间最大最小值]
- Maximum Subarray:数组中最大连续区间和
- 求数组中区间中最小数*区间所有数和的最大值
- 【MOOC·数据结构】求数组区间两个最大整数
- 树状数组维护区间最大值
- codeforces 703D Mishka and Interesting sum (树状数组区间异或)
- codeforces 777E. Hanoi Factory (LIS+dp+树状数组/线段树维护区间最大值及单点更新)
- Codeforces_427B_Prison Transfer(一维RMQ区间查询最大值)
- python如何将数组分成几个区间,取每个区间的最大值存到另一个数组里
- CodeForces 474E Pillars(线断树区间最大)
- 给定二叉搜索树和两个整数A,B (最小整数和最大整数)。如何删除不在该区间内的元素(剪枝)
- 树状数组求区间最大值
- 【BZOJ1012】【树状数组求区间最值】最大数maxnumber