比赛 20251001国庆欢乐赛1 评测结果 ATTTTEEEEE
题目名称 国旗计划 最终得分 10
用户昵称 LikableP 运行时间 9.063 s
代码语言 C++ 内存使用 6.25 MiB
提交时间 2025-10-01 11:47:27
显示代码纯文本
#include <iostream>
#define tr(x) x * 2 - 1
using namespace std;

const int MAXN = 2e5 + 10;

int n, m;

struct SegmentTree {
  struct NODE {
    int minn;
    int lazy;
  } node[MAXN << 3];
  #define ls(root) root << 1
  #define rs(root) root << 1 | 1
  void PushUp(int root) {
    node[root].minn = min(node[ls(root)].minn, node[rs(root)].minn);
  }
  void PushDown(int root) {
    if (node[root].lazy) {
      node[ls(root)].minn += node[root].lazy;
      node[ls(root)].lazy += node[root].lazy;
      node[rs(root)].minn += node[root].lazy;
      node[rs(root)].lazy += node[root].lazy;
      node[root].lazy = 0;
    }
  }
  void AddSeq(int root, int lt, int rt, int lq, int rq, int val) {
    if (lt == lq && rt == rq) {
      node[root].minn += val;
      node[root].lazy += val;
      return ;
    }
    PushDown(root);
    int mid = lt + ((rt - lt) >> 1);
    if (rq <= mid) {
      AddSeq(ls(root), lt, mid, lq, rq, val);
    } else if (lq > mid) {
      AddSeq(rs(root), mid + 1, rt, lq, rq, val);
    } else {
      AddSeq(ls(root), lt, mid, lq, mid, val);
      AddSeq(rs(root), mid + 1, rt, mid + 1, rq, val);
    }
    PushUp(root);
  }
  int GetMin(int root, int lt, int rt, int lq, int rq) {
    if (lt == lq && rt == rq) {
      return node[root].minn;
    }
    PushDown(root);
    int mid = lt + ((rt - lt) >> 1);
    if (rq <= mid) {
      return GetMin(ls(root), lt, mid, lq, rq);
    } else if (lq > mid) {
      return GetMin(rs(root), mid + 1, rt, lq, rq);
    } else {
      return min(GetMin(ls(root), lt, mid, lq, mid), GetMin(rs(root), mid + 1, rt, mid + 1, rq));
    }
  }
  void Print(int root, int lt, int rt) {
    if (lt == rt) {
      cout << node[root].minn << " ";
      return ;
    }
    PushDown(root);
    int mid = lt + ((rt - lt) >> 1);
    Print(ls(root), lt, mid);
    Print(rs(root), mid + 1, rt);
  }
  void Print() {
    Print(1, 1, tr(m));
    cout << endl;
  }
} T;

struct PEOPLE {
  int cnt;
  int l1, r1;
  int l2, r2;
} a[MAXN];

void add(int i, int val) {
  if (a[i].cnt == 1) {
    T.AddSeq(1, 1, tr(m), a[i].l1, a[i].r1, val);
  } else {
    T.AddSeq(1, 1, tr(m), a[i].l1, a[i].r1, val);
    T.AddSeq(1, 1, tr(m), a[i].l2, a[i].r2, val);
  }
}

bool check() {
  return T.GetMin(1, 1, tr(m), 1, tr(m)) > 0;
}

int SUDO;
int k;
int vis[MAXN];
void dfs(int step) {
  if (step > k) {
    if (check()) SUDO = 1;
    return;
  }
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      vis[i] = 1;
      add(i, 1);
      dfs(step + 1);
      vis[i] = 0;
      add(i, -1);
      if (SUDO) return;
    }
  }
}

int main() {
  freopen("flagplan.in", "r", stdin);
  freopen("flagplan.out", "w", stdout);
  cin.tie(0)->sync_with_stdio(false), cout.tie(0);
  cin >> n >> m;
  for (int i = 1, c, d; i <= n; ++i) {
    cin >> c >> d;
    if (c < d) {
      a[i] = {1, tr(c), tr(d)};
    } else {
      a[i] = {2, 1, tr(d), tr(c), tr(m)};
    }
  }
  
  for (int i = 1; i <= n; ++i) {
    SUDO = 0;
    vis[i] = 1;
    add(i, 1);
    for (k = 1; k <= n; ++k) {
      dfs(2);
      if (SUDO) {
        cout << k << " ";
        break;
      }
    }
    add(i, -1);
    vis[i] = 0;
  }
  return 0;
}