简单粗暴的dp应该是把馅饼按时间排序然后设f[i]为i接到馅饼能获得的最大代价,转移是f[i]=max(f[j])+v[i],t[j]<=t[i],2t[i]-2t[j]>=abs(p[i]-p[j])
后面这个条件就很麻烦,我们分情况讨论拆成两个,也就是当p[i]>p[j],满足2t[i]-p[i]>=2t[j]-p[j],和当p[i]<=p[j],满足2t[i]+p[i]>=2t[j]+p[j],然后注意到,因为t[j]<=t[i],所以满足2t[i]-p[i]>=2t[j]-p[j]则一定有p[i]>p[j],满足2t[i]+p[i]>=2t[j]+p[j]则一定有p[i]<=p[j]
那么条件就变成了t[j]<=t[i]&&2t[i]-p[i]>=2t[j]-p[j]||2t[i]+p[i]>=2t[j]+p[j],再推一下,如果满足2t[i]-p[i]>=2t[j]-p[j],2t[i]+p[i]>=2t[j]+p[j],合起来就是t[j]<=t[i],然后条件就变成2t[i]-p[i]>=2t[j]-p[j]&&&2t[i]+p[i]>=2t[j]+p[j]
然后一维排序,另一维树状数组优化dp即可

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int N=200005;
int n,m,f[N],g[N],has,t[N],ans;
map<int,int>mp;
struct qwe
{int t,p,v,w1,w2;
}a[N];
bool cmp(const qwe &a,const qwe &b)
{return a.w1<b.w1||(a.w1==b.w1&&a.w2<b.w2);
}
int read()
{int r=0,f=1;char p=getchar();while(p>'9'||p<'0'){if(p=='-')f=-1;p=getchar();}while(p>='0'&&p<='9'){r=r*10+p-48;p=getchar();}return r*f;
}
void update(int x,int v)
{for(int i=x;i<=has;i+=(i&(-i)))t[i]=max(t[i],v);
}
int ques(int x)
{int r=0;for(int i=x;i>=1;i-=(i&(-i)))r=max(r,t[i]);return r;
}
int main()
{m=read(),n=read();for(int i=1;i<=n;i++)a[i].t=read()*2,a[i].p=read(),a[i].v=read(),a[i].w1=a[i].t-a[i].p,a[i].w2=g[i]=a[i].t+a[i].p;sort(g+1,g+1+n);for(int i=1;i<=n;i++)if(i==1||g[i]!=g[i-1])mp[g[i]]=++has;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++)a[i].w2=mp[a[i].w2];for(int i=1;i<=n;i++){f[i]=ques(a[i].w2)+a[i].v;update(a[i].w2,f[i]);ans=max(ans,f[i]);}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/lokiii/p/9857584.html

bzoj 2131: 免费的馅饼【dp+树状数组】相关推荐

  1. bzoj 2131: 免费的馅饼(树状数组+DP)

    2131: 免费的馅饼 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 408  Solved: 245 [Submit][Status][Discu ...

  2. BZOJ2131免费的馅饼 DP+树状数组

    免费的馅饼 Description Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三 ...

  3. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  4. BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2131 是 hydro 的 BZOJ ...

  5. BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j)if(a[j ...

  6. bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...

  7. BZOJ.4888.[TJOI2017]异或和(树状数组)

    BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...

  8. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

  9. 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)

    题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...

最新文章

  1. oracle ora 14047,ORA-14047: ALTER TABLE|INDEX RENAME 不可以与其它分区组合
  2. 【通知】深度学习之人脸图像算法核心代码开源和勘误汇总
  3. MC34063组成DC-DC电路
  4. Windows系统(cmd)常用命令
  5. cakephp 2.0 源码解读(一)
  6. 在着手开发一款移动应用之前,我们需要考虑哪些因素?
  7. THUSC2019去不了记
  8. dubbo入门之微服务客户端服务端配置
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_14_匿名内部类方式实现线程的创建...
  10. 数模美赛分享(时间安排+获奖技巧+比赛思路)
  11. OkHttp3 源码解读
  12. 网易手游《镇魔曲》怎么打?华为畅享6S帮你春节同学聚会露一手
  13. 【王道考研】操作系统 笔记 第一章
  14. jsp制作的个人网站
  15. 在Android平台上搭建Qualcomm的FastCv
  16. 赛门铁克ssl证书   仲裁证书
  17. 企业参加社保须知(缴费比例表)
  18. 计算机系统集成双代号网络图讲解,系统集成项目管理工程师双代号时标网络图知识解读...
  19. Numpy+Pandas+Matplotlib学习
  20. Uncaught Error: Undefined constant “Ford“

热门文章

  1. 第八次立会顺利召开!
  2. 分布式缓存产品Redis和memcached比较区别(图)
  3. BZOJ 3779 LCT 线段树 DFS序 坑
  4. reportng定制修改
  5. 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...
  6. 【BZOJ】【3671】【NOI2014】随机数生成器
  7. LeetCode(171)——Excel表列序号(JavaScript)
  8. ★LeetCode(182)——查找重复的电子邮箱(MySQL)
  9. 今天来总结一下CSS中有哪些定位
  10. python integer怎么用_Python core.integer方法代码示例