1. 程式人生 > >【刷題】BZOJ 1537 [POI2005]Aut- The Bus

【刷題】BZOJ 1537 [POI2005]Aut- The Bus

gist != script city const 個數 erase define 成了

Description

Byte City 的街道形成了一個標準的棋盤網絡 – 他們要麽是北南走向要麽就是西東走向. 北南走向的路口從 1 到 n編號, 西東走向的路從1 到 m編號. 每個路口用兩個數(i, j) 表示(1 <= i <= n, 1 <= j <= m). Byte City裏有一條公交線, 在某一些路口設置了公交站點. 公交車從 (1, 1) 發車, 在(n, m)結束.公交車只能往北或往東走. 現在有一些乘客在某些站點等車. 公交車司機希望在路線中能接到盡量多的乘客.幫他想想怎麽才能接到最多的乘客.

Input

第一行三個數n, m 和 k – 表示北南走向的路的個數以及西東走向的路和乘客等車的站點的個數. ( 1 <= n <= 10^9, 1 <= m <= 10^9, 1 <= k <= 10^5). 接下來k 行每行描述一個公交站的信息.第 i + 1 行三個正整數 xi, yi 和 pi, 1 <= xi <= n, 1 <= yi <= m, 1 <= pi <= 10^6. 表示在(xi, yi) 有 pi 個乘客在等車. 每個路口在數據中最多出現一次,乘客總數不會超過1 000 000 000.

Output

一個數表示最多能接到的乘客數量.

Sample Input

8 7 11
4 3 4
6 2 4
2 3 2
5 6 1
2 5 2
1 5 5
2 1 1
3 1 1
7 7 1
7 4 2
8 6 2

Sample Output

11

Solution

先離散化,然後按照第一維排序,保證轉移的時候第一維嚴格滿足條件
第二位寫個dp, \(f[i]\) 代表第二維為 \(i\) 時最優答案是多少
轉移用個線段樹維護就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXK=100000+10;
int n,m,k,f[MAXK];
std::vector<int> V;
std::map<int,int> M;
struct node{
    int x,y,w;
    inline bool operator < (const node &A) const {
        return x<A.x||(x==A.x&&y<A.y);
    };
};
node pot[MAXK];
template<typename T> inline void read(T &x)
{
    T data=0,w=1;
    char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
    if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
#define Mid ((l+r)>>1)
#define ls rt<<1
#define rs rt<<1|1
#define lson ls,l,Mid
#define rson rs,Mid+1,r
struct Segment_Tree{
    int Mx[MAXK<<2];
    inline void PushUp(int rt)
    {
        Mx[rt]=max(Mx[ls],Mx[rs]);
    }
    inline void Update(int rt,int l,int r,int ps,int k)
    {
        if(l==r&&r==ps)chkmax(Mx[rt],k);
        else
        {
            if(ps<=Mid)Update(lson,ps,k);
            else Update(rson,ps,k);
            PushUp(rt);
        }
    }
    inline int Query(int rt,int l,int r,int L,int R)
    {
        if(L<=l&&r<=R)return Mx[rt];
        else
        {
            int res=0;
            if(L<=Mid)chkmax(res,Query(lson,L,R));
            if(R>Mid)chkmax(res,Query(rson,L,R));
            return res;
        }
    }
};
Segment_Tree T;
#undef Mid
#undef ls
#undef rs
#undef lson
#undef rson
inline void init()
{
    for(register int i=1;i<=k;++i)V.push_back(pot[i].x);
    std::sort(V.begin(),V.end());
    V.erase(std::unique(V.begin(),V.end()),V.end());
    for(register int i=0,lt=V.size();i<lt;++i)M[V[i]]=i+1;
    for(register int i=1;i<=k;++i)pot[i].x=M[pot[i].x];
    V.clear();M.clear();
    for(register int i=1;i<=k;++i)V.push_back(pot[i].y);
    std::sort(V.begin(),V.end());
    V.erase(std::unique(V.begin(),V.end()),V.end());
    for(register int i=0,lt=V.size();i<lt;++i)M[V[i]]=i+1;
    for(register int i=1;i<=k;++i)pot[i].y=M[pot[i].y];
}
int main()
{
    read(n);read(m);read(k);
    for(register int i=1;i<=k;++i)read(pot[i].x),read(pot[i].y),read(pot[i].w);
    std::sort(pot+1,pot+k+1);
    init();
    for(register int i=1;i<=k;++i)
    {
        chkmax(f[pot[i].y],T.Query(1,1,k,1,pot[i].y)+pot[i].w);
        T.Update(1,1,k,pot[i].y,f[pot[i].y]);
    }
    int ans=0;
    for(register int i=1;i<=k;++i)chkmax(ans,f[i]);
    write(ans,'\n');
    return 0;
}

【刷題】BZOJ 1537 [POI2005]Aut- The Bus