【37.38%】【codeforces 722C】Destroying Array
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array consisting of n non-negative integers a1, a2, …, an.
You are going to destroy integers in the array one by one. Thus, you are given the permutation of integers from 1 to n defining the order elements of the array are destroyed.
After each element is destroyed you have to find out the segment of the array, such that it contains no destroyed elements and the sum of its elements is maximum possible. The sum of elements in the empty segment is considered to be 0.
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the length of the array.
The second line contains n integers a1, a2, …, an (0 ≤ ai ≤ 109).
The third line contains a permutation of integers from 1 to n — the order used to destroy elements.
Output
Print n lines. The i-th line should contain a single integer — the maximum possible sum of elements on the segment containing no destroyed elements, after first i operations are performed.
Examples
input
4
1 3 2 5
3 4 1 2
output
5
4
3
0
input
5
1 2 3 4 5
4 2 3 5 1
output
6
5
5
1
0
input
8
5 5 4 4 6 6 5 5
5 2 8 7 1 3 4 6
output
18
16
11
8
8
6
6
0
Note
Consider the first sample:
Third element is destroyed. Array is now 1 3 * 5. Segment with maximum sum 5 consists of one integer 5.
Fourth element is destroyed. Array is now 1 3 * * . Segment with maximum sum 4 consists of two integers 1 3.
First element is destroyed. Array is now * 3 * * . Segment with maximum sum 3 consists of one integer 3.
Last element is destroyed. At this moment there are no valid nonempty segments left in this array, so the answer is equal to 0.
【题解】
线段树区间合并
每次删掉一个节点;
类似hotel那题,不同的是变成求连续的块的最大和。
可以在求连续块的基础上做一些加法运算求和。
每次操作完更新完之后输出mlx[1]即可(根节点代表整个区间);
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 109000;
int n, m;
int llianxusum[MAXN<<2], rlianxusum[MAXN<<2];
long long mllx[MAXN<<2], mrlx[MAXN<<2], mlx[MAXN<<2];
void build(int l, int r, int rt)
{
llianxusum[rt] = rlianxusum[rt] = r - l + 1;
if (l == r)
{
scanf("%I64d", &mlx[rt]);
mllx[rt] = mrlx[rt] = mlx[rt];
return;
}
int mid = (l + r) >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
mlx[rt] = mllx[rt] = mrlx[rt] = mlx[rt << 1] + mlx[rt << 1 | 1];
}
void push_up(int rt, int len)
{
llianxusum[rt] = llianxusum[rt << 1];
mllx[rt] = mllx[rt << 1];
if (llianxusum[rt] == len - (len >> 1))
{
llianxusum[rt] += llianxusum[rt << 1 | 1];
mllx[rt] += mllx[rt << 1 | 1];//连续的序列和也可以递增
}
rlianxusum[rt] = rlianxusum[rt << 1 | 1];
mrlx[rt] = mrlx[rt << 1 | 1];
if (rlianxusum[rt] == len >> 1)
{
rlianxusum[rt] += rlianxusum[rt << 1];
mrlx[rt] += mrlx[rt << 1];//同理
}
mlx[rt] = max(mlx[rt << 1], mlx[rt << 1 | 1]);
mlx[rt] = max(mlx[rt], mrlx[rt << 1] + mllx[rt << 1 | 1]);
//整个区间的连续空格子数就没必要记录了。
//直接整个区间的最大和就好。
}
void updata(int pos, int begin, int end, int rt)
{
if (begin == end)
{
llianxusum[rt] = rlianxusum[rt] = 0;
mlx[rt] = mllx[rt] = mrlx[rt] = 0;
return;
}
int m = (begin + end) >> 1;
if (pos <= m)
updata(pos, begin, m, rt << 1);
else
updata(pos, m + 1, end, rt << 1 | 1);
push_up(rt, end - begin + 1);
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
scanf("%d", &n);
build(1, n, 1);
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
updata(x, 1, n, 1);
printf("%I64d\n", mlx[1]);
}
return 0;
}
【37.38%】【codeforces 722C】Destroying Array的更多相关文章
- 【Codeforces 722C】Destroying Array (数据结构、set)
题意 输入一个含有 n(1≤n≤100000) 个非负整数的 a 数组和一个 1-n 的排列 p 数组,求每次删除 a[p[i]] 后,最大连续子段和(不能跨越被删除的)是多少? 分析 因为都是非负整 ...
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【35.37%】【codeforces 556C】Case of Matryoshkas
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【38.02%】【codeforces 625B】War of the Corporations
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- 【81.37%】【codeforces 734B】Anton and Digits
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【21.37%】【codeforces 579D】"Or" Game
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【Educational Codeforces Round 38 (Rated for Div. 2)】 Problem A-D 题解
[比赛链接] 点击打开链接 [题解] Problem A Word Correction[字符串] 不用多说了吧,字符串的基本操作 Problem B Run for your prize[贪心] ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【搜索】【并查集】Codeforces 691D Swaps in Permutation
题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...
随机推荐
- 漫话Unity(二)
三.Unity编辑器介绍 Unity是一个商业级的3d游戏引擎.一个引擎的专业程度事实上并非体如今它多么牛b 的次世代效果,说实话那些效果即便你会用也不敢用.由于没有哪个手机是次世代的. 游戏引擎的专 ...
- 前6名免费DNS服务 - 公共DNS服务
前6名免费DNS服务 - 公共DNS服务 谷歌 8.8.8.8,8.8.4.4备份,用户将期望并获得高可用性,如DNSSEC等过滤和安全保护. OpenDNS 现在是Cisco帝国的一部分,主要是20 ...
- intent- 启动其他应用
今天需要在图库中实现对相机的调用,代码如下 Intent intent = new Intent(Intent.ACTION_VIEW); ComponentName componetName = n ...
- js ---- 实现千位分隔符
第一种方法: var num = 1234567; var string = num.toString(); var arr = string.split('').reverse(); console ...
- HDU 1142 A Walk Through the Forest(最短路+dfs搜索)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- Mybatis批量插入,是否能够返回id列表
第1次代码 void batchAdd(List<Photo> list); <insert id="batchAdd" parameterType=" ...
- git提交代码到本地仓库和远程仓库
5.commit代码到本地git仓库 选中需要 Commit 的项目,右键->Team->Commit, 填写相关的 Commit message,并选择需要提交的 Files ...
- 洛谷 P2873 [USACO07DEC]泥水坑Mud Puddles
P2873 [USACO07DEC]泥水坑Mud Puddles 题目描述 Farmer John is leaving his house promptly at 6 AM for his dail ...
- 【Java】Java Socket 通信演示样例
用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...
- 关于查看域名A记录,MX记录,CNAME记录-NSLOOKUP用法介绍
关于查看域名A记录,MX记录,CNAME记录-NSLOOKUP用法介绍 用ping查看域名的IP地址,这样只能查到域名的A记录,要查询域名的MX记录.CNAME记录或NS记录,可用nslookup命令 ...