zoukankan      html  css  js  c++  java
  • 【bzoj2131】免费的馅饼 dp+树状数组

    题目描述

    输入

    第一行是用空格隔开的二个正整数,分别给出了舞台的宽度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]都一样。

    输出

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

    样例输入

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

    样例输出

    12


    题解

    dp+树状数组

    如果按照$t[i]$排序,即掉落顺序,那么考虑朴素的dp方程:$f[i]=max(f[j])+v[i] (j<i&&2(t[i]-t[j])ge|p[i]-p[j]|)$。

    然后把绝对值展开并移项即得转移条件:$j<i&&2t[i]+p[i]ge 2t[j]+p[j]&&2t[i]-p[i]ge 2t[j]-p[j]$。

    可以看出这是一个三维偏序问题,不过仔细想一想其实是二维的:把后两个转移条件加起来可以得到$t[i]ge t[j]$,即可忽略$j<i$的条件。

    然后按照$2t+p$和$2t-p$的某一个排序,另一个离散化,使用树状数组维护前缀最大值即可得到答案。

    #include <cstdio>
    #include <algorithm>
    #define N 100010
    using namespace std;
    struct data
    {
    	int t , p , v , x;
    }a[N];
    int tmp[N] , dp[N] , f[N] , n;
    bool cmp(data a , data b)
    {
    	return a.p - 2 * a.t >= b.p - 2 * b.t;
    }
    void update(int x , int a)
    {
    	int i;
    	for(i = x ; i <= n ; i += i & -i) f[i] = max(f[i] , a);
    }
    int query(int x)
    {
    	int i , ans = 0;
    	for(i = x ; i ; i -= i & -i) ans = max(ans , f[i]);
    	return ans;
    }
    int main()
    {
    	int i , ans = 0;
    	scanf("%*d%d" , &n);
    	for(i = 1 ; i <= n ; i ++ ) scanf("%d%d%d" , &a[i].t , &a[i].p , &a[i].v) , tmp[i] = a[i].p + 2 * a[i].t;
    	sort(tmp + 1 , tmp + n + 1);
    	for(i = 1 ; i <= n ; i ++ ) a[i].x = lower_bound(tmp + 1 , tmp + n + 1 , a[i].p + 2 * a[i].t) - tmp;
    	sort(a + 1 , a + n + 1 , cmp);
    	for(i = 1 ; i <= n ; i ++ ) dp[i] = query(a[i].x) + a[i].v , update(a[i].x , dp[i]) , ans = max(ans , dp[i]);
    	printf("%d
    " , ans);
    	return 0;
    }
    

     

  • 相关阅读:
    Linux查看用于终止进程命令
    Linux查看当前正在运行的进程
    Windows 和 Linux 平台下的端口转发工具
    Windows 和 Linux 平台下的端口转发工具
    linux下最简单的端口转发工具
    linux下最简单的端口转发工具
    try与finally块中return的问题
    try与finally块中return的问题
    为啥还要写呢?——北漂18年序言
    JavaScript DOM对象和JQuery对象相互转换
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7147678.html
Copyright © 2011-2022 走看看