【Codeforces 722C】Destroying Array (数据结构、set)
题意
输入一个含有 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)的更多相关文章
- Codeforces 722C. Destroying Array
C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...
- CodeForces - 722C Destroying Array (并查集/集合的插入和删除)
原题链接:https://vjudge.net/problem/511814/origin Description: You are given an array consisting of n no ...
- CodeForces 722C Destroying Array (并查集)
题意:给定 n 个数,然后每次破坏一个位置的数,那么剩下的连通块的和最大是多少. 析:用并查集来做,从后往前推,一开始什么也没有,如果破坏一个,那么我们就加上一个,然后判断它左右两侧是不是存在,如果存 ...
- [并查集+逆向思维]Codeforces Round 722C Destroying Array
Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array -- 逆向思维
原题中需要求解的是按照它给定的操作次序,即每次删掉一个数字求删掉后每个区间段的和的最大值是多少. 正面求解需要维护新形成的区间段,以及每段和,需要一些数据结构比如 map 和 set. map< ...
- 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 ...
- CF722C. Destroying Array[并查集 离线]
链接:Destroying Array C. Destroying Array time limit per test 1 second memory limit per test 256 megab ...
- Codeforces 482B Interesting Array(线段树)
题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...
- Codeforces 1077C Good Array 坑 C
Codeforces 1077C Good Array https://vjudge.net/problem/CodeForces-1077C 题目: Let's call an array good ...
随机推荐
- sql语句常用说明与解析
from: http://www.cnblogs.com/rainman/archive/2013/05/01/3053703.html#m3
- 在移动端如何选择字体大小和布局的单位,px或dp?
android开发中,文字大小的单位是sp,非文字的尺寸单位用dp,但是我们在设计稿用的单位是px.这些单位如何换算,是设计师.开发者需要了解的关键. 简单理解的话,px(像素)是我们UI设计师在PS ...
- HTML 学习笔记 CSS(列表)
CSS列表属性允许你放置 改变列表项标志 或者将图像作为列表项标志. CSS列表 从某中意义上讲 不是描述性的文本的任何内容都可以认为是列表.人口普查.太阳系.家谱.参观菜单,甚至你的所有朋友都可以表 ...
- git push上传代码到gitlab上,报错401或403
之前部署的gitlab代码托管平台,采用ssh方式连接gitlab,在客户机上产生公钥上传到gitlab的SSH-Keys里,则git clone下载和git push上传都没问题,这种方式很安全. ...
- ASP.NET MVC铵钮Click后下载文件
本篇Insus.NET练习的是FilePathResult和FileStreamResult操作.本篇也算是<如何把Json格式字符写进text文件中>http://www.cnblogs ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- ffmpeg在shell循环中只执行一次问题
最近写了一个shell脚本,发现 ffmpeg 命令只执行了一次就停了,最后找到原因: ffmpeg有时会读取标准输入流,导致命令出错,解决办法是在ffmpeg命令之后添加 #xxx ffmpeg x ...
- 项目分享二:APP 小红点中数字的处理
小红点,是 APP 中最常见的一个功能,我们先来看一下面的案例,下图中,待评价的商品有 2 个,点击“评价晒单”按钮进行评价后,那么待评价数量应该变成 1,那么这个功能是如何去实现的呢? 一般来说,实 ...
- eclipse的历史版本及下载
有时候我们总会遇到在需要eclipse而无法及时找到的时候, 所以那些有用的链接, 是帮助我们能够及时找到我们想要版本的额最好方式 Eclipse 3.1 IO[木卫一,伊奥] 2005 http:/ ...
- Mysql 慢查询和慢查询日志分析
众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的.下面总结一些使用过或者研究过的经验,从配置以及调节索引的方面入手,对mysql进行一 ...