2131: 免费的馅饼

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 508  Solved: 310
[Submit][Status][Discuss]

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。

HINT

 

Source

 

[Submit][Status][Discuss]

HOME Back


一道经典的二维偏序问题。至于怎么将原题目转换为二维偏序??

首先可以将每秒走一步和两步转换为每0.5秒选择走或不走,把时间加倍。接下来考虑dp转移。能从j转移到i当且仅当ti-tj>=|pi-pj|,可以转换为两个式子:pi>=pj时,ti-pi>=tj-pj,又因为pi-pj此时是正数,所以pj-pi是负数,因为ti-tj此时已经大于一个正数,则它也一定大于负数,即ti-tj>=pj-pi也成立,即ti+pi>=tj+pj一定成立,同理pi<pj时,ti+pi>=tj+pj,ti-pi>=tj-pj也一定成立。所以满足条件的转移一定满足这两个式子。而满足这两个式子时,ti-tj一定是个正数。所以不用考虑ti的顺序了。

设val1=ti+pi,val2=ti-pi,则转换为了一个二维偏序问题。一维排序,一维用值域树状数组或者值域线段树优化。【注意】因为t值非常大,需要离散化值域。

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std; int w, n;
ll val2[], pos[]; struct node {
ll val1, val2;
int t, p, v;
} pie[]; ll TR[]; bool cmp ( node a, node b ) {
return a.val1 < b.val1;
} void update ( int nd ) {
TR[nd] = max ( TR[nd << ], TR[nd << | ] );
} void insert ( int nd, int l, int r, int pos, ll delta ) {
if ( l == r ) {
TR[nd] = delta;
return ;
}
int mid = ( l + r ) >> ;
if ( pos <= mid ) insert ( nd << , l, mid, pos, delta );
else insert ( nd << | , mid + , r, pos, delta );
update ( nd );
} ll query ( int nd, int l, int r, int L, int R ) {
if ( l >= L && r <= R ) return TR[nd];
int mid = ( l + r ) >> ;
ll ans = ;
if ( L <= mid ) ans = max ( ans, query ( nd << , l, mid, L, R ) );
if ( R > mid ) ans = max ( ans, query ( nd << | , mid + , r, L, R ) );
return ans;
} int main ( ) {
scanf ( "%d%d", &w, &n );
for ( int i = ; i <= n; i ++ ) {
scanf ( "%d%d%d", &pie[i].t, &pie[i].p, &pie[i].v );
pie[i].val1 = pie[i].t * + pie[i].p;
pie[i].val2 = pie[i].t * - pie[i].p;
val2[i] = pie[i].val2;
}
sort ( pie + , pie + + n, cmp );
sort ( val2 + , val2 + + n );
int w = unique ( val2 + , val2 + + n ) - val2 - ;
for ( int i = ; i <= n; i ++ ) {
int pr = lower_bound ( val2 + , val2 + + w, pie[i].val2 ) - val2;
ll tmp = query ( , , w, , pr );
ll dp = tmp + pie[i].v;
insert ( , , w, pr, dp );
}
printf ( "%lld", TR[] );
return ;
}

10.12更新

老李布置的练习,又写了一遍....线段树是要取max!!

#include<bits/stdc++.h>
#define LL long long
using namespace std; struct Node {
int t, p, v;
LL v1, v2;
} pie[];
bool cmp(Node a, Node b) { return a.v1 < b.v1; } LL TR[];
void update(int nd) {
TR[nd] = max(TR[nd << ], TR[nd << | ]);
} void add(int nd, int pos, int l, int r, LL d) {
if(l == r) {
TR[nd] = max(TR[nd], d);
return ;
}
int mid = (l + r) >> ;
if(pos <= mid) add(nd << , pos, l, mid, d);
else add(nd << | , pos, mid + , r, d);
update(nd);
} LL query(int nd, int L, int R, int l, int r) {
if(l >= L && r <= R) return TR[nd];
int mid = (l + r) >> ; LL ans = ;
if(L <= mid) ans = max(ans, query(nd << , L, R, l, mid));
if(R > mid) ans = max(ans, query(nd << | , L, R, mid + , r));
return ans;
} int w, n;
LL a[];
int main() {
scanf("%d%d", &w, &n);
for(int i = ; i <= n; i ++) {
scanf("%d%d%d", &pie[i].t, &pie[i].p, &pie[i].v);
pie[i].v1 = pie[i].t * + pie[i].p;
pie[i].v2 = pie[i].t * - pie[i].p;
a[i] = pie[i].v2;
}
sort(pie + , pie + + n, cmp);
sort(a + , a + + n);
int m = unique(a + , a + + n) - a - ;
for(int i = ; i <= n; i ++) {
int pos = lower_bound(a + , a + + n, pie[i].v2) - a;
LL now = query(, , pos, , n);
LL dp = now + pie[i].v;
add(, pos, , n, dp);
}
printf("%lld", TR[]);
return ;
}

【BZOJ】2131: 免费的馅饼的更多相关文章

  1. bzoj 2131 : 免费的馅饼 (树状数组优化dp)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2131 思路: 题目给出了每个馅饼的下落时间t,和位置p,以及价值v,我们可以得到如下状态 ...

  2. bzoj 2131 免费的馅饼

    Written with StackEdit. Description Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度\(W\)(\(1\)到\(10^8\)之间)和馅饼的个数\(n ...

  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. [bzoj2131]免费的馅饼 树状数组优化dp

    2131: 免费的馅饼 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description Input 第一行是 ...

  5. [bzoj2131]免费的馅饼_树状数组

    免费的馅饼 bzoj-2131 题目大意: 注释:$1\le n \le 10^5$,$1\le w \le 10^8$. 想法:首先,想到dp 状态:dp[i][j]表示i分钟在位置j的最大收益 优 ...

  6. 免费的馅饼 HYSBZ - 2131 (树状数组维护二维偏序)

    题目链接:https://cn.vjudge.net/problem/HYSBZ-2131 题目大意:中文题目 具体思路:对于任意的两个位置,posA和posB,我们可以如下推导. |posA-pos ...

  7. bzoj2131 免费的馅饼——树状数组优化dp

    中文题目,问你最后能最多够得到多少价值的馅饼.因为宽度10^8且个数为10^5.所以不可以用dp[x][y]表示某时间某地点的最大权值. 假设你在x点处接到饼后想去y点接饼.那么需要满足的条件是t[y ...

  8. BZOJ2131 免费的馅饼【线段树优化DP】

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

  9. BZOJ 2131 [scoi2010] 传送带

    @(BZOJ)[三分法] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段. 两条传送带分别为线段AB和线段CD. lxhgww在AB上的移动速度为P,在CD上的移 ...

随机推荐

  1. zedboard学习记录.1.纯PL流水灯

    环境:vivado 217.4 开发板: zedboard ver.d xc7z020clg484-1 1.打开Vivado新建一个RTL工程. 2.add source->add/create ...

  2. 项目记录 -- config2html 理解

    html 代码: <table width=1280 border=0 cellspacing=1 cellpadding=1> <tr id=tblhdr> <td&g ...

  3. 【并行计算】用MPI进行分布式内存编程(二)

    通过上一篇中,知道了基本的MPI编写并行程序,最后的例子中,让使用0号进程做全局的求和的所有工作,而其他的进程却都不工作,这种方式也许是某种特定情况下的方案,但明显不是最好的方案.举个例子,如果我们让 ...

  4. Effective C++笔记(四):设计与声明

    参考:http://www.cnblogs.com/ronny/p/3747186.html 条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接 ...

  5. IntelliJ IDEA 创建maven项目一次后,然后删除,再次保存到此目录下,提供此目录已经被占用的问题。

    -------------------2017-02-14补充: 你看既然是创建过一次 不允许再次创建了,那么请问 第一次创建的 跑哪里去了,不仅仅是保存到了你指定的目录里,其实也默认安装到了 mav ...

  6. spring-cloud-sleuth+zipkin追踪服务实现(二)

    1. 简述 在上一节<spring-cloud-sleuth+zipkin追踪服务实现(一)>中,我们使用microservice-zipkin-server.microservice-z ...

  7. Java-redis分布式锁 抢购秒杀系统 实现

    一.使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现) 共享资源(各个系统访问同一个资源,资源的载体 ...

  8. 【WPF】ListView自定义分页

    XAML: <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDe ...

  9. 洛谷P3435 [POI2006]OKR-Period of Words [KMP]

    洛谷传送门,BZOJ传送门 OKR-Period of Words Description 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, ...

  10. ACID数据库事务正确执行的四个基本要素的缩写

    ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...