样例输出 20 求助
  • 板块P4849 寻找宝藏
  • 楼主rzh123
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/4/28 09:33
  • 上次更新2023/10/23 17:23:11
查看原帖
样例输出 20 求助
237530
rzh123楼主2023/4/28 09:33
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <array>
#include <vector>
#define docmp(at) if(a.at!=b.at) return a.at<b.at;
using namespace std;
using ll=long long;
using pii=pair<ll,ll>;
using Info=pii;
constexpr int N=2e5+7,P{998244353};
int n,m;
inline void upd(auto &a,const pii &b){
    if(b.first>a.first) a=b;
    else if(b.first==a.first) a.second=(a.second+b.second)%P;
}
struct F{
    array<pii,N> s;
    static inline int l(int x){return x&-x;}
    inline void add(int x,const pii v){
        for(;x<=n;x+=l(x)){
            upd(s[x],v);
        }
    }
    inline pii query(int x){
        pii t{0,0};
        for(;x;x^=l(x)){
            upd(t,s[x]);
        }
        return t;
    }
    inline void erase(int x){
        for(;x<=n;x+=l(x)){
            s[x]=make_pair(0,0);
        }
    }
}tr;
struct Q{
    int a,b,c,d,i,v;
    bool lft;
};
array<struct Q,N> a;
array<pii,N> f;
inline void disc(){
    static int d[N];
    int dc{0};
    #define discat(at) dc=0;for(int i{1};i<=n;++i)d[++dc]=a[i].at;dc=unique(d+1,d+dc+1)-d-1;for(int i{1};i<=n;++i)a[i].at=lower_bound(d+1,d+dc+1,a[i].at)-d;
    discat(a);
    discat(b);
    discat(c);
    discat(d);
}
inline bool cmpa(const Q &a,const Q &b){
    docmp(a);docmp(b);docmp(c);docmp(d);return false;
}
inline bool cmpb(const Q &a,const Q &b){
    docmp(b);docmp(c);docmp(d);docmp(a);return false;
}
inline bool cmpc(const Q &a,const Q &b){
    docmp(c);docmp(d);docmp(a);docmp(b);return false;
}
inline bool cmpd(const Q &a,const Q &b){
    docmp(d);docmp(a);docmp(b);docmp(c);return false;
}
inline void solve1(int l,int r){
    static array<Q,N> tmp;
    if(l==r) return;
    int m{(l+r)>>1};
    memcpy(tmp.begin()+l,a.begin()+l,(r-l+1)*sizeof(Q));
    solve1(l,m);
    sort(a.begin()+l,a.begin()+m+1,cmpc),
    sort(a.begin()+m+1,a.begin()+r+1,cmpc);
    int pl{l},pr{m+1};
    for(pr=m+1;pr<=r;++pr){
        if(a[pr].lft) continue;
        while(pl<=m&&a[pl].b<=a[pr].b){
            if(a[pl].lft) tr.add(a[pl].d,f[a[pl].i]);
            ++pl;
        }
        auto rs=tr.query(a[pr].d);
        // printf("rs=%lld,%lld\n",rs.first,rs.second);
        rs.first+=1LL*a[pr].v;
        // printf("upd %d:%lld,%lld\n",a[pr].i,rs.first,rs.second);
        upd(f[a[pr].i],rs);
    }
    for(int i{l};i<pl;++i)
        if(a[i].lft) tr.erase(a[i].d);
    memcpy(a.begin()+l,tmp.begin()+l,(r-l+1)*sizeof(Q));
    solve1(m+1,r);
}
inline void solve2(int l,int r){
    static array<Q,N> tmp;
    if(l==r) return;
    int m{(l+r)>>1};
    memcpy(begin(tmp)+l,begin(a)+l,(r-l+1)*sizeof(Q));
    solve2(l,m);
    for(int i{l};i<=m;++i) a[i].lft=true;
    sort(begin(a)+l,begin(a)+r+1,cmpb);
    solve1(l,r);
    memcpy(begin(a)+l,begin(tmp)+l,(r-l+1)*sizeof(Q));
    solve2(m+1,r);
}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i{1};i<=n;++i){
        scanf("%d%d%d%d%d",&a[i].a,&a[i].b,&a[i].c,&a[i].d,&a[i].v);
    }
    disc();
    sort(begin(a)+1,begin(a)+n+1,cmpa);
    int nn{1};
    for(int i{2};i<=n;++i){
        if(a[i].a==a[nn].a&&a[i].b==a[nn].b&&a[i].c==a[nn].c&&a[i].d==a[nn].d){
            a[i-1].v+=a[i].v;
        }
        else{
            a[++nn]=a[i];
        }
    }n=nn;
    for(int i{1};i<=n;++i){
        a[i].i=i,a[i].lft=false;
        f[i]=make_pair(1ll*a[i].v,1ll);
    }
    solve2(1,n);
    Info ans{0,0};
    for(int i{1};i<=n;++i) upd(ans,f[i]);
    printf("%lld\n%lld\n",ans.first,ans.second);
    return 0;
}
2023/4/28 09:33
加载中...