比赛 20251001国庆欢乐赛1 评测结果 AAAAAAAAAA
题目名称 国旗计划 最终得分 100
用户昵称 xuyuqing 运行时间 1.916 s
代码语言 C++ 内存使用 24.16 MiB
提交时间 2025-10-01 10:57:14
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

const int N = 1919810;
const int LOG = 22;

int n;
int m;
vector<pair<pair<int, int>, int>> nums (1);
int magic[N][LOG];
long long res[N];

int main () {
    
    freopen ("flagplan.in", "r", stdin);
    freopen ("flagplan.out", "w", stdout);
    
    cin >> n >> m;
    int l, r;
    for (int i = 1; i <= n; i++) {
        cin >> l >> r;
        if (l > r) {
            r += m;
        }
        nums.push_back(make_pair (make_pair (l, r), i));
    }
    sort (nums.begin() + 1, nums.end());
    pair<pair<int, int>, int> p;
    for (int i = 1; i <= n; i++) {
        p = nums[i];
        nums.push_back(make_pair (make_pair (p.first.first + m, p.first.second + m), p.second + n));
    }
    
    int j = 1;
    for (int i = 1; i <= 2 * n; i++) {
        while (j <= 2 * n && nums[j].first.first <= nums[i].first.second) {
            j++;
        }
        magic[i][0] = j - 1;
    }
    for (int i = 1; i < LOG; i++) {
        for (int j = 1; j <= 2 * n; j++) {
            magic[j][i] = magic[magic[j][i - 1]][i - 1];
        }
    }
    
    for (int i = 1; i <= n; i++) {
        int limit = nums[i].first.first + m;
        int cc = 0;
        int t = i;
        
        for (int j = LOG - 1; j >= 0; j--) {
            if (magic[t][j] && nums[magic[t][j]].first.second < limit) {
                cc += (1 << j);
                t = magic[t][j];
            }
        }
        
        res[nums[i].second] = cc + 2;
    }
    
    for (int i = 1; i <= n; i++) {
        cout << res[i] << ' ';
    }
    
    return 0;
}