原题中需要求解的是按照它给定的操作次序,即每次删掉一个数字求删掉后每个区间段的和的最大值是多少。
  正面求解需要维护新形成的区间段,以及每段和,需要一些数据结构比如 map 和 set。 map<int, LL>interval2Sum来维护区间段(u->v),mulitset<LL>sum 来维护最大值。那么每次删除操作后,都需要去interval2Sum中找到对应区间,然后erase掉,
重新生成left -> delId -> right两个区间段,最后在maxSum中删掉原有的sum值 ,加入新形成的两短sum。正面刚的话,因为map 和 set的高效性 log级别所以速度还是不错的。(代码转自Codeforces : Ra16bit)
  

#include <bits/stdc++.h>
using namespace std;
int n,i,a,le,ri;
long long s[];
map<int, long long> all;
multiset<long long> sum;
int main() {
scanf("%d",&n);
for (i=; i<=n; i++) {
scanf("%d",&a);
s[i]=s[i-]+a;
}
all[]=n;
sum.insert(-s[n]);
for (i=; i<=n; i++) {
scanf("%d",&a);
auto it=all.lower_bound(a);
it--;
le=it->first;
ri=it->second;
sum.erase(sum.find(s[le]-s[ri]));
all.erase(it);
if (le+<a) {
all[le]=a-;
sum.insert(s[le]-s[a-]);
}
if (a<ri) {
all[a]=ri;
sum.insert(s[a]-s[ri]);
}
if (i==n) puts(""); else printf("%I64d\n",-*sum.begin());
}
return ;
}

  反向思路,从删掉了最后一个元素开始。一个个恢复。判断左右是否有已经恢复的元素然后在区间内归并元素,用并查集来判断区间所属。那么区间段值不断增大,最后得到结果。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define LL long long
using namespace std; const int Maxn = ;
int n, delId[Maxn], par[Maxn], used[Maxn];
LL a[Maxn], b[Maxn], ans[Maxn]; int find(int x)
{
return (par[x] == x)?x: find(par[x]);
} int main()
{
cin>>n;
for(int i = ; i < n; i ++){
scanf("%lld",&a[i]);
par[i] = i;
used[i] = ;
}for(int i = ; i < n; i ++){
scanf("%d",&delId[i]);
delId[i] --;
}
for(int i = n - ; i >= ; i --){
int index = delId[i];
used[index] = ;
b[index] += a[index];
if(used[index - ] && index){
int fa = find(index - );
b[fa] += a[index];
par[index] = fa;
}if(used[index + ] && index != n - ){
int newFa = find(index), oldFa = find(index + );
par[oldFa] = newFa;
b[newFa] += b[oldFa];
}
ans[i] = max(ans[i + ], b[find(index)]);
}
for(int i = ; i <= n; i ++){
cout<<ans[i]<<" ";
}cout<<endl;
return ;
}
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:

  1. Third element is destroyed. Array is now 1 3  *  5. Segment with maximum sum 5 consists of one integer 5.
  2. Fourth element is destroyed. Array is now 1 3  *   * . Segment with maximum sum 4 consists of two integers 1 3.
  3. First element is destroyed. Array is now  *  3  *   * . Segment with maximum sum 3 consists 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.

Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array -- 逆向思维的更多相关文章

  1. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A B C D 水 模拟 并查集 优先队列

    A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) B. Verse Pattern 水题

    B. Verse Pattern 题目连接: http://codeforces.com/contest/722/problem/B Description You are given a text ...

  3. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)

    A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)(set容器里count函数以及加强for循环)

    题目链接:http://codeforces.com/contest/722/problem/D 1 #include <bits/stdc++.h> #include <iostr ...

  5. 二分 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D

    http://codeforces.com/contest/722/problem/D 题目大意:给你一个没有重复元素的Y集合,再给你一个没有重复元素X集合,X集合有如下操作 ①挑选某个元素*2 ②某 ...

  6. 线段树 或者 并查集 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C

    http://codeforces.com/contest/722/problem/C 题目大意:给你一个串,每次删除串中的一个pos,问剩下的串中,连续的最大和是多少. 思路一:正方向考虑问题,那么 ...

  7. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets 贪心

    D. Generating Sets 题目连接: http://codeforces.com/contest/722/problem/D Description You are given a set ...

  8. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 带权并查集

    C. Destroying Array 题目连接: http://codeforces.com/contest/722/problem/C Description You are given an a ...

  9. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A. Broken Clock 水题

    A. Broken Clock 题目连接: http://codeforces.com/contest/722/problem/A Description You are given a broken ...

  10. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array

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

随机推荐

  1. Windows下Unity安装

    安装教程: https://www.paws3d.com/lesson/us-0101/ 问题1: 安装并完成注册后,在网页上能登录,但打开Unity时不能启动成功,一直停留在如下界面 解决方案:断网 ...

  2. [CodeForces] CF226D The table

    Harry Potter has a difficult homework. Given a rectangular table, consisting of n × m cells. Each ce ...

  3. node.js 中的package.json文件怎么创建?

    最近在用webstorm和nodejs做一些东西,老是各种混乱,今天上午创建一个新的项目,结果发现,npm init之后,并没有出现package.json,并没有太明确他的功能的小姑娘表示十分的惊慌 ...

  4. HTML解析库BeautifulSoup4

    BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间. BeautifulSoup也是有官方中文 ...

  5. [HZOI 2016]tree—增强版

    [HZOI 2016]tree—增强版 注意事项 为了体现增强版,题目限制和数据范围有所增强: 时间限制:1.5s 内存限制:128MB 对于15% 的数据,1<=N,Q<=1000. 对 ...

  6. Introduction(本书简介)

    本书简介 本书将从三个方面权威的阐述如何提高.net app 性能问题: 验证.测量性能指标,然后辨别它是否超过度量 从内存管理.网络.I/O.并发等方面提高应用程序的性能 通过CLR的详细的设计细节 ...

  7. cogs 315. [POJ3255] 地砖RoadBlocks

    315. [POJ3255] 地砖RoadBlocks ★★★   输入文件:block.in   输出文件:block.out   简单对比时间限制:1 s   内存限制:128 MB Descri ...

  8. AngularJS:日期转换字符

    JS有很多类库提供日期转换函数,AngularJS也不例外.可以通过$filter来完成转换,方法如下: $filter('date')(sourceDate, "yyyy/MM/dd&qu ...

  9. NGINX之——配置HTTPS加密反向代理訪问–自签CA

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46695495 出于公司内部訪问考虑,採用的CA是本机Openssl自签名生成的,因 ...

  10. 计算几何 二维凸包问题 Andrew算法

    凸包:把给定点包围在内部的.面积最小的凸多边形. Andrew算法是Graham算法的变种,速度更快稳定性也更好. 首先把全部点排序.依照第一keywordx第二keywordy从小到大排序,删除反复 ...