求hack
查看原帖
求hack
593299
Qerucy楼主2024/3/6 17:20

rt,两年前写的,现在发现复杂度不对,求hack。

#include<cstdio>
#include<algorithm>

using namespace std;

//#define int long long
#define mod 998244353

struct node{
    int l,r,h;
    bool operator <(const node &A)const{
        return h<A.h;
    }
}a[1000010];

int n,m;
int x[1000010];
int f[1000010];
int ans;

int dfs(int x,int h){
    if(f[x]) return f[x];
    
    bool fg=0,fg1=0;
    
    for(int i=x;i>=1;i--){
        if(i>=x||a[i].h>=a[x].h) continue;
        
        if(!fg&&a[i].l<=a[x].l&&a[i].r>=a[x].l){
            f[x]+=dfs(i,a[i].h),fg=1;
        }
        
        f[x]%=mod;
        
        if(!fg1&&a[i].l<=a[x].r&&a[i].r>=a[x].r){
            f[x]+=dfs(i,a[i].h),fg1=1;
        }
        
        f[x]%=mod;
        if(fg&&fg1) break;
    }
    
    if(!fg) f[x]++;
    if(!fg1) f[x]++;
    
    return f[x];
}

signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].h);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&x[i]);
    }
    sort(a+1,a+1+m);
    //for(int i=m;i>=1;i--){
    //    if(!f[i]) dfs(i,a[i].h);
    //}
    for(int i=1;i<=n;i++){
        bool fg=0;
        for(int j=m;j>=1;j--){
            if(a[j].l<=x[i]&&a[j].r>=x[i]){
                ans+=dfs(j,a[j].h);
                fg=1;
                ans%=mod;
                break;
            }
        }
        if(!fg) ans++;
    }
    printf("%d",ans%mod);
    return 0;
}
2024/3/6 17:20
加载中...