进食后人//或是我太若?
查看原帖
进食后人//或是我太若?
920358
kmguochang楼主2024/11/22 11:17

dp做法,树状数组优化,被神数据hack了

#include<bits/stdc++.h>
#define lowb(x) x&(-x)
using namespace std;
const int N=1e6+666;
int n,T,dp[N],rev[N];
struct node{
    int l,r;
}a[N];
bool cmp(node x,node y){
    if(x.l==y.l)
        return x.r<y.r;
    return x.l<y.l;
}
void add(int x,int y){
    while(x<=T){
        dp[x]=min(dp[x],y);
        x+=lowb(x);
    }
    return;
}
int ask(int x,int y){
    int ans=0x7f7f7f7f;
    if(!x)
        x++;
    while(y>=x){
        while(y-lowb(y)>=x){
            ans=min(ans,dp[y]);
            y-=lowb(y);
        }
        if(y<x)
            break;
        ans=min(ans,rev[y]);
        y--;//是不是这的逐个比较寄了
    }
    return ans;
}
int main(){
    //freopen("2.out","r",stdin);
    //freopen("3.out","w",stdout);
    int x,ans=INT_MAX;
    memset(dp,0x7f7f7f,sizeof(dp));
    memset(rev,0x7f7f7f,sizeof(rev));
    scanf("%d%d",&n,&T);
    for(int i=1;i<=n;++i){
        scanf("%d%d",&a[i].l,&a[i].r);
        a[i].r=min(a[i].r,T);
        if(a[i].l<=1)
            rev[a[i].r]=1,add(a[i].r,rev[a[i].r]);
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;++i){
        //printf("%d %d %d\n",i,a[i].l,a[i].r);
        rev[a[i].r]=min(rev[a[i].r],ask(a[i].l-1,a[i].r)+1);
        add(a[i].r,rev[a[i].r]);
        if(a[i].r>=T)
            ans=min(ans,rev[a[i].r]);
    }
    if(ans>n)
        printf("-1");
    else
        printf("%d",ans);
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

我想了一下感觉是树状数组查询时有一段是O(n)逐个查询的,大的区间就爆了

我想问一下是我树状数组写的不对还是它本身就这样会被卡

2024/11/22 11:17
加载中...