比赛 |
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;
}