当前位置:网站首页>D. Optimal Partition 线段树优化dp
D. Optimal Partition 线段树优化dp
2022-04-21 06:21:00 【Bzdhxs_nt】
思路
考虑 f [ i ] f[i] f[i] 为以 i i i结尾的最大价值 , s [ i ] s[i] s[i] a [ ] a[ ] a[] 的前缀和数组
容易想到
f [ i ] = { f [ j ] − j + i , s [ i ] > s [ j ] f [ j ] , s [ i ] = s [ j ] f [ j ] + j − i , s [ i ] < s [ j ] f[i]= \begin{cases} f[j]-j+i,\quad s[i] > s[j]\\ f[j],\quad s[i] = s[j]\\ f[j]+j-i,\quad s[i] < s[j] \end{cases} f[i]=⎩⎪⎨⎪⎧f[j]−j+i,s[i]>s[j]f[j],s[i]=s[j]f[j]+j−i,s[i]<s[j]
时间复杂度为 O ( n 2 ) O(n^2) O(n2)
考虑优化
上式即求
f [ i ] = m a x ( f [ j ] − j ) + i , s [ i ] > s [ j ] , j < i f[i] = max(f[j]-j) + i,s[i] > s[j],j < i f[i]=max(f[j]−j)+i,s[i]>s[j],j<i
f [ i ] = m a x ( f [ j ] ) , s [ i ] = s [ j ] , j < i f[i] = max(f[j]),s[i] = s[j],j < i f[i]=max(f[j]),s[i]=s[j],j<i
f [ i ] = m a x ( f [ j ] + j ) − i , s [ i ] < s [ j ] , j < i f[i] = max(f[j]+j) - i,s[i] < s[j],j < i f[i]=max(f[j]+j)−i,s[i]<s[j],j<i
便可用 3 3 3棵线段树来分别维护 f [ j ] + j , f [ j ] , f [ j ] − j f[j]+j, f[j] , f[j]-j f[j]+j,f[j],f[j]−j的最大值
用 s [ i ] s[i] s[i] 来代表线段树数组下标 由于 s [ i ] s[i] s[i] 很大考虑进行离散化 s [ i ] s[i] s[i]
注意以下细节
除 0 0 0外 f f f 要初始化为 − i n f -inf −inf
建树大小为 n + 1 n+1 n+1 是因为有前缀和小于 0 0 0,因此还要维护 s [ 0 ] = 0 s[0] = 0 s[0]=0 的值,
const int inf = 1e18;
const int INF = ~0ULL;
const int N = 500005;
struct tree{
int l,r;
int dat; // 线段树中要维护的信息;
#define ls (i<<1)
#define rs (i<<1|1)
}t[3][N<<2];
int d;
int f[500005];
void up(int i){
t[d][i].dat = max(t[d][ls].dat,t[d][rs].dat);
}
void build(int i,int l,int r){
t[d][i] = {
l,r};
if(l==r){
t[d][i].dat = -inf;
return ;
}
int mid = (l+r) >> 1;
build(ls,l,mid);
build(rs,mid+1,r);
up(i);
}
void change(int i,int p, int k){
if(t[d][i].l == t[d][i].r){
t[d][i].dat = max(k,t[d][i].dat);
return;
}
int mid = (t[d][i].l + t[d][i].r) >> 1;
if(p <= mid) change(ls,p,k);
else change(rs,p,k);
up(i);
}
int ask(int i,int l,int r){
if(l <= t[d][i].l && r >= t[d][i].r){
return t[d][i].dat;
}
int res = -inf;
int mid = (t[d][i].l+t[d][i].r) >> 1;
if(l <= mid) res = max(res,ask(ls,l,r));
if(r > mid) res = max(res,ask(rs,l,r));
return res;
}
void solve(){
int n;cin>>n;
vector<int> a(n),s(n+1,0);
forr(i,0,n-1) cin>>a[i],s[i+1] = s[i]+a[i];
forr(i,1,n) f[i] = -inf;
f[0] = 0;
auto v = s;
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i = 0;i <= n;i++) s[i] = lower_bound(v.begin(),v.end(),s[i]) - v.begin()+1;
for(int i = 0; i < 3;i++){
d = i;
build(1,1,n+1);
}
for(int i = 0; i < 3;i++){
d = i;
change(1,s[0],0);
}
int res = -inf;
forr(i,1,n){
int p = s[i];
d = 0;
f[i] = max(f[i],ask(1,1,p-1)+i);
d = 1;
f[i] = max(f[i],ask(1,p,p));
d = 2;
f[i] = max(f[i],ask(1,p+1,n+1)-i);
d = 0;
change(1,p,f[i]-i);
d = 1;
change(1,p,f[i]);
d = 2;
change(1,p,f[i]+i);
}
cout << f[n] << endl;
}
signed main()
{
_orz;
int t;cin>>t;
while(t--) solve();
return 0;
}
版权声明
本文为[Bzdhxs_nt]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_51687628/article/details/124294391
边栏推荐
猜你喜欢

Tensorflow example 3: recognition training of verification code pictures. Each picture has 4 letters

用JS函数形式实现一个Array.prototype.forEach(),.map(),.filter()

【STM32 H7】H743各个内存块地址分布备忘

为短路运算符布尔表达式添加括号
![[LabVIEW] record some pits in LabVIEW project](/img/88/5556dd887d54f11bbc3afc9dfce25e.png)
[LabVIEW] record some pits in LabVIEW project

How to package idea into war package

Simultaneous access of computer intranet and extranet - solution

Error when Linux starts MySQL

CF1427C The Hard Work of Paparazzi题解

MySql分组 按某个字段排序取值第一条
随机推荐
Tensorflow case 4: MNIST handwritten numeral recognition (linear neural network) and its limitations
Swagger2生成Api文档
SQL--数据的过滤和分组
虚拟化特性介绍
用JS函數形式實現一個Array.prototype.forEach(),.map(),.filter()
[AD] modular schematic drawing pit point record
[STM32] cubemx configuration diagram of 480mhz clock under 25MHz external crystal oscillator of h743
H. Are You Safe? 凸包裸题
平面半交板子
[ksz8863] information summary and board verification results of ksz8863 switch chip
验证码的生成
如何防止SQL注入
applicationContext. How to solve the problem of XML becoming gray document
将在CSDN中写好的文章导出为pdf格式
2022牛客寒假补题记录 2
杂项1
“华为杯“ 武汉大学21级新生程序设计竞赛 J.传闻档案
php初级程序员,接单,挣外快的指导方法
VMware Workstation server service failed to start
【KSZ8863】KSZ8863交换机芯片的信息汇总与打板验证结果