CodeForces - 722C(思维+倒着并查集)
题意
https://vjudge.net/problem/CodeForces-722C
给你一个由n个非负整数组成的数列 a1 ,a2 ,...,an 。
你将要一个一个摧毁这个数列中的数。并且,现在给你一个由 1 到 n 组成的序列来告诉你每个数被摧毁的时间顺序。
每当一个元素被摧毁时,你需要找到这个当前数列中的未被摧毁的数组成的和最大的连续子序列,另外,如果当前剩余的序列是空的的话,最大和就是0。
思路
正着删无法操作,那么我们考虑倒着加!每次加入一个点,判断这个点左右是否有数,有的话就合并到这个点来。注意要先将sum合并,再将父亲合并。
代码
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll a[N],b[N],n,pre[N],sum[N];
ll find(ll x)
{
if(x==pre[x])
return x;
return pre[x]=find(pre[x]);
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
cin>>b[i];
stack<ll> st;
st.push(0);
ll mx=0;
for(int i=n;i>1;i--)
{
int x=b[i];
ll fx=find(b[i]);
if(!fx)
{
fx=x;
pre[x]=x;
sum[x]=a[x];
// cout<<"s:"<<x<<" "<<sum[x]<<" "<<find(x+1)<<endl;
}
if(x>1&&find(x-1)&&find(x-1)!=find(x))
{
sum[fx]+=sum[find(x-1)];
pre[find(x-1)]=pre[fx];
}
if(x<n&&find(x+1)&&find(x+1)!=find(x))
{
sum[fx]+=sum[find(x+1)];
pre[find(x+1)]=pre[fx];
// cout<<"hh:"<<sum[fx]<<" "<<sum[find(x+1)]<<endl;
}
mx=max(mx,sum[fx]);
// cout<<sum[x]<<endl;
st.push(mx);
}
while(!st.empty())
{
cout<<st.top()<<endl;
st.pop();
}
return 0;
}
CodeForces - 722C(思维+倒着并查集)的更多相关文章
- CodeForces - 722C Destroying Array (并查集/集合的插入和删除)
原题链接:https://vjudge.net/problem/511814/origin Description: You are given an array consisting of n no ...
- Codeforces 699D Fix a Tree 并查集
原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...
- Codeforces 731C:Socks(并查集)
http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色,问 ...
- codeforces 400D Dima and Bacteria 并查集+floyd
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...
- Codeforces 1027F Session in BSU - 并查集
题目传送门 传送门I 传送门II 传送门III 题目大意 有$n$门科目有考试,第$i$门科目有两场考试,时间分别在$a_i, b_i\ \ (a_i < b_i)$,要求每门科目至少参加 ...
- CodeForces - 455C Civilization (dfs+并查集)
http://codeforces.com/problemset/problem/455/C 题意 n个结点的森林,初始有m条边,现在有两种操作,1.查询x所在联通块的最长路径并输出:2.将结点x和y ...
- Codeforces 859E Desk Disorder:并查集【两个属性二选一】
题目链接:http://codeforces.com/problemset/problem/859/E 题意: 有n个人,2n个座位. 给出这n个人初始的座位,和他们想坐的座位. 每个人要么坐在原来的 ...
- Codeforces 651E Table Compression【并查集】
题目链接: http://codeforces.com/problemset/problem/650/C 题意: 给定n*m的矩阵,要求用最小的数表示每个元素,其中各行各列的大小关系保持不变. 分析: ...
- codeforces 456 E. Civilization(并查集+数的直径)
题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...
随机推荐
- linux的常用命令(一)
目录切换命令: cd切换目录 cd /usr 切换到usr目录 cd .. 切换到上一层目录 cd ../.. 调到当前目录的上上两层 cd / 切换到系统根目录 cd ~ ...
- C#扩展方法学习笔记
C#扩展方法,简单的理解是不修改原来类的源代码的情况下,为某个类添加某个方法.扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.它们的第一个参数指定该方法作用于哪个类型,并且该参数以 th ...
- Analyze Data 分析数据
In this lesson, you will learn how to add the Analysis functionality to your application. For this p ...
- Python中列表乘法需注意的问题/
前几天看到一个关于Python的面试题 lst = [1, 2, [3]] lst1 = lst * 2 # [1, 2, [3], 1, 2, [3]] lst1[2].append(4) # ...
- 2019阿里天猫团队Java高级工程师面试题之第一面
2019阿里天猫团队Java高级工程师面试题之第二面 2019阿里天猫团队Java高级工程师面试题之第三面 1.五分钟自我介绍,说说自己的擅长及拿手的技术 自我介绍是为了考察面试者的语言表达和总结概括 ...
- 一篇文章看懂angularjs component组件
壹 ❀ 引 我在 angularjs 一篇文章看懂自定义指令directive 一文中详细介绍了directive基本用法与完整属性介绍.directive是个很神奇的存在,你可以不设置templa ...
- Linux查看CPU和内存情况
本文简单介绍在Linux上查看CPU和内存情况和一款系统资源查看工具htop. 查看CPU情况 以下是个人工作会经常使用到的服务器的信息. 查看所有CPU信息 可以通过如下命令查看所有CPU信息: # ...
- 隐藏Nginx软件版本号信息
为了提高我们web服务器的安全性,我们应当尽可能的隐藏服务器的信息以防止他人通过这些信息找到漏洞侵入我们的服务器,对于Nginx而言,我们安装好Nginx后最好隐藏Nginx的版本号,以防止通过该版本 ...
- SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Security简介 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方 ...
- 多线程八 Lock
前面我们可以使用synchronized关键字来实现线程之间的同步互斥,lock接口同样也是在JDK1.5中提出,同样是解决线程安全性问题的另一种解决方案,而且它更强大,更灵活本片博客介绍对其展开介绍 ...