JZOJ5646. 【NOI2018模拟4.12】染色游戏

蒜头是一名画家,追求画卷从左到右美观度递增。画卷美观度由图案美观度之和减去未画区域的方案数之差决定。题目要求找出最大美观度。通过输入序列长度n和各位置的美观度ai,使用DP和斜率优化解决二维偏序问题,采用CDQ分治策略,先按权值排序再进行分治计算,确保美观度递增。代码实现中需要预处理区间排序以提高效率。
摘要由CSDN通过智能技术生成

染色游戏

题目描述
蒜头是一名优秀的画家。
蒜头有一张长度为n的画卷,在位置i上画图案会获得ai的美观度。蒜头是一个有追求的人,因此他希望他的画从左往右是越来越美观的,即对于任意两个画了图案的格子l < r,有al ≤ ar。但蒜头发现,人们评判画卷的好坏,并不会只从画出的图案来考虑。具体来说,一张画卷的美观度,定义为所有画了图案的位置的美观度之和与在图上选择两个可以重复的位置使得两位置之间不存在画了图案的位置的方案数之差。现在,蒜头想要知道,他画出的画卷的最大美观度是多少。

形式化地,一段连续的长度为m的空白位置会让美观度降低m*(m+1)/2。

输入

输入的第一行是一个数n,表示序列的长度。

接下来一行n个数,第i个数表示ai。

输出

输出一行表示最大美观度。

样例输入
输入样例1
7
1 3 2 7 3 2 4
输入样例2
7
-3 -4 -2 -2 -6 -8 -1

样例输出
输出样例1
7
输出样例2
-11

提示
对于100%的数据,n<=10^6,−10^8≤ai≤10^8。

题解:
对于这题,DP式子和斜率优化不是特别难。在这里主要讲一下如何解决 l < r,保证 al ≤ ar 的问题。
这里要求 l < r 时 al < ar,一个下标,一个权值,看来是一个二维偏序问题(至于二维偏序什么的,我自己也不是太明白,先挖个坑)。有两个维度,要保证他们都有序,肯定要先排序一个维度。这里我们按权值排序然后进行CDQ分治,每次考虑[l,mid]对[mid+1,r]的贡献即可。
每次做DP时要将[l,mid]中的东西按下标排序,在从前往后斜率优化DP;这里排序时要预处理出每个区间按下标排序的结果,直接sort效率会降低。
详见代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000005
using namespace std;
int n,q[N],pla[N],a[N],rk[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值