• 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 }
    人就像命运下的蝼蚁,谁也无法操控自己的人生.
  • 相关阅读:
    同一根域名的多站点登录共享
    mysql忘记管理员密码
    使用Cacti监控你的网络(四) Cacti脚本及模板
    使用Cacti时常见的问题集
    SQL Server:SQL Like 通配符特殊用法:Escape
    IS6.0 应用程序池Web园导致Session丢失
    VMware建立虚拟机无法上网
    SqlServer 添加用户 添加角色 分配权限
    教你如何在SQL Server数据库中加密数据
    sendmail邮件服务器搭载smtp和pop3认证的配置方法
  • 原文地址:https://www.cnblogs.com/Skyminer/p/6023230.html
Copyright © 2020-2023  润新知