NOI.AC#2139-选择【斜率优化dp,树状数组】

正题

题目链接:http://noi.ac/problem/2139


题目大意

给出nnn个数字的序列aia_iai。然后选出一个不降子序列最大化子序列的aia_iai和减去没有任何一个数被选中的区间数量。

1≤n≤106,1≤ai≤1081\leq n\leq 10^6,1\leq a_i\leq 10^81n106,1ai108


解题思路

嗯,考虑朴素的dpdpdp方程,设fif_ifi表示以iii为末尾的值就有
fi=fj+ai+(i−j−1)(i−j)2f_i=f_j+a_i+\frac{(i-j-1)(i-j)}{2}fi=fj+ai+2(ij1)(ij)
然后展开整理一下都乘二就是
fi=fj+2ai+i2−i+j2+j−2ij(aj≤ai,j<i)f_i=f_j+2a_i+i^2-i+j^2+j-2ij(a_j\leq a_i,j<i)fi=fj+2ai+i2i+j2+j2ij(ajai,j<i)

除了aj≤aia_j\leq a_iajai就是一个标准的斜率优化式子了

然后这个东西其实挺好搞的,因为多一个限制直接上CDQCDQCDQ就好了,但是每次左边要归并排序,这样时间复杂度就是O(nlog⁡n)O(n\log n)O(nlogn)的了

但其实还有更暴力的做法,因为既然一个CDQCDQCDQ能做到,那么找些数据结构之类的也肯定能做到。

对于树状数组上每个节点维护一个凸壳然后暴力查询就好了

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const ll N=1e6+10;
ll n,m,a[N],b[N],l[N],r[N],f[N],k[N];
vector<ll >q[N];
ll calc(ll i,ll j)
{return k[i]+2*i*j;}
void Change(ll x,ll i){while(x<=m){while(l[x]<r[x]&&(k[i]-k[q[x][r[x]]])*(q[x][r[x]]-q[x][r[x]-1])>=(k[q[x][r[x]]]-k[q[x][r[x]-1]])*(i-q[x][r[x]]))r[x]--,q[x].pop_back();q[x].push_back(i);r[x]++;x+=lowbit(x);}return;
}
ll Ask(ll x,ll i){ll ans=-1e18;while(x){while(l[x]<r[x]&&calc(q[x][l[x]],i)<calc(q[x][l[x]+1],i))l[x]++;if(l[x]<=r[x])ans=max(ans,calc(q[x][l[x]],i));x-=lowbit(x);}return ans;
}
signed main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),b[i]=a[i];sort(b+1,b+1+n);m=unique(b+1,b+1+n)-b-1;for(ll i=1;i<=m;i++)r[i]=-1;Change(1,0);for(ll i=1;i<=n;i++){ll x=lower_bound(b+1,b+1+m,a[i])-b;f[i]=Ask(x,i)+2*a[i]-i*i+i;k[i]=f[i]-i*i-i;Change(x,i);}ll ans=-1e18;for(ll i=1;i<=n;i++)ans=max(ans,f[i]/2-(n-i+1)*(n-i)/2);printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeforces1485 E. Move and Swap(dp)

E. Move and Swap Heltion 由于红色硬币向下一层走的时候只能走儿子&#xff0c;而蓝色无限制&#xff08;对后续操作无影响&#xff09;&#xff0c;于是考虑下面表示 状态表示&#xff1a;fuf_ufu​表示当前是红色硬币&#xff0c;向下一层走后的最大价值。 状态转移&#…

一个技术管理者的苦逼【技术管理漫谈】

希望给你3-5分钟的碎片化学习&#xff0c;可能是坐地铁、等公交&#xff0c;积少成多&#xff0c;水滴石穿&#xff0c;谢谢关注。角色转变 从工程师转技术管理这两年&#xff0c;好比头马变成车夫&#xff0c;除了角色认知的转变&#xff0c;还要看方向&#xff0c;定计划。不…

KMP Trie 例题讲解

文章目录HDU 4763 Theme Section题意&#xff1a;题解&#xff1a;代码&#xff1a;POJ 3630 Phone List题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 3746 Cyclic Nacklace题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 2087 剪花布条题意&#xff1a;题解&a…

P4640-[BJWC2008]王之财宝【OGF,Lucas定理】

正题 题目链接:https://www.luogu.com.cn/problem/P4640 题目大意 nnn种物品&#xff0c;其中ttt种物品是有个数限制的&#xff0c;第iii种限制为bib_ibi​&#xff0c;求选出mmm个物品的方案数%p\% p%p的值 1≤n,m,bi≤109,0≤t≤15,p∈[1,105]∩Pri1\leq n,m,b_i\leq 10^9,0…

[机器翻译]参与 Microsoft 开放源代码软件项目的方式

下面是一个事实&#xff1a;Microsoft 托管在 GitHub&#xff0c;包括.NET 编译器平台&#xff0c;也称为"Roslyn"具有多达 4 万行代码等一些相当大的大约 2,000 开放源代码软件 (OSS) 存储库。很多开发人员的代码将更改提交到数以百万计的计算机运行的项目可能会令人…

codeforces1485 F. Copy or Prefix Sum(dp)

F. Copy or Prefix Sum Venice technique简要就是懒标记思想。 由于前缀和数组和原数组一一对应&#xff0c;这里我们选择求aia_iai​的前缀和数组的方案数&#xff08;下面aia_iai​表示原题数组的前缀和&#xff09; 不难得知原题目的两个条件即 biai−ai−1→aibiai−1b_ia…

【蓝桥杯】 2018年国赛 矩阵求和

题目 题目&#xff1a; 经过重重笔试面试的考验&#xff0c;小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表&#xff1a; 表有 n 行 n 列&#xff0c;行和列的编号都从1算起。 其中第 i 行第 j 个元素的值是 gcd(i, j)的平方&#xff0c; gcd 表示最大公…

F - GCD or MIN(数论)

F - GCD or MIN 首先gcd⁡(x,y)≤min⁡(x,y)\gcd(x,y)\leq \min(x,y)gcd(x,y)≤min(x,y) 数组中任意2个数的gcd可能是一种方案&#xff0c;任意3个数的gcd可能是一种方案… 如果我们能够把原数组任意个数的gcd全部列出来&#xff0c;能够满足题意的数一定在这些数之中&#…

P4199-万径人踪灭【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P4199 题目大意 给出一个只包含a,ba,ba,b的字符串 求有多少个不连续的回文子序列&#xff08;字母回文&#xff0c;位置对称&#xff09; 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 这个不连续一看就很nt&#xff0c;考…

被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾

前天, 2018年11月10日, 广州图书馆\微软云开发者社区\广东职业教育信息化研究会\珠三角技术沙龙在广州图书馆负一层1号报告厅搞了一场”微软最有价值专家(MVP)广州分享会 - MonkeyFest 2018广州分享会”. 这是在广州图书馆官方微信公众号上的活动报名链接: https://mp.weixin.q…

[蓝桥杯][2017年第八届真题]发现环

题目链接 题目描述 小明的实验室有N台电脑&#xff0c;编号1~N。原本这N台电脑之间有N-1条数据链接相连&#xff0c;恰好构成一个树形网络。在树形网络上&#xff0c;任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时&#xff0c;管理员误操作使得某两台电脑之间增…

P7323-[WC2021]括号路径【并查集,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P7323 题目大意 给出nnn个点的一张有向图。每个边(u,v,w)(u,v,w)(u,v,w)表示u−>vu->vu−>v有一个类型www的左括号边&#xff0c;v−>uv->uv−>u有一个类型www的右括号边。 求图中有多少点对满足它们之间…

P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

P3565 [POI2014]HOT-Hotels 参考题解 题目大意&#xff1a; 给定一棵树&#xff0c;在树上选 3 个点&#xff0c;要求两两距离相等&#xff0c;求方案数。 三个点树上两两距离为d存在下面两种情况 某个点三个子树&#xff08;保证该点是LCA&#xff09;中分别由三个点距离它为…

C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

差点造了一整个轮子.Net Framework 4.5 里面的RSA功能&#xff0c;并未提供简单对PEM密钥格式的支持&#xff08;.Net Core有咩&#xff1f;&#xff09;&#xff0c;差点&#xff08;还远着&#xff09;造了一整个轮子&#xff0c;就为了支持PEM PKCS#8、PKCS#1格式密钥对的导…

P4494-[HAOI2018]反色游戏【圆方树】

正题 题目链接:https://www.luogu.com.cn/problem/P4494 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;节点有0/10/10/1&#xff0c;每条边可以选择是否取反两边的点。 开始求将所有节点变为000的方案&#xff0c;然后对于每个点询问删去这个点之后的方案 1≤T≤5,1…

福州首届.NET开源社区技术交流会圆满成功

活动总结2018年11月10日周六的下午&#xff0c;在福州蒲公英创新工场举办了福州首届.NET开源社区技术交流会&#xff0c;来自福建省各大科技公司的技术小伙伴齐聚一堂&#xff0c;为了就是能在现场学习到微软跨平台技术.NET Core、微服务以及Azure云服务。在交流会现场&#xf…

【模板】高精度

ACM模板 #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct bign {int d[200010], len;bign() { memset(d, 0, sizeof d); len 1; }bign(int num) { *this num; }big…

POJ3734-Blocks【EGF】

正题 题目链接:http://poj.org/problem?id3734 题目大意 用思种颜色给nnn个格子染色&#xff0c;要求前两种颜色出现偶数次&#xff0c;求方案。 1≤T≤100,1≤n≤1091\leq T\leq 100,1\leq n\leq 10^91≤T≤100,1≤n≤109 解题思路 反正是EGF\text{EGF}EGF的十分入门题了。…

[蓝桥杯][2017年第八届真题]对局匹配

题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分&#xff0c;代表他的围棋水平。 小明发现网站的自动对局系统在匹配对手时&#xff0c;只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K&#xff0c;系统都不会将他们…

codeforce23 E. Tree(高精度+树形dp)

E. Tree 状态表示&#xff1a;fu,jf_{u,j}fu,j​表示以uuu节点的子树&#xff0c;uuu所在连通块大小为jjj时&#xff0c;并且没有算上uuu连通块的贡献的最大值 状态计算&#xff1a; 对于一棵子树vvv来说&#xff0c;显然可以有两种情况 uuu节点与vvv节点不连通&#xff1a;fu…