免费的馅饼

Description

Input

第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5)。  接下来n行,每一行给出了一块馅饼的信息。由三个正整数组成,分别表示了每个馅饼落到舞台上的时刻t[i](1到10^8秒),掉到舞台上的格子的编号p[i](1和w之间),以及分值v[i](1到1000之间)。游戏开始时刻为0。输入文件中同一行相邻两项之间用一个空格隔开。输入数据中可能存在两个馅饼的t[i]和p[i]都一样。

Output

一个数,表示游戏者获得的最大总得分。

Sample Input

3 4
1 2 3
5 2 3
6 3 4
1 1 5

Sample Output

12
【数据规模】
对于100%的数据,1<=w,t[i]<=10^8,1<=n<=100000。

题解:

用f[i][j]表示游戏者在第i时刻,第j位置上获得的最大价值,考虑将馅饼按时间从小到大排序,这样可以将二维数组降到一维,用f[i]表示到第i个馅饼,第i个必须选的最大值,然后枚举 i 到 i-1 所有的 j,如果它接到a[j]这个馅饼以后能在规定时间内跑到a[i],就用f[j]来更新f[i]。

考虑什么样的 j 能作为决策点,对于当前点的a【i】和用作决策点的a【j】,时间限制是 a[i].t - a[j].t,它们之间的距离是abs(a[i].pos-a[j].pos);跑过这段距离最少所需要的时间是。注意这里是向上取整,因为如果是5个格子的话它要用3个单位时间跑到而不是2个。

那么如果j可以作为i的决策点就可以列出一个不等式。为了消掉难搞的绝对值我们分两种情况讨论:

①当i的pos大于j的pos的时候,就是 。把i的和j的分别拿到两边去。乘以2消掉上取整,然后再移项就有了一个非常好的式子:

②当i的pos小于j的pos的时候,我们可以化出式子:。于是就可以给每一个a[i]预处理两个权值,转化比较w1或w2就可以了。但是这个玩意怎么优化呢?如果直接这么看的话它的限制好像还是很多,还是没有办法搞。

当i的pos大于j的pos并且i的w1大于j的w1的时候,把w1加上两倍的pos就变成了w2,这个时候相当于是大的那一边加上较大的数字,小的那一边加上较小的数字,大小关系不变;当i的pos小于j的pos的时候证明方法是类似的。用后面的式子推出前面的那就很显然了。

那么只需要把所有馅饼按照w1为第一关键字,w2为第二关键字排序,然后用树状数组维护前缀最大值就可以了。注意作为下标的w2要离散化。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int w,n;//舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5)
int cnt;//数据量
int ans;//答案
int f[maxn];
int Hash[maxn];
int s[maxn];//树状数组struct pies
{int t;//馅饼落到舞台上的时刻t[i](1到10^8秒)int p;//掉到舞台上的格子的编号p[i](1和w之间)int v;//以及分值v[i](1到1000之间)int w1;//w1=2*t+posint w2;//w2=2∗t−pos
};
pies a[maxn];
void init()
{cnt=0;ans=0;memset(f,0,sizeof(f));memset(Hash,0,sizeof(Hash));memset(s,0,sizeof(s));memset(a,0,sizeof(a));
}
bool comp(pies a,pies b)
{return a.w1<b.w1||a.w1==b.w1&&a.w2<=b.w2;
}
int lowbit(int x)
{return x&(-x);
}
int ask(int i)
{int Max=0;while(i){Max=max(Max,s[i]);i-=lowbit(i);}return Max;
}
void add(int i,int val)
{while(i<=cnt){s[i]=max(s[i],val);i+=lowbit(i);}
}
int main()
{
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);while (scanf("%d%d",&w,&n)!=EOF){init();for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i].t,&a[i].p,&a[i].v);a[i].t*=2;a[i].w1=a[i].t-a[i].p;a[i].w2=a[i].t+a[i].p;Hash[++cnt]=a[i].w2;}sort(Hash+1,Hash+cnt+1);cnt=unique(Hash+1,Hash+cnt+1)-Hash-1;for(int i=1;i<=n;i++)a[i].w2=lower_bound(Hash+1,Hash+cnt+1,a[i].w2)-Hash;sort(a+1,a+n+1,comp);for(int i=1;i<=n;i++){f[i]=ask(a[i].w2)+a[i].v;ans=max(ans,f[i]);add(a[i].w2,f[i]);}printf("%d\n",ans);
}return 0;
}

BZOJ2131免费的馅饼 DP+树状数组相关推荐

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

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

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

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

  3. bzoj 2131: 免费的馅饼【dp+树状数组】

    简单粗暴的dp应该是把馅饼按时间排序然后设f[i]为i接到馅饼能获得的最大代价,转移是f[i]=max(f[j])+v[i],t[j]<=t[i],2t[i]-2t[j]>=abs(p[i ...

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

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

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

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

  6. dp 树状数组 逆序元组

    wmq的队伍 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 2000ms   内存限制: 512M 描述 交大上课需要打卡,于是在上课前的 ...

  7. 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 ...

  8. HDU 2836 Traversal 简单DP + 树状数组

    题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...

  9. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

最新文章

  1. 国外同行关注啥——digg.com网站Programming分类每周热点[12/17 - 12/23]
  2. 软件定义闪存存储系统关键技术
  3. hadoop + spark+ hive 集群搭建(apache版本)
  4. 2017中国电商峰会共话“一带一路”网上商机
  5. Winform GDI+ 绘图
  6. Windows Firewall/Internet Connection Sharing (ICS) 无法启动解决办法
  7. 2.Modbus通信协议-软件调试4个工具软件(推荐)
  8. 微博的html,微博输入html
  9. Spring Cloud - 熔断(Hystrix)
  10. ext4文件系统布局
  11. 04【前端工程化初探】Jenkines+GitLab+Tomcat流水线配置部署React应用
  12. python网络爬虫笔记
  13. 在 Cocos Creator 中使用缓动系统(cc.tween)
  14. 三菱Q系列PLC ,QD77MS16走总线控制伺服项目
  15. 正则表达式(regex)入门
  16. Carson带你学数据结构:手把手带你了解 ”图“ 所有知识!(含DFS、BFS)
  17. js脚本根据身份证号获取性别、年龄、家庭地址、生日
  18. ceph monitor 选举leader和peon的过程
  19. android ui设计最新字体,ui用什么字体_安卓ui设计用什么字体
  20. SSM+公寓管理系统 毕业设计-附源码171958

热门文章

  1. 第三模块:面向对象(目录)
  2. 欢迎来怼---作业要求 20171015 beta冲刺贡献分分配规则
  3. Universal-Image-Loader(UIL)图片载入框架使用简介
  4. 解决Eclipse代码分析插件SonarLint在Console输出乱码问题
  5. Unity5 官方教程笔记(2D Rogue Like)07 —— GUI
  6. 关于Metasploit开发环境的搭建
  7. Debian 和Ubuntu Mono 3.0 部署包
  8. JTable调整列宽
  9. [eBook] SQL 2008
  10. 千里眼摄像头支持对象存储吗_【手机技术】专业相机应用Halide全面支持苹果iPhone SE 2人像模式...