zoukankan      html  css  js  c++  java
  • bzoj2131: 免费的馅饼(树状数组)

    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。
     

    首先不难得到转移方程$dp[i]=max{dp[j]}+val[i](|p_i-p_j|leq 2t_i-2t_j)$

    考虑怎么转换限制条件,$p_i-p_jleq 2t_i-2t_j$且$p_j-p_ileq 2t_i-2t_j$,则有$2t_i-p_igeq 2t_j-p_j$且$2t_i+p_igeq 2t_j+p_j$

    那么就是一个二维偏序问题了,先排序消除第一维的影响,然后用树状数组维护第二维就好了

     1 //minamoto
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #define ll long long
     6 using namespace std;
     7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
     8 char buf[1<<21],*p1=buf,*p2=buf;
     9 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
    10 ll read(){
    11     #define num ch-'0'
    12     char ch;bool flag=0;ll res;
    13     while(!isdigit(ch=getc()))
    14     (ch=='-')&&(flag=true);
    15     for(res=num;isdigit(ch=getc());res=res*10+num);
    16     (flag)&&(res=-res);
    17     #undef num
    18     return res;
    19 }
    20 const int N=5e5+5;
    21 int n,w;ll c[N];
    22 inline void add(int x,ll y){
    23     for(;x<=n+1;x+=x&-x) cmax(c[x],y);
    24 }
    25 ll query(int x){
    26     ll res=0;for(;x;x-=x&-x) cmax(res,c[x]);return res;
    27 }
    28 struct node{
    29     int x,y;ll v;
    30     inline bool operator <(const node &b)const
    31     {return x==b.x?y<b.y:x<b.x;}
    32 }a[N];int b[N];
    33 int main(){
    34 //    freopen("testdata.in","r",stdin);
    35     w=read(),n=read();
    36     for(int i=1;i<=n;++i){
    37         int t=read(),p=read();a[i].v=read();
    38         a[i].x=2*t+p,a[i].y=2*t-p,b[i]=a[i].y;
    39     }
    40     sort(a+1,a+1+n),sort(b+1,b+n+1);
    41     for(int i=1;i<=n;++i){
    42         ll res=0;int pos=lower_bound(b+1,b+1+n,a[i].y)-b;
    43         res=query(pos)+a[i].v,add(pos,res);
    44     }
    45     printf("%lld
    ",query(n+1));
    46     return 0;
    47 }
  • 相关阅读:
    【curl】Linux下命令行curl详解
    【httpwatch】httpwatch对测试的应用
    【岗位知识小记录】
    linux系统修改route路由
    yum无法正常安装,提示如下 There are no enabled repos Run "yum repolist all"
    Ubuntu14.04切换root用户
    【AAA】AAA协议介绍
    各种工具网站
    任职资格:
    推荐一个下载mac应用的良心网站
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9819122.html
Copyright © 2011-2022 走看看