[HAOI2011]problem a

题意

Here

思考

感觉这题思路挺不错的

考虑单独的一个人的 \(a_i,b_i\),那么就是有 \(n - a_i - b_i\) 个人分数相同,而这个分数相同的区间是 \([a_i+1,n-b_i]\),要满足合理性,我们应该选出若干个不相交的区间,使得权值最大(这个权值也就是区间范围相同的人数),这个问题就很好解决了。(代码中 \(f[i]\) 表示前 \(i\) 个人最多的说真话人数)

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, a[N], b[N], f[N];
vector<int> sum[N];
map<pair<int, int>, int> mp;
int main(){
    cin >> n;
    for(int i=1; i<=n; i++){
        cin >> a[i] >> b[i];
        int l = a[i] + 1, r = n - b[i]; if(l > r) continue;
        if(++ mp[ make_pair(l, r) ] == 1) sum[r].push_back(l);
    }
    for(int i=1; i<=n; i++){
        f[i] = f[i - 1];
        for(int j=0; j<sum[i].size(); j++){
            int l = sum[i][j];
            f[i] = max(f[i], f[l - 1] + min(mp[make_pair(l, i)], i - l + 1) );
        }
    }
    cout << n - f[n];
    return 0;
}

总结

注意对于问题的转换

posted @ 2018-12-07 21:11  alecli  阅读(97)  评论(0编辑  收藏  举报