bzoj2298 [HAOI2011]problem a

题目描述

题解

考虑到每个人说的话可以锁定一个区间内的成绩是相同的。所以问题就转化成了给定一些有权值的区间,要求选出若干无交集区间使其权值和最大, $\text{dp}$ 即可。

代码

#include <bits/stdc++.h>
using namespace std;
int n,m,f[100005];
struct O{int l,r;}g[100005];
bool cmp(O A,O B){
    return A.r==B.r?A.l<B.l:A.r<B.r;
}
int main(){
    cin>>n;
    for (int i=1,l,r;i<=n;i++){
        scanf("%d%d",&l,&r);
        l++;r=n-r;if (l>r) continue;
        g[++m]=(O){l,r};
    }
    sort(g+1,g+m+1,cmp);
    for (int i=1,j=0,l,r,k=0;i<=m;i=j+1){
        l=g[i].l;r=g[i].r;
        while(k<r) f[k+1]=f[k],k++;
        while(j<m && g[j+1].l==l && g[j+1].r==r) j++;
        f[r]=max(f[r],f[l-1]+min(r-l,j-i)+1);
    }
    cout<<n-f[n]<<endl;return 0;
}

 

posted @ 2020-02-23 22:59  xjqxjq  阅读(116)  评论(0编辑  收藏  举报