比赛 20251001国庆欢乐赛1 评测结果 AAAATTTTTT
题目名称 国旗计划 最终得分 40
用户昵称 淮淮清子 运行时间 12.027 s
代码语言 C++ 内存使用 6.84 MiB
提交时间 2025-10-01 11:32:40
显示代码纯文本
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct S{
    int l, r, id;
};
int n, m;
vector<S> s;
bool cmp(S a, S b){
    return a.l < b.l;
} 

int main(){
    freopen("flagplan.in", "r", stdin);
    freopen("flagplan.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for(int i = 0;i < n;i ++){
        int c, d; cin >> c >> d;
        if(c <= d){
            s.push_back({c, d, i});
            s.push_back({c + m, d + m, i});
        }
        else{
            s.push_back({c, d + m, i});
            s.push_back({c + m, d + 2 * m, i});
        }
    }
    sort(s.begin(), s.end(), cmp);
    vector<int> ans(n, 1e9);
    for(int i = 0;i < s.size();i ++){
        int st = s[i].l, tg = st + m;
        int cov = s[i].r, cnt = 1;
        if(cov >= tg){
            ans[s[i].id] = min(ans[s[i].id], cnt);
            continue;
        }
        int cur = i;
        while(cov < tg){
            int b = -1, mr = cov;
            for(int j = cur + 1;j < s.size() && s[j].l <= cov;j ++){
                if(s[j].r > mr){
                    mr = s[j].r, b = j;
                }
            }
            if(b == -1) break;
            cur = b, cov = mr, cnt ++;
            if(cov >= tg){
                ans[s[i].id] = min(ans[s[i].id], cnt);
                break;
            }
        }
    }
    for(int i = 0;i < n;i ++){
        cout << ans[i] << (i == n - 1 ? '\n' : ' ');
    }
    return 0;
}