题目链接:点击查看

题目大意:给出一个数列a,现在给出操作b,每次操作都会删除掉数列a中指定位置的数,问每次删除后,最大连续字段和是多少

题目分析:一开始看到最大连续字段和,以为是要用dp,又看了一下题发现a数组都是非负数,这样一来最大连续字段和就取决于在经过数组b的操作后是否连续了,判断连续一开始我想用set集合维护断点的,感觉太麻烦,又想用线段树试试能不能维护区间,还是比较麻烦,想不出比较利索的方法实现这个题目,又一看这是div2的一个C题,不敢想的太麻烦,就去看了一下题解,发现是要用并查集,就突然恍然大悟,正难则反,既然删除操作比较难实现,那么我们直接离线处理,倒着一步一步把删除掉的数添加回去不就好了,每次添加之后维护一下最大值更新答案,最后在输出就好了

不过这里的并查集要注意合并顺序,顺便再维护一个sum数组用来维护每个集合父节点的字段和就能实时维护答案了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N],b[N],f[N];LL ans[N],sum[N];bool vis[N];int find(int x)
{return x==f[x]?x:f[x]=find(f[x]);
}void merge(int x,int y)//y->x
{int xx=find(x);int yy=find(y);f[yy]=xx;sum[xx]+=sum[yy];
}void init()
{for(int i=1;i<N;i++)f[i]=i;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);init();int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);for(int i=1;i<=n;i++)scanf("%d",b+i);LL mmax=0;for(int i=n;i>=1;i--){ans[i]=mmax;int pos=b[i];sum[pos]=a[pos];vis[pos]=true;if(vis[pos+1])//如果pos+1存在,则将pos+1的集合合并到pos上merge(pos,pos+1);if(vis[pos-1])//如果pos-1存在,则将pos-1的集合合并到pos上merge(pos,pos-1);mmax=max(mmax,sum[pos]);//更新最大值}for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);return 0;
}

CodeForces - 722C Destroying Array(倒着并查集+离线处理)相关推荐

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

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

  2. Codeforces 722C. Destroying Array

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

  3. CodeForces 722C Destroying Array

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

  4. codeforces 722C Destroying Array

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

  5. 2017西安交大ACM小学期 毁灭序列[倒跑并查集]

    毁灭序列 发布时间: 2017年7月4日 20:58   最后更新: 2017年7月6日 22:23   时间限制: 1000ms   内存限制: 512M 描述 给出一个n(1≤n≤2×105)个非 ...

  6. LC-1697. 检查边长度限制的路径是否存在(并查集+离线)

    1697. 检查边长度限制的路径是否存在 难度困难109 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 v ...

  7. Codeforces C. Destroying Array

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

  8. CodeForces - 755C PolandBall and Forest (并查集)

    题意:给定n个数,Ai的下标为1~n.对于每一个i,Ai与i在同一个树上,且是与i最远的点中id最小的点(这个条件变相的说明i与Ai连通).求森林中树的个数. 分析:若i与Ai连通,则在同一个树上,因 ...

  9. CF思维联系--CodeForces - 218C E - Ice Skating (并查集)

    题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...

最新文章

  1. HDU1880(map)
  2. MySQL 服务端调优
  3. 【C语言及程序设计】项目2-15:模块化的简单银行系统设计
  4. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】
  5. [蓝桥杯][基础练习VIP]Huffuman树
  6. Spark Structure Streaming(一)之简介
  7. php通过smtp发送邮件源码_PHP SMTP发送邮件函数
  8. 口罩日产量破1亿背后:近3000家企业疯狂增产转产
  9. 研究百度下拉360下拉搜狗下拉神马下拉头条下拉抖音下拉的优化算法(合集帖)
  10. Linux命令 lsof -i:端口号 ——有什么用途
  11. android http 图片上传,Android okHttp上传图片
  12. [everydayNote] 今天脑子不好使
  13. mysql存储过程实现_原来MySQL的存储过程也可以这么玩?
  14. 运维系统 联想服务器,联想运维方案.pdf
  15. 主流四大虚拟化架构对比分析
  16. Excel如何批量设置行高
  17. [算法]从Trie树(字典树)谈到后缀树
  18. Error 3090003: provided keys, permissions, and delays do not satisfy declared authorizations...
  19. reverse和reversed函数的总结
  20. 苹果三代耳机_预告2020.6.13其他团无线蓝牙耳机

热门文章

  1. Controller 相关注解
  2. 高仿真的类-ApplicationContext
  3. springSecurity源码分析-spring-security.xml文件配置
  4. Mybatis中的一级缓存
  5. 初始化方法-在类的外部给对象增加属性的隐患
  6. 单点登录Redis存储Session及SessionId问题说明与集群实战-3
  7. animate方法 jQuery中元素的创建 创建十个p标签 创建列表 动态创建列表
  8. 【多态】向上转型调用方法的规则
  9. linux7添加两个网关,RHEL7设置IP地址、网关和DNS
  10. linux密码忘记grub登陆,Linux忘记密码后使用grub重置密码