Minimizing maximizer

Minimizing maximizer

https://ac.nowcoder.com/acm/problem/106366

做法:线段树优化dp

思路:

dp[i]表示覆盖[1,i]需要的最少区间数。然后用线段树更新取最小值。
dp[t]=min(dp[t],min(dp[s]~dp[t])+1)

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=5e4+10,INF=0x3f3f3f3f;

int n,m;
int dp[N<<2];

int query(int u,int l,int r,int x,int y){
    if(l>=x&&r<=y) return dp[u];
    int mid=(l+r)>>1,sum=INF;
    if(x<=mid) sum=query(u<<1,l,mid,x,y);
    if(y>=mid+1) sum=min(sum,query(u<<1|1,mid+1,r,x,y));
    return sum;
}

void modify(int u,int l,int r,int x,int y){
    if(l==r) dp[u]=min(dp[u],y);
    else{
        int mid=(l+r)>>1;
        if(x<=mid) modify(u<<1,l,mid,x,y); 
        else if(x>=mid+1) modify(u<<1|1,mid+1,r,x,y);

        dp[u]=min(dp[u<<1],dp[u<<1|1]);
    }
}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    memset(dp,INF,sizeof dp);
    cin>>n>>m;
    modify(1,1,n,1,0);
    for(int i=0;i<m;i++){
        int s,t;cin>>s>>t;
        int temp=query(1,1,n,s,t)+1;
        modify(1,1,n,t,temp);
    }
    cout<<query(1,1,n,n,n)<<"\n";
    return 0;
}
牛客每日一题 文章被收录于专栏

全部评论

相关推荐

真的很糟糕:哇偶,核动力驴吗
点赞 评论 收藏
分享
Lorn的意义:1.你这根本就不会写简历呀,了解太少了 2.你这些项目经历感觉真的没啥亮点啊,描述的不行,重写书写一下让人看到核心,就继续海投 注意七八月份ofer还是比较多的,越往后机会越少,抓住时机,抓紧检查疏漏,加油查看图片
点赞 评论 收藏
分享
写不来代码的小黑:这么小的城市能有做it的公司也不容易
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务