CF573E-Bear and Bowling【dp,平衡树】

正题

题目链接:https://www.luogu.com.cn/problem/CF573E


题目大意

给出一个长度为nnn的序列aaa,求它的一个子序列bbb,要求最大化
∑i=1∣b∣bi×i\sum_{i=1}^{|b|}b_i\times ii=1bbi×i

1≤n≤105,∣ai∣≤1071\leq n\leq 10^5,|a_i|\leq 10^71n105,ai107


解题思路

首先我们考虑最暴力的dpdpdp,设fi,jf_{i,j}fi,j表示到现在到aaa的第iii个,然后选择了jjj个时的最大答案,那么我们有
fi,j=max{fi−1,j,fi−1,j−1+bi×j}f_{i,j}=max\{f_{i-1,j},f_{i-1,j-1}+b_i\times j\}fi,j=max{fi1,j,fi1,j1+bi×j}
然后发现这个dpdpdp很难进行维护,我们尝试找下性质。
然后我没找到去看题解发现确实是性质题,对于一个iii,如果fi,jf_{i,j}fi,jfi,j−1f_{i,j-1}fi,j1转移过来,那么fi,j+1f_{i,j+1}fi,j+1也一定是从fi−1,jf_{i-1,j}fi1,j转移过来的。

证明的话可以看这篇大佬的博客:https://www.luogu.com.cn/blog/Mrsrz/solution-cf573e

所以我们可以用一个平衡树去维护每个iiidpdpdp值,然后我们就只需要二分出两个转移方式的中转点kkk,然后对于前面的我们不变,对于后面的我们在区间前插入一个fi,k−1f_{i,k-1}fi,k1,然后就是一个区间加等差序列的操作,用懒标记维护即可。

时间复杂度:O(nlog⁡2n)O(n\log^2 n)O(nlog2n)

如果在平衡树上二分能做到O(nlog⁡n)O(n\log n)O(nlogn)

当然还有另一种做法,考虑一个一个插入答案,能够证明不停插入会使得当前贡献最大的数也是最优的。

那么我们就只需要用分块维护每一个数的新贡献就好了。

时间复杂度:O(nn)O(n\sqrt n)O(nn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,cnt,rt,t[N][2],dat[N],siz[N];
ll w[N],lazy[N],lazy2[N],ans;
ll Newp(ll val){w[++cnt]=val;dat[cnt]=rand();siz[cnt]=1;return cnt;
}
ll Cpy(ll x)
{return Newp(w[x]);}
void Update(ll x,ll val,ll dr){w[x]+=val*(siz[t[x][0]]+dr);lazy[x]+=val*dr;lazy2[x]+=val;
}
void PushDown(ll x){if(lazy[x]){if(t[x][0])w[t[x][0]]+=lazy[x],lazy[t[x][0]]+=lazy[x];if(t[x][1])w[t[x][1]]+=lazy[x],lazy[t[x][1]]+=lazy[x];lazy[x]=0;}if(lazy2[x]){if(t[x][0])Update(t[x][0],lazy2[x],0);if(t[x][1])Update(t[x][1],lazy2[x],siz[t[x][0]]+1);lazy2[x]=0;}return;
}
void PushUp(ll x){siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;}
void Split(ll &x,ll &y,ll p,ll val){if(!p){x=y=0;return;}PushDown(p);if(siz[t[p][0]]<=val)x=p,Split(t[x][1],y,t[p][1],val-siz[t[p][0]]-1);else y=p,Split(x,t[y][0],t[p][0],val);PushUp(p);
}
ll Merge(ll x,ll y){if(!x||!y)return x|y;PushDown(x);PushDown(y);if(dat[x]<dat[y]){t[x][1]=Merge(t[x][1],y);PushUp(x);return x;}else{t[y][0]=Merge(x,t[y][0]);PushUp(y);return y;}
}
ll GetVal(ll &rt,ll pos){ll x,y,z;Split(x,z,rt,pos);Split(x,y,x,pos-1);ll ans=w[y];x=Merge(x,y);rt=Merge(x,z);return ans;
}
void GetAns(ll x){if(!x)return;PushDown(x);ans=max(ans,w[x]);GetAns(t[x][0]);GetAns(t[x][1]);return;
}
bool check(ll x,ll w){ll a=GetVal(rt,x);ll b=GetVal(rt,x-1);return a>b+x*w;
}
signed main()
{scanf("%lld",&n);rt=Newp(0);rt=Merge(rt,Newp(-1e18));for(ll i=1,k;i<=n;i++){scanf("%lld",&k);ll l=1,r=i;while(l<=r){ll mid=(l+r)>>1;if(check(mid,k))l=mid+1;else r=mid-1;}ll x,y,z,d;Split(x,z,rt,l-1);Split(z,d,z,n-1);Split(x,y,x,l-2);d=Cpy(y);z=Merge(d,z);Update(z,k,l);rt=x;rt=Merge(rt,y);rt=Merge(rt,z);}GetAns(rt);printf("%lld\n",ans);return 0;
}```

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

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

相关文章

NC51189 Mondriaan‘s Dream

NC51189 Mondriaan’s Dream 题意&#xff1a; n * m的矩阵&#xff0c;用1 * 2和2 * 1的砖快密铺&#xff0c;问多少种方法&#xff1a; 题解&#xff1a; 方法1&#xff1a; 我们现在规定砖头的竖放的上部分为1&#xff0c;砖头的横放或者是竖放的下部分为0 我们每两层进…

CF1408D:Searchlights

解析 滥用数据结构了属于是 本题的思路和题解还是差不多的 暴力枚举灯和海盗乱搞即可 但是最后对fif_ifi​的维护我使用了树状数组&#xff0c;凭空多了个log… 尽管树状数组跑的飞快 其实直接倒着扫一遍就行了 特殊数据下我这个算法是可以跑满n方log1e6的 过2000我在想peach…

[LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史

[NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护边权 把边在LCTLCTLCT中理解为点&#xff1f;——看题解代码其实就是建虚点 出现环时 选择最大的bb…

《小团队构建大网站:中小研发团队架构实践》送书活动结果公布

截止到1月25日24&#xff1a;00&#xff0c;本次送书活动共收到75位同学参与回复&#xff0c;本次很多同学在看到活动的书十年IT老兵带你通过案例学架构&#xff0c;附C#代码&#xff0c;自行就到各大网络商店上购买了书&#xff0c;据反馈这个书很不错.下面把Top 2的留言截图给…

P6466-分散层叠算法(Fractional Cascading)【模板】

正题 题目链接:https://www.luogu.com.cn/problem/P6466 题目大意 给出kkk个长度为nnn的有序序列&#xff0c;qqq次询问给出xxx&#xff0c;求所有序列中xxx的后继的异或和。 强制在线 1≤k≤100,1≤n≤104,1≤q≤51051\leq k\leq 100,1\leq n\leq 10^4,1\leq q\leq 5\times…

11.13模拟:总结

文章目录总结题目update&#xff08;solution of T3&#xff09;&#xff1a;代码230pts100100300总结 不要先入为主&#xff01;如果某种算法受阻&#xff0c;要尝试一下别的路子&#xff01;&#xff01; 本次的主要问题&#xff1a; T2花费时间略长&#xff08;指2h&#…

Strategic game(树的最小点覆盖)

Strategic game 题意&#xff1a; 一个树&#xff0c;在一个节点放兵&#xff0c;周围的边就被守护&#xff0c;守护所有的边&#xff0c;问最少放多少兵 题解&#xff1a; 这种问题又称树的最小点覆盖 dp[x][1]以x为根的子树全被看住且在x上放置士兵的最少所需的士兵数量 …

test6 3-21 2021省选模拟赛six

文章目录考试复盘rnglgpm考试复盘 第一题&#xff0c;乍一看期望&#xff0c;又不会做了&#xff0c;乍二看&#xff0c;暴力好像可以202020跑路&#xff0c;屁颠屁颠敲完死活过不了这个简单的样例&#xff1b;开始(⊙⊙?)乍三看&#xff0c;实数&#xff1f;&#xff1f;完了…

如何为 .NET Core CLI 启用 TAB 自动补全功能

Intro在 Linux 下经常可以发现有些目录/文件名&#xff0c;以及有些工具可以命令输入几个字母之后按 TAB 自动补全&#xff0c;最近发现其实 dotnet cli 也可以&#xff0c;从.NET Core 2.0 SDK 开始&#xff0c;NET Core CLI 支持 tab 自动补全。你如果已经装了 dotnet Core S…

P8215-[THUPC2022 初赛]分组作业【网络流】

正题 题目链接:https://www.luogu.com.cn/problem/P8215 题目大意 有2n2\times n2n个人&#xff0c;第2i−12\times i-12i−1和第2i2\times i2i个人一组&#xff0c;然后每个人可以选择愿不愿意合作&#xff0c;愿意需要付出cic_ici​代价&#xff0c;不愿意是did_idi​代价&…

.NET IdentityServer4实战-开篇介绍与规划

一.开篇寄语由于假期的无聊&#xff0c;我决定了一个非常有挑战性的活动&#xff0c;也就是在年假给大家带来一个基于OAuth 2.0的身份授权框架&#xff0c;它就是 IdentityServer4 &#xff0c;如果没有意外的话&#xff0c;一定可以顺利的写完的&#xff0c;如果两天写一篇的话…

CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)

解析 很妙的一道题 看这两个南辕北辙的标签就知道这题不简单 看见dp思路还是得打开 一开始其实想到按边权排序了 但卡在了重构树上 遇到dp一定要敢想 勇于和图论等结合 考虑正解 按照边权升序排序 依次加边到图中 并查集维护连通性和集合内的边数 发现&#xff0c;一个联通块…

test5 3-20 2021省选模拟赛five

考试复盘 第一题&#xff1f;&#xff1f;是个什么互动哦&#xff0c;直接乱来的(&#xffe3;&#xffe3;)σ…(&#xff3f;&#xff3f;)ノ&#xff5c;壁 第二题是前几天考过的&#xff0c;所以知道是polyapolyapolya&#xff0c;但是式子推到最后的二项式定理没推对&am…

Cell Phone Network

Cell Phone Network 题意: 每个牧场的电塔可以覆盖与该牧场相邻的电塔&#xff0c;为了让所有牛都可以打电话&#xff0c;求建的电塔的最小数量 题解&#xff1a; 树的最小支配集 dp[x][0]&#xff1a;选点i&#xff0c;并且以点i为根的子树都被覆盖 dp[x][1]&#xff1a;不…

P8207-[THUPC2022 初赛]最小公倍树【Kruskal】

正题 题目链接:https://www.luogu.com.cn/problem/P8207 题目大意 有编号为[L,R][L,R][L,R]区间的点&#xff0c;连接两个点x,yx,yx,y边权的为LCM(x,y)LCM(x,y)LCM(x,y)&#xff0c;求这张图的最小生成树。 1≤L≤R≤106,R−L≤1051\leq L\leq R\leq 10^6,R-L\leq 10^51≤L≤…

微信小程序开发必看,《使用 .NET Core + DevOps 开发微信跨平台应用》,苏州.NET俱乐部课程分享...

【课程名称】《使用 .NET Core DevOps 开发微信跨平台应用》【老师介绍】苏震巍&#xff0c;苏州盛派网络CEO&#xff0c;微软最有价值专家&#xff08;MVP&#xff09;、微软 Ignite 技术大会讲师&#xff0c;Senparc.Weixin作者&#xff0c;《微信开发深度解析》等书作者。苏…

11.14 模拟:总结

update 等出分挂大分再回来打脸 一语成谶了属于是 给自己测了一下 《很棒》 真就挂了大分 实际得分&#xff1a; 00020 T1和T3都挂没了 qwq T1是因为两个背包的定义是不一样的&#xff01; 我应该做两个背包分别跑就好了 T3全部MLE… 我最后十分钟想贪一个T3的第五个点 然后…

P8208-[THUPC2022 初赛]骰子旅行【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8208 题目大意 给出nnn个点若干条边的一张图中&#xff0c;一个人在111开始随机游走ttt步。 如果他到达一个点他曾经到达过的点&#xff0c;那么就会产生它上次在这个点走向的点的编号的贡献。 求期望贡献。 1≤n≤100,1≤…

Axial symmetry FZU - 2035

Axial symmetry FZU - 2035 题意&#xff1a; 给一个多边形&#xff0c;边平行于x轴或者y&#xff0c;问是否存在对称轴 题解&#xff1a; 将每个点的坐标&#xff0c;以及每个边的中点的坐标&#xff0c;按照顺时针顺序存入&#xff0c;多边形的对称轴一定穿过对应两个点&…

test 7 3-22 2021省选模拟赛seven

文章目录考试复盘人生赢家黑红兔考试复盘 T1T1T1 subtask1:n≤5subtask1:n\le 5subtask1:n≤5&#xff0c;暴搜点的颜色状态以及边的存在状态 对于一条连接相同颜色点的边&#xff0c;可要可不要&#xff0c;不会提供形态变化的贡献&#xff0c;2edge2^{edge}2edge dpdpdp&…