4296. 【NOIP2015模拟11.2】有趣的有趣的家庭菜园
Description
职业经营家庭菜园的JOI君每年在自家的田地中种植一种叫做IOI草的植物。IOI草的种子在冬天被播下,春天会发芽并生长至一个固定的高度。到了秋天,一些IOI草会结出美丽的果实,并被收获,其他的IOI草则会在冬天枯萎。
JOI君的田地沿东西方向被划分为N个区域,从西侧开始的第i个区域中种植着IOI草i。在第i个区域种植的IOI草,在春天的时候高度会生长至Hi,此后便不再生长。如果IOI草i会结出果实,那么将会获得Pi的收益,否则没有收益。
春天到了,查看田地样子的JOI君决定拔掉一些种植的IOI草,使利益最大化。拔掉IOI草i需要Ci的花销,拔掉的IOI草会立刻枯萎。IOI草只能在春天被拔掉,夏天和秋天不能拔掉IOI草。
IOI草是一种非常依靠阳光的植物,如果在夏天某个区域的IOI草的东侧和西侧都有比它高的IOI草存在,那么这株IOI草在秋天便不会结出果实。换句话说,为了让没有被拔掉的IOI草i在秋天结出果实,到了夏天的时候,以下两个条件至少满足一个:
1.对于任意1<=j<=i-1,Hj<=Hi或IOI草j已经被拔除
2.对于任意i+1<=j<=N,Hj<=Hi或IOI草j已经被拔除
用最终收获的果实的总价格减掉拔除IOI草的花销的总和,即为JOI君的收益。那么JOI君能从IOI草中获取的最大利益到底有多少呢?
Input
第一行一个正整数N,表示田地被分为了N个区域。
接下来N行,第i行(1<=i<=N)三个空白分割的正整数Hi,Pi,Ci,表示第i株IOI草在春天时高度会生长至Hi,秋天收获的果实的价格为Pi,拔除所需费用为Ci。
Output
输出一行一个整数,表示JOI君能获得的最大利益
Sample Input
7 22 60 30 46 40 30 36 100 50 11 140 120 38 120 20 24 90 60 53 50 20
Sample Output
320 【HINT】 拔除IOI草2和IOI草7,剩余的IOI草如下图所示:IOI草1、3、5、6的果实价格分别为60、100、120、90,拔除IOI草2和IOI草7的花销分别为30、20,总收益为320,这是所有方案中的最大值。
Data Constraint
对于30%的数据,N<=20
对于45%的数据,N<=300
对于60%的数据,N<=5000
对于100%的数据:
3<=N<=10^5
1<=Hi<=10^9 (1<=i<=N)
1<=Pi<=10^9 (1<=i<=N)
1<=Ci<=10^9 (1<=i<=N)
Solution
最优答案呈三角形(中间高两边低)。
对于前后过做一遍。
设f[i]表示从前(或后)往后(或前)做到i的最优答案。
f[i]=p[ i ]+ max{ f[ j ] - sigma( cost[k], k | j<k<i&&h[k]>h[i] ) }
可以转换一下,直接删去比所有比 j 高的即可。
因为:如果 i 想从 j 转移过来:
1.如果 h[ k ] >h[ i ]>h[ j ]
那么k必须要删去。
2.如果 h[ i ]>h[ k ]>h[ j ]
因为k>j,所以我们相当于已经让i从k转移过来过一次了,即k可以转移到 i ,且包含了j的答案,所以一定比j优,这时删不删掉k对最右答案没有影响。
综上,可以把所有的比j高的直接删掉。
反过来,每次做完i的时候,把f[ i ]放进h[ i ]的线段树里面,然后把0~h[i]-1的高度的线段树里的值全部减去cost[ i ]。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define I int
#define L x<<1
#define R L|1
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define ll long long
#define N 300010
using namespace std;
ll a[N],n,rk[N],cnt=0;
ll v[N],c[N],s[N],f[N],g[N],tr[N*5],lzy[N*5],ans;
struct node{ll v,id;}h[N];
I cmp(node x,node y){return x.v<y.v;}
void down(I x){if(!lzy[x]) return;tr[L]+=lzy[x],tr[R]+=lzy[x];lzy[L]+=lzy[x],lzy[R]+=lzy[x];lzy[x]=0;
}
void cg(I x,I l,I r,I k,ll val){if(l==r){tr[x]=max(tr[x],val);return;}down(x);I M=l+r>>1;if(k<=M) cg(L,l,M,k,val);else cg(R,M+1,r,k,val);tr[x]=max(tr[L],tr[R]);
}
ll qry(I x,I l,I r,I l2,I r2){if(l==l2&&r==r2){return tr[x];}down(x);I M=l+r>>1;if(r2<=M) return qry(L,l,M,l2,r2);else if(l2>M) return qry(R,M+1,r,l2,r2);else return max(qry(L,l,M,l2,M),qry(R,M+1,r,M+1,r2));
}
void ad(I x,I l,I r,I l2,I r2,ll val){if(l==l2&&r==r2){tr[x]+=val,lzy[x]+=val;return;}down(x);I M=l+r>>1;if(r2<=M) ad(L,l,M,l2,r2,val);else if(l2>M) ad(R,M+1,r,l2,r2,val);else{ad(L,l,M,l2,M,val),ad(R,M+1,r,M+1,r2,val);}
}
I main(){freopen("herbary.in","r",stdin);freopen("herbary.out","w",stdout);scanf("%d",&n);F(i,1,n){scanf("%d%lld%lld",&a[i],&v[i],&c[i]);h[i]=node{a[i],i};}sort(h+1,h+1+n,cmp);F(i,1,n){if(h[i].v!=h[i-1].v) cnt++;rk[h[i].id]=cnt;}memset(tr,-127,sizeof tr);cg(1,0,n,0,0);F(i,1,n){f[i]=v[i]+qry(1,0,n,0,rk[i]);cg(1,0,n,rk[i],f[i]);ad(1,0,n,0,rk[i]-1,-c[i]);f[i]=max(f[i],f[i-1]);}memset(tr,-127,sizeof tr);cg(1,0,n,0,0);Fd(i,n,1){g[i]=v[i]+qry(1,0,n,0,rk[i]);cg(1,0,n,rk[i],g[i]);ad(1,0,n,0,rk[i]-1,-c[i]);g[i]=max(g[i],g[i+1]);}F(i,1,n-1){ans=max(ans,f[i]+g[i+1]);}printf("%lld\n",ans);return 0;
}
4296. 【NOIP2015模拟11.2】有趣的有趣的家庭菜园相关推荐
- 【NOIP2015模拟11.3晚】JZOJ7月31日提高组T1 次芝麻
[NOIP2015模拟11.3晚]JZOJ7月31日提高组T1 次芝麻 题目 题解 题意 分析 Code 题目 题解 题意 给出两个数 x x x, y y y 每次操作会将小的数乘2,大的数减去小的 ...
- JZOJ 4307. 【NOIP2015模拟11.3晚】喝喝喝
Description Input Output Sample Input 3 2 5 3 1 Sample Output 4 Data Constraint Solution 首先,"坏对 ...
- 【NOIP2015模拟11.2晚】我的天
题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着独立的生活,完全没有意识到其他n个人的存在. 但有一天,村民xiba臻 ...
- 4298. 【NOIP2015模拟11.2晚】我的天
Description 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着独立的生活,完全没有意识到其他n个人的存在. 但有一 ...
- jzoj. 4298. 【NOIP2015模拟11.2晚】我的天
Description 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着独立的生活,完全没有意识到其他n个人的存在. 但有一 ...
- A. [2021.1.29多校省选模拟11]最大公约数(杜教筛/数论)
A. [2021.1.29多校省选模拟11]最大公约数 这是一个杜教筛的经典题目,最后我们只需要筛一下1∗xμ(x)1*x\mu(x)1∗xμ(x)这个函数的前缀和即可,然后看到有111这个函数,我们 ...
- JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)
3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...
- jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修
Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...
- 【NOIP2011模拟11.1】钓鱼
[NOIP2011模拟11.1]钓鱼 Description 我们把钓鱼的过程放在坐标系里来考虑.图中蓝色的点为船,初始时它的坐标记为(Ax,y).河深为y,河宽为x.某个时刻会从左边界或右边界游出来 ...
最新文章
- linux下防DDOS***软件及使用方法详解
- CentOS7援救模式下更改密码
- [转] Windows Server 2012 Beta Cluster (Hyper-V 3.0)-SMB篇
- 通过实例理解 JDK8 的 CompletableFuture
- 04-Flutter移动电商实战-打通底部导航栏
- 微信小程token_微信小程序开发之登录换取token
- python关键词共现图谱_Python简单实战项目:《冰与火之歌1-5》角色关系图谱构建——人物关系可视化...
- 硬件时序图软件——TimeGen_v3.3
- python中将一个numpy数组转为str,写入文件时会自动换行
- 数据库管理员详细介绍
- 从零搭建Angular10项目
- 云计算中的Server Consolidation
- star法则简历Android,优秀简历坚持STAR原则
- 不管你学的是什么专业,你都应该多少懂些 (来自qq空间)(分享)(转载)
- 算法设计与分析第一章作业
- 计算在一起的天数html,记录情侣在一起天数的软件 很火的情侣天数记录软件
- 【TensorRT】PyTorch模型转换为ONNX及TensorRT模型
- java程序员自我简介及简历
- DSP28335数据类型
- 修道士野人问题的python求解