zoukankan      html  css  js  c++  java
  • bzoj 1537: [POI2005]Aut- The Bus 线段树

    bzoj 1537: [POI2005]Aut- The Bus

    先把坐标离散化

    设f[i][j]表示从(1,1)走到(i,j)的最优解

    这样直接dp::: f[i][j] = max{f[i-1][j] + f[i][j-1]} + w[i][j]就可以完美的MLE + TLE了

    我们发现f[i][j]中,只有有权的点才有意义,但是我们只有10^5个有用的点,却考虑了10^5 * 10^5个点

    所以我们只考虑有权的点,那么可以发现,

    f[i][j]的更新一定是由f(1,1)~(i,j)的最大值更新过来的

    所以可以用二维树状数组线段树来维护这个东西

    我们按照x坐标排序,再按y排序,这样我们发现上一步计算出来的答案才有可能更新下一个计算出来的y值大于这个值的答案

    我们可以使用线段树来维护这个东西

    :这里使用的是zkw线段树,也就是非递归版线段树

    详见《统计的力量》

     1 #include <queue>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <climits>
     5 #include <algorithm>
     6 using namespace std;
     7 typedef long long ll;
     8 inline void read(ll &x){
     9     x=0;char ch;bool flag = false;
    10     while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
    11     while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
    12 }
    13 inline ll cat_min(const ll &a,const ll &b){return a<b ? a:b;}
    14 inline ll cat_max(const ll &a,const ll &b){return a>b ? a:b;}
    15 inline ll cat_abs(const ll &x){return x < 0 ? -x : x;}
    16 const ll maxn = 100010;
    17 struct Node{
    18     ll x,y,v;
    19     bool friend operator < (const Node &a,const Node &b){
    20         return a.x == b.x ? a.y < b.y : a.x < b.x;
    21     }
    22 }G[maxn];
    23 ll T[maxn<<2],M;
    24 inline void build(ll n){for(M=1;M<(n+1);M<<=1);}
    25 inline void change(ll x,ll val){
    26     if(T[x+=M] >= val) return;
    27     for(T[x]=val,x>>=1;x;x>>=1)
    28         T[x] = cat_max(T[x<<1],T[x<<1|1]);
    29 }
    30 inline ll query(ll s,ll t){
    31     ll ret = 0;
    32     for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
    33         if(~s&1) ret = cat_max(ret,T[s^1]);
    34         if( t&1) ret = cat_max(ret,T[t^1]);
    35     }return ret;
    36 }
    37 ll f[maxn];
    38 inline bool cmp(const Node &a,const Node &b){
    39     if(a.y == b.y) return a.x < b.x;
    40     return a.y < b.y;
    41 }
    42 int main(){
    43  
    44     ll n,m,k;read(n);read(m);read(k);
    45     for(ll i=1;i<=k;++i){
    46         read(G[i].x);read(G[i].y);read(G[i].v);
    47     }
    48     sort(G+1,G+k+1,cmp); 
    49     for(ll i=1,n_h = 0;i<=k;++i) G[i].y = ++n_h;
    50     build(k);
    51     sort(G+1,G+k+1);
    52     ll ans = 0;
    53     for(ll i=1;i<=k;++i){
    54         f[i] = query(1,G[i].y) + G[i].v;
    55         change(G[i].y,f[i]);
    56         ans = cat_max(ans,f[i]);
    57     }printf("%lld
    ",ans);
    58  
    59     return 0;
    60 }
    人就像命运下的蝼蚁,谁也无法操控自己的人生.
  • 相关阅读:
    Win7+CentOS7双系统安装
    python中的 __getattr__ __setattr__ __getitem__ __add__
    对象.函数名 叫方法 和 类.函数名 叫函数
    python中的__str__ __name__ 和__call__方法
    flask中的登录验证 装饰器版 befor_request版
    装饰器
    Django model中的 class Meta 详解
    跨域问题cors
    reids缓存
    python-django目录
  • 原文地址:https://www.cnblogs.com/Skyminer/p/6023230.html
Copyright © 2011-2022 走看看