zoukankan      html  css  js  c++  java
  • 树状数组优化dp,一维排序,一维离散化

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<cstring>
    #include<map>
    #include<set>
    #include<queue>
    #include<bitset>
    #include<utility>
    #include<functional>
    #include<iomanip>
    #include<sstream>
    #include<ctime>
    #include<cassert>
    #define A first
    #define B second
    #define mp make_pair
    #define pb push_back
    #define pw(x) (1ll << (x))
    #define sz(x) ((int)(x).size())
    #define all(x) (x).begin(),(x).end()
    #define rep(i,l,r) for(int i=(l);i<(r);i++)
    #define per(i,r,l) for(int i=(r);i>=(l);i--)
    #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
    #define eps 1e-9
    #define PIE acos(-1)
    #define cl(a,b) memset(a,b,sizeof(a))
    #define fastio ios::sync_with_stdio(false);cin.tie(0);
    #define lson l , mid , ls
    #define rson mid + 1 , r , rs
    #define ls (rt<<1)
    #define rs (ls|1)
    #define INF 0x3f3f3f3f
    #define lowbit(x) (x&(-x))
    #define sqr(a) a*a
    #define ll long long
    #define ull unsigned long long
    #define vi vector<int>
    #define pii pair<int, int>
    #define dd(x) cout << #x << " = " << (x) << ", "
    #define de(x) cout << #x << " = " << (x) << "
    "
    #define endl "
    "
    using namespace std;
    #define pll pair<ll,ll>
    const int maxn=1e5+7;
    ll n,d[maxn<<1];
    ll tot;
    vector<int>v;
    //**********************************
    struct Node{
        ll x,y,v;
        bool operator<(const Node& rhs){
            if(x!=rhs.x)return x<rhs.x;
            return y>rhs.y;
        }
    }node[maxn];
    void update(ll x,ll val)
    {
        while(x<=sz(v)){
            d[x]=max(d[x],val);
            x+=lowbit(x);
        }
    }
    ll query(int x)
    {
        ll ans=0;
        while(x){
            ans=max(ans,d[x]);
            x-=lowbit(x);
        }
        return ans;
    }
    inline int getid(int x){return lower_bound(all(v),x)-v.begin()+1;}
    //**********************************
    map<pll,ll>Mp;
    //**********************************
    int main()
    {
        fastio;
        cin>>n;
        map<pll,ll>::iterator it;
        rep(i,0,n){
            cin>>node[i].x>>node[i].y>>node[i].v,v.pb(node[i].y);
            pii PII=mp(node[i].x,node[i].y);
            it=Mp.find(PII);
            if(it!=Mp.end())node[i].v+=Mp[PII],Mp.erase(PII);
            Mp.insert(mp(PII,node[i].v));
        }
        sort(all(v));v.erase(unique(all(v)),v.end());
        rep(i,0,n)node[i].y=getid(node[i].y);
        ll tot=0;
        sort(node,node+n);
        ll ans=0;
        rep(i,0,n){
                ll tmp;
                tmp=query(node[i].y-1)+node[i].v;
                ans=max(ans,tmp);
                update(node[i].y,tmp);
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    序列化与反序列化
    进程与线程
    winform基础
    MD5加密
    Docker安装Nextcloud+collabora office+ocdownloader
    Docker安装MariaDB
    Docker 安装 Nginx
    Docker命令大全
    Docker之镜像操作
    Linux入门-Docker安装
  • 原文地址:https://www.cnblogs.com/klaycf/p/9585239.html
Copyright © 2011-2022 走看看