题意

输入一个含有 n(1≤n≤100000) 个非负整数的 a 数组和一个 1~n 的排列 p 数组,求每次删除 a[p[i]] 后,最大连续子段和(不能跨越被删除的)是多少?

分析

因为都是非负整数,答案一定是尽量长的区间和。

s[i] 表示 a 的前缀和,区间(l,r]的和就是s[r]-s[l]。

我们用 STL 里的 set 存区间,一开始只有(0,n]区间,删去第一个数后,就要去掉(0,n]区间,加上(0,p[1]-1]和(p[1],n]区间,类似地每次删除一个数,就要去掉包含它的区间,加上两个新区间,同时用 multiset 储存下区间和,每次输出最大的区间和,删除时也删除掉对应的区间和。

需要注意的细节:

  • set 和 multiset 默认是按从小到大排序,输出最大的只要输出最后一个就可以了;
  • 删除区间和时,因为 multiset 的 erase(value) 会把等于value的元素都删除,只删除一个的话,要先find,再erase;
  • 存区间 make_pair(终点,起点)这样就可以按终点从小到大排序
  • 包含第p个数的区间就是 lower_bound (make_pair(p,0))
  • 增加完对应的区间再删去原来的区间(就是代码里的it)。

URL:http://codeforces.com/contest/722/problem/C

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 100005
using namespace std;
int n;
ll s[N];
set< pair<int,int> > seg;
multiset<ll> sum;
void erase(int p){
set< pair<int,int> > ::iterator it=seg.lower_bound(make_pair(p,));
sum.erase(sum.find(s[it->first]-s[it->second])); seg.insert(make_pair(p-,it->second)),sum.insert(s[p-]-s[it->second]);
seg.insert(make_pair(it->first,p)),sum.insert(s[it->first]-s[p]);
seg.erase(it);
}
ll max(){
multiset<ll> ::reverse_iterator mit=sum.rbegin();
return *mit;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int a;
scanf("%d",&a);
s[i]=s[i-]+a;
}
seg.insert(make_pair(n,));
sum.insert(s[n]);
for(int i=;i<=n;i++){
int p;
scanf("%d",&p);
erase(p);
printf("%I64d\n",max());
}
}

  

看到一个不用set且更快的代码,大概思路是,倒过来依次放上删除的数,然后找最大连续和。

#include<bits/stdc++.h>
using namespace std;
int x[],y[],Seg[][];
long long sum[],maxm;
bool memo[];
vector<long long> ans;
int main()
{
int n,i; scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&x[i]);
for(i=;i<=n;i++) scanf("%d",&y[i]);
for(i=;i<=n;i++)
sum[i] = x[i] + sum[i-];
for(i=n;i>;i--)
{
// y[i] == ME ( element to be built )
Seg[y[i]][] = y[i];
Seg[y[i]][] = y[i];
memo[y[i]] = ;
if(memo[y[i]-])
Seg[y[i]][] = Seg[y[i]-][];
if(memo[y[i]+])
Seg[y[i]][] = Seg[y[i]+][];
Seg[Seg[y[i]][]][] = Seg[y[i]][];
Seg[Seg[y[i]][]][] = Seg[y[i]][];
maxm = max(maxm,sum[Seg[y[i]][]] - sum[Seg[y[i]][]-]);
ans.push_back(maxm);
}
for(i=ans.size()-;i>=;i--)
printf("%I64d\n",ans[i]);
printf("0\n");
}

【Codeforces 722C】Destroying Array (数据结构、set)的更多相关文章

  1. Codeforces 722C. Destroying Array

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

  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 (并查集)

    题意:给定 n 个数,然后每次破坏一个位置的数,那么剩下的连通块的和最大是多少. 析:用并查集来做,从后往前推,一开始什么也没有,如果破坏一个,那么我们就加上一个,然后判断它左右两侧是不是存在,如果存 ...

  4. [并查集+逆向思维]Codeforces Round 722C Destroying Array

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

  5. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array -- 逆向思维

    原题中需要求解的是按照它给定的操作次序,即每次删掉一个数字求删掉后每个区间段的和的最大值是多少. 正面求解需要维护新形成的区间段,以及每段和,需要一些数据结构比如 map 和 set. map< ...

  6. 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 ...

  7. CF722C. Destroying Array[并查集 离线]

    链接:Destroying Array C. Destroying Array time limit per test 1 second memory limit per test 256 megab ...

  8. Codeforces 482B Interesting Array(线段树)

    题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...

  9. Codeforces 1077C Good Array 坑 C

    Codeforces 1077C Good Array https://vjudge.net/problem/CodeForces-1077C 题目: Let's call an array good ...

随机推荐

  1. Nginx负载均衡配置

    1.yum安装nginx yum install nginx 2.启动nginx chkconfig nginx on   service nginx start向web服务器中放入测试文件: < ...

  2. dubbo2.5.3 与spring 3.1.x 冲突

    在集成了dubbo2.5.3 的项目中初始化出现 MalformedParameterizedTypeException 检查发现这是因为dubbo2.5.3依赖的springframeworks是2 ...

  3. PAT 1018. 锤子剪刀布 (20)

    现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行给出正整数N(<=105),即双方交锋的次数.随后N行,每行给出一次交锋的信息,即 ...

  4. 苹果系统里面部署ASP.NET

    需要在global文件里设置一下 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterCon ...

  5. [转]Class 'Think\Log' not found

    转自:http://www.thinkphp.cn/topic/26815.html 解决偶尔出现 Class 'Think\Log' not found 的奇葩问题(并非每次必现,偶尔删除缓存可以解 ...

  6. 大数据下多流形聚类分析之谱聚类SC

    大数据,人人都说大数据:类似于人人都知道黄晓明跟AB结婚一样,那么什么是大数据?对不起,作为一个本科还没毕业的小白实在是无法回答这个问题.我只知道目前研究的是高维,分布在n远远大于2的欧式空间的数据如 ...

  7. 通过源码分析MyBatis的缓存

    前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ MyBatis缓存介绍 首先看一段wiki上关于MyBatis缓存的介绍 ...

  8. 简单谈谈dom解析xml和html

    前言 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.html,xml都是基于这个模型构造的.这也是一个W3C推出的标准.j ...

  9. QTableView 添加进度条

    记录一下QTableView添加进度条 例子很小,仅供学习 使用QItemDelegate做的实现 有自动更新进度 要在.pro文件里添加 CONFIG += c++ ProgressBarDeleg ...

  10. C#操作XML方法集合

    一 前言 先来了解下操作XML所涉及到的几个类及之间的关系  如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家 * 1 XMLElement 主要是针对节点的一些属性进行操 ...