zoukankan      html  css  js  c++  java
  • gym101201H

    https://vjudge.net/contest/179241#problem/H

    区间覆盖问题。

    给k个闭区间,问最大不重叠覆盖长度

    dp,离散化。

    #include <bits/stdc++.h>
    using namespace std;
    
    long long n,k;
    pair<long long,long long> p[200020];
    pair<long long,long long> newp[200020];
    long long dp[400020];
    long long b[400040];
    long long a[400040];
    int cnt;
    
    int cmp(pair<long long,long long> q,pair<long long,long long > w)
    {
        return q<w;
    }
    int cmp2(long long q,long long w)
    {
        return q<w;
    }
    
    int main()
    {
        cin>>n>>k;
        for (int i=1;i<=k;i++) 
        {
            cin>>p[i].first>>p[i].second;
            p[i].second++;
        }
        for (int i=1;i<=k;i++)
        {
            b[i*2-1]=p[i].first;
            b[i*2]=p[i].second;
        }
        sort(p+1,p+k+1,cmp);
        sort(b+1,b+k*2+1,cmp2);
        cnt=unique(b+1,b+k*2+1)-(b+1);
        for (int i=1;i<=k;i++)
        {
            newp[i].first=lower_bound(b+1,b+cnt+1,p[i].first)-b;
            newp[i].second=lower_bound(b+1,b+cnt+1,p[i].second)-b;
        }
        int j=1;
        for (int i=1;i<=400001;i++) 
        {
            while (newp[j].first==i && j<=k)
            {
                dp[newp[j].second]=max(dp[newp[j].second],dp[i]+p[j].second-p[j].first);
                j++;
            }
            dp[i+1]=max(dp[i+1],dp[i]);
        }
        long long ans=0;
        for (int i=1;i<=400001;i++) ans=max(ans,dp[i]);
        cout<<n-ans<<endl;
    }
  • 相关阅读:
    Linux dd命令
    冲突域
    三次握手与四次挥手
    sizeof +数组名
    程序内存分配
    OSI七层协议模型
    栈的存储结构
    周转时间
    Gson工具类
    spring注入注解
  • 原文地址:https://www.cnblogs.com/poler/p/7367539.html
Copyright © 2011-2022 走看看