Codeforces 722C. Destroying Array
来源:互联网 发布:德邦数据分析招聘信息 编辑:程序博客网 时间:2024/06/05 09:39
题目:Destroying Array
题意:给定n个数,再给定n个位置,每个位置依次代表此位置数消失,并且将整个数列分段,从中找最大子段和。
思路:倒过来做,把序列看成全部消失,然后再依次出现,用并查集判断本次出现的位置和他的左边,右边是否在一个集合,在的话将累计集合和,这里merge中需要加上求本集合的和,然后选择上一个的子段和与本次的集合和中较大的一个即为本次子段和,依次遍历整个序列即可!需要开一个标记数组,判断当前位置的左和右是否开通!
参考
代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX(a,b) (a) > (b) ? (a) : (b)#define MAX_N 100000int f[MAX_N+5], a[MAX_N+5], seq[MAX_N+5], visit[MAX_N+5];long long prt[MAX_N+5],sum[MAX_N+5];int find(int v){ if(f[v] != v) f[v] = find(f[v]); return f[v];}void merge(int u,int v){ int fu = find(u); int fv = find(v); if(fu != fv) f[fv] = fu; sum[fu] += sum[fv];//将一个集合的累加到当前点上}int main(){ int i,n; while(scanf("%d",&n)!=EOF) { memset(visit,0,sizeof(visit)); for(i=1;i<=n;i++) { f[i] = i; scanf("%d",&a[i]); sum[i] = a[i]; } for(i=1;i<=n;i++) { scanf("%d",&seq[i]); } prt[n] = 0; for(i=n;i>1;i--) { if(seq[i] > 1 && visit[seq[i]-1])//不在左边界,且左边可访问 { merge(seq[i],seq[i]-1);//左合并 } if(seq[i] < n && visit[seq[i]+1])//不在右边界,且右边可访问 { merge(seq[i],seq[i]+1);//右合并 } visit[seq[i]] = 1;//此点可访问 prt[i-1] = MAX(sum[seq[i]],prt[i]);//判断当前集合大,还是上一次的大 } for(i=1;i<=n;i++) printf("%I64d\n",prt[i]); } return 0;}
0 0
- codeforces 722C Destroying Array
- codeforces(722c)-Destroying Array
- Codeforces 722C. Destroying Array
- codeforces 722C. Destroying Array
- 【37.38%】【codeforces 722C】Destroying Array
- codeforces 722C Destroying Array 【线段树好题】
- codeforces 722C. Destroying Array map+multiset
- Codeforces 722C - Destroying Array By Assassin
- CodeForces - 722C Destroying Array (set)
- Codeforces #722C: Destroying Array 题解
- codeforces 722C Destroying Array 并查集带权
- codeforces-772C-Destroying Array
- Codeforces Round 722C:Destroying Array(离线)
- codeforces 722C Destroying Array ( 并查集 / Multiset )
- codeforces 722C. Destroying Array(并查集||set)
- CodeForces 722C Destroying Array(数组删除区间最大值)
- CodeForces 722C. Destroying Array(逆向思维)
- 【Codeforces 722 C Destroying Array】+ 并查集
- (二)面向对象之封装,继承,多态(上)
- 流分类(部分)
- 搬家啦!!!
- Vertor向量容器
- "ORA-00942: 表或视图不存在 "的原因和解决方法
- Codeforces 722C. Destroying Array
- 5.7.13 mysql 登录root用户及修改root用户密码
- Java线程和多线程(九)——死锁
- 基于查询的路由协议
- leetcode 移除排好序的重复的数字
- 一次ORA-39083,ORA-01917的问题解决过程
- OGRE 2.1简明扼要的分析
- 线程生命周期
- 动态规划DP问题分类和经典题型