LINK:修改

题面就不放了 大致说一下做法。不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了。

从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了。

容易想到 f[i][j]表示前i个数最大值为aj的最大收益。

那么有\(j<=a_i,f[i][j]=f[i-1][k]-a_i+j+b_i.j>a_i,f[i][j]=f[i-1][j]\)

值得注意的是这个转移不完全 在第二个转移的式子中 决策不全面 强行利用f[i][j] 的单调性进行覆盖 那么第一个决策中k就可以变成j 且第二个转移也是正确的。

const ll MAXN=5010,N=40;
ll n,ans;
ll a[MAXN],b[MAXN];
ll f[MAXN][MAXN];
struct wy{int id,x,y;}t[MAXN];
inline int cmp(wy a,wy b){return a.x<b.x;}
signed main()
{
//freopen("1.in","r",stdin);
get(n);
rep(1,n,i)get(a[i]),t[i].x=a[i],t[i].id=i;
rep(1,n,i)get(b[i]),t[i].y=b[i];
sort(t+1,t+1+n,cmp);
rep(1,n,i)
{
rep(1,n,j)
{
f[i][j]=-INF;
if(a[j]<=a[i])f[i][j]=max(f[i][j],f[i-1][j]-a[i]+a[j]+b[i]);
else f[i][j]=max(f[i][j],f[i-1][j]);
}
rep(2,n,j)f[i][t[j].id]=max(f[i][t[j-1].id],f[i][t[j].id]);
}
rep(1,n,i)ans=max(ans,f[n][i]);
putl(ans);return 0;
}

值得注意的是 需要赋初值.

这个dp 可以发现 非常不可优化 所以我就弃疗了。

原因是 状态转移方程写丑了 少考虑了情况 导致f值不再单调 需要后来的 单调覆盖。

观察第一个式子 容易想到 如果出现覆盖的情况 那么说明大的j没有前面\(b_i\)的贡献才会这样。

考虑后面的式子 其实是可以加入这个决策转移的 \(f[i][j]=max(f[i-1][j],f[i-1][i]+b_i)\)

这样f数组显然 单调 那么久不需要单调覆盖了。

具体观察两个dp式子:\(j>a_i,f[i][j]=max(f[i-1][j],f[i-1][i]+b_i),j<=a_i,f[i][j]=f[i-1][k]-a_i+j+b_i\)

第二个转移 显然是一个加上常数 加上一个端点值j的操作 第一个操作由于f值单调 所以这是一个区间赋值操作。

可以发现没有区间最值 所以线段树可以维护这个转移。至于区间赋值操作 显然可以在查到值之后进行线段树上二分寻找区间即可。

注意 每次修改后注意pushup某个区间的左端点的值 为线段树上二分做准备。

const int MAXN=500010,N=40;
int n,num,cnt;ll ww;
int a[MAXN],b[MAXN],c[MAXN];
struct wy
{
int l,r;
ll sum;
ll tag,tag1,tag2;
}t[MAXN<<2];
inline void discrete()
{
sort(c+1,c+1+n);
rep(1,n,i)if(i==1||c[i]!=c[i-1])c[++cnt]=c[i];
rep(1,n,i)a[i]=lower_bound(c+1,c+1+cnt,a[i])-c;
}
inline void build(int p,int l,int r)
{
l(p)=l;r(p)=r;sum(p)=0;
tag2(p)=-INF;
if(l==r)return;
int mid=(l+r)>>1;
build(zz,l,mid);
build(yy,mid+1,r);
}
inline void pushdown(int p)
{
if(tag2(p)!=-INF)
{
sum(zz)=tag2(p);
sum(yy)=tag2(p);
tag2(zz)=tag2(p);
tag2(yy)=tag2(p);
tag1(zz)=tag1(yy)=0;
tag(zz)=tag(yy)=0;
tag2(p)=-INF;
//return;
}
sum(zz)+=tag(p);
sum(yy)+=tag(p);
tag(zz)+=tag(p);
tag(yy)+=tag(p);
int mid=(l(p)+r(p))>>1;
sum(zz)+=tag1(p)*c[l(p)];
sum(yy)+=tag1(p)*c[mid+1];
tag1(zz)+=tag1(p);
tag1(yy)+=tag1(p);
tag(p)=tag1(p)=0;
}
inline void change(int p,int l,int r,ll v)
{
if(l<=l(p)&&r>=r(p))
{
sum(p)+=v;tag(p)+=v;
sum(p)+=c[l(p)];
++tag1(p);
return;
}
pushdown(p);
int mid=(l(p)+r(p))>>1;
if(l<=mid)change(zz,l,r,v);
if(r>mid)change(yy,l,r,v);
sum(p)=sum(zz);
}
inline ll ask(int p,int x)
{
if(l(p)==r(p))return sum(p);
int mid=(l(p)+r(p))>>1;
pushdown(p);
if(x<=mid)return ask(zz,x);
return ask(yy,x);
}
inline int ask1(int p,int l)
{
if(l(p)>=l&&sum(p)>ww)return 0;
if(l(p)==r(p))return l(p);
int mid=(l(p)+r(p))>>1;
pushdown(p);
if(l>mid)return ask1(yy,l);
int w=ask1(yy,l);
if(!w)return ask1(zz,l);
return w;
}
inline void modify(int p,int l,int r,ll v)
{
if(l<=l(p)&&r>=r(p))
{
sum(p)=v;
tag1(p)=tag(p)=0;
tag2(p)=v;
return;
}
pushdown(p);
int mid=(l(p)+r(p))>>1;
if(l<=mid)modify(zz,l,r,v);
if(r>mid)modify(yy,l,r,v);
sum(p)=sum(zz);
}
signed main()
{
//freopen("1.in","r",stdin);
get(n);
rep(1,n,i)get(a[i]),c[i]=a[i];
rep(1,n,i)get(b[i]);
discrete();
build(1,1,cnt);
rep(1,n,i)
{
change(1,1,a[i],-c[a[i]]+b[i]);
ww=ask(1,a[i]);
int r=ask1(1,a[i]);
//cout<<r<<endl;
modify(1,a[i],r,ww);
}
ll ans=0;
rep(1,cnt,i)ans=max(ans,ask(1,i));
putl(ans);return 0;
}

5.4 省选模拟赛 修改 线段树优化dp 线段树上二分的更多相关文章

  1. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  2. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  3. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  4. 2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)

    2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP) https://www.luogu.com.cn/problem/P1848 题意: 当农夫约翰闲 ...

  5. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  6. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  7. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  8. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

  9. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

随机推荐

  1. All elments are null 异常

    问题描述:1.查询的size是1,但是里面的展示All elmemts are null . 因为之前没有遇到过这个问题,所以先百度了一下,发现有字段不对的,resultMap对不上的,我看了一下都是 ...

  2. Spreading the Wealth,思维

    题目去洛谷 题意: 很清晰,n个人,每人有一些硬币硬币总数sum≡0(mod n),通过一些互相交换,使硬币数平均(即每人有相同个数的硬币) 分析: 还是有点思维含量的,我们这样想,我们其实就是要确定 ...

  3. 不懂SpringApplication生命周期事件?那就等于不会Spring Boot嘛

    学习方法之少废话:吹牛.装逼.叫大哥. 作者:A哥(YourBatman) 公众号:BAT的乌托邦(ID:BAT-utopia) 文末是否有彩蛋:有 目录 前言 正文 生命周期事件流程图 版本说明: ...

  4. 数据库周刊31丨openGauss 正式开源;7月数据库排行榜发布;浙江移动国产数据库AntDB迁移;oracle ADG跨版本搭建;PG解决社保问题;mysqlbinlog解析……

    摘要:墨天轮数据库周刊第31期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.openGauss 正式开源,华为公开发布源代码[摘要]6月1日,华为正式宣布开源数据库能 ...

  5. iOS刨根问底-深入理解GCD

    概述 做过iOS开发的同学相信对于GCD(Grand Central Dispatch)并不陌生,因为在平时多线程开发过程中GCD应该是使用最多的技术甚至它要比它的上层封装NSOperation还要常 ...

  6. SQLserver-MySQL的区别和用法

    对于程序开发人员而言,目前使用最流行的两种后台数据库即为MySQL and SQL Server.这两者最基本的相似之处在于数据存储和属于查询系统.你可以使用SQL来访问这两种数据库的数据,因为它们都 ...

  7. Python 读取Excel之xlrd篇

    上一期给大家分享了如何用Python读取文本,这次给大家分享如何读取Excel表格内容,拿最常见的.xlsx和.xls格式来讲解. 本章主要知识点有: 读取整篇excel返回list[list[lis ...

  8. 数据可视化之 图表篇(三)体验Power BI最新发布的AI图表:分解树

    在刚刚发布的11月更新中,PowerBI界面全新改版,采用和Office套件相似的Ribbon风格,除了这个重大变化,还发布了一个AI黑科技图表:分解树(Decomposition Tree). 无论 ...

  9. Django之 Views组件

    本节内容 路由系统 models模型 admin views视图 template模板 我们已经学过了基本的view写法 单纯返回字符串 1 2 3 4 5 6 7 8 def current_dat ...

  10. 用matplotlib绘制图片示例(新)

    test /*! * * Twitter Bootstrap * */ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 201 ...