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)逐个查询的,大的区间就爆了
我想问一下是我树状数组写的不对还是它本身就这样会被卡