QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#822906 | #9907. 最大匹配 2 | lfxxx | 0 | 47ms | 30144kb | C++14 | 5.2kb | 2024-12-20 17:22:00 | 2024-12-20 17:22:00 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
bool be;
constexpr int N = 2e5 + 5, M = N * 100, inf = 1e9;
int n, m, a[N], b[N];
struct seg {
int a[N], b[N], rt[N], ls[M], rs[M], mn[M], tag[M], tot, res;
seg() {mn[0] = inf;}
void init()
{
for (int i = 1; i <= n; ++i) a[i] = ::a[i], b[i] = ::b[i];
}
void push_up(int k)
{
mn[k] = min(mn[ls[k]], mn[rs[k]]);
}
void push(int k, int v)
{
mn[k] += v, tag[k] += v;
}
void push_down(int k)
{
if (tag[k]) {
if (!ls[k]) ls[k] = ++tot;
if (!rs[k]) rs[k] = ++tot;
push(ls[k], tag[k]);
push(rs[k], tag[k]);
tag[k] = 0;
}
}
void add(int L, int R, int v, int &k, int l = 1, int r = n)
{
if (!k) k = ++tot;
if (L <= l && r <= R) {
push(k, v);
return;
}
push_down(k);
int mid = l + r >> 1;
if (L <= mid) add(L, R, v, ls[k], l, mid);
if (R > mid) add(L, R, v, rs[k], mid + 1, r);
push_up(k);
}
int query(int L, int R, int k, int l = 1, int r = n)
{
if (!k) return 0;
if (L <= l && r <= R) return mn[k];
push_down(k);
int mid = l + r >> 1, ans = inf;
if (L <= mid) ans = min(ans, query(L, R, ls[k], l, mid));
if (R > mid) ans = min(ans, query(L, R, rs[k], mid + 1, r));
return ans;
}
pii find(int p, int v, int k, int l = 1, int r = n)
{
if (!k) {
if (0 < v) return pii(l, 0);
else return pii(-1, -1);
}
if (mn[k] >= v) return pii(-1, -1);
if (l == r) return pii(l, mn[k]);
push_down(k);
int mid = l + r >> 1;
if (mid >= p) {
auto [pos, val] = find(p, v, ls[k], l, mid);
if (pos != -1) return pii(pos, val);
}
return find(p, v, rs[k], mid + 1, r);
}
int ins_(int x, int v, int c)
{
// cerr << x << ' ' << v << ' ' << c << '\n';
add(x, n, v, rt[c]);
int pre = x > 1 ? query(1, x - 1, rt[c]) : 0;
auto [pos, val] = find(x, pre, rt[c]);
// cerr << "?" << pre << ' ' << pos << ' ' << val << '\n';
if (pos != -1 && val == pre - 1) {
--res;
return pos;
}
return 0;
}
int del_(int x, int v, int c)
{
int pre = x > 1 ? query(1, x - 1, rt[c]) : 0;
auto [pos, val] = find(x, pre, rt[c]);
add(x, n, -v, rt[c]);
if (pos != -1 && val == pre - 1) {
++res;
return pos;
}
return 0;
}
int ins(int x, int v, int c)
{
// if (c == 0) cerr << "ins:" << x << ' ' << v << ' ' << c << '\n';
// cerr << x << ' ' << v << ' ' << c << '\n';
if (v == -1) {
++res;
return -ins_(x, -1, c);
}
else return del_(x, -1, c);
}
int del(int x, int v, int c)
{
// if (c == 0) cerr << "del:" << x << ' ' << v << ' ' << c << '\n';
if (v == -1) {
--res;
return del_(x, -1, c);
}
else return -ins_(x, -1, c);
}
}z, f, al;
bool en;
int main()
{
#ifdef IAKIOI
cerr << (&be - &en) / 1024.0 / 1024 << " MB\n----------------------------" << endl;
freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) {
cin >> b[i];
if (!b[i]) b[i] = 1;
else b[i] = -1;
}
z.init();
reverse(a + 1, a + 1 + n), reverse(b + 1, b + 1 + n);
for (int i = 1; i <= n; ++i) b[i] = -b[i];
f.init();
reverse(a + 1, a + 1 + n), reverse(b + 1, b + 1 + n);
for (int i = 1; i <= n; ++i) b[i] = -b[i];
// for (int i = 1; i <= n; ++i) cerr << f.a[i] << ' ' << f.b[i] << '\n';
for (int i = 1; i <= n; ++i) {
int pos = z.ins(i, z.b[i], z.a[i]);
if (pos > 0) {
al.del(pos, z.b[pos], 0);
} else if (pos < 0) {
al.ins(-pos, z.b[-pos], 0);
}
// cerr << i << ' ' << z.b[i] << ' ' << z.a[i] << ' ' << f.res << '\n';
pos = f.ins(i, f.b[i], f.a[i]);
// // cerr << i << ' ' << pos << '\n';
if (pos > 0) {
al.del(n - pos + 1, -f.b[pos], 0);
} else if (pos < 0) {
al.ins(n - (-pos) + 1, -f.b[-pos], 0);
}
// if (i == 4) return 0;
}
// cerr << z.res << ' ' << f.res << '\n';
assert(z.res == f.res);
cout << z.res + al.res << '\n';
// cout << z.ans << ' ' << f.ans << '\n';
// cout << ans << '\n';
// while (m--) {
// int x, p, q;
// cin >> x >> p >> q;
// if (!q) q = 1;
// else q = -1;
// int pos = z.del(x, z.b[x], z.a[x]);
// if (pos > 0) {
// al.del(pos, z.b[pos], 0);
// } else if (pos < 0) {
// al.ins(-pos, z.b[-pos], 0);
// }
// pos = f.del(n - x + 1, f.b[n - x + 1], f.a[n - x + 1]);
// if (pos > 0) {
// al.del(n - pos + 1, -f.b[pos], 0);
// } else if (pos < 0) {
// al.ins(n - (-pos) + 1, -f.b[-pos], 0);
// }
// z.a[x] = p, f.a[n - x + 1] = p;
// z.b[x] = q, f.b[n - x + 1] = -q;
// pos = z.ins(x, z.b[x], z.a[x]);
// if (pos > 0) {
// al.del(pos, z.b[pos], 0);
// } else if (pos < 0) {
// al.ins(-pos, z.b[-pos], 0);
// }
// pos = f.ins(n - x + 1, f.b[n - x + 1], f.a[n - x + 1]);
// if (pos > 0) {
// al.del(n - pos + 1, -f.b[pos], 0);
// } else if (pos < 0) {
// al.ins(n - (-pos) + 1, -f.b[-pos], 0);
// }
// assert(z.res == f.res);
// cout << z.res + al.res << '\n';
// }
return 0;
}
详细
Subtask #1:
score: 0
Runtime Error
Test #1:
score: 0
Runtime Error
input:
100 0 1 1 2 1 2 2 2 2 2 1 2 1 1 2 2 1 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 1 2 1 2 1 1 1 2 2 2 2 2 2 1 1 1 2 1 1 1 1 1 2 2 1 1 2 1 1 2 1 1 2 2 2 1 2 2 2 1 2 1 2 1 2 1 1 2 1 1 2 1 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 1 1 1 ...
output:
result:
Subtask #2:
score: 0
Runtime Error
Test #11:
score: 0
Runtime Error
input:
2000 0 2 2 1 1 2 1 2 2 2 1 1 1 2 1 2 2 1 2 2 1 2 1 2 1 1 2 1 2 2 1 2 2 2 1 1 1 1 1 1 2 1 1 2 2 1 2 1 2 2 2 1 1 2 1 1 1 2 2 2 2 2 2 1 1 2 1 1 2 2 1 2 1 1 1 1 2 1 1 1 1 1 2 2 2 2 1 2 2 1 2 2 2 2 2 1 2 1 2 1 1 2 1 1 2 2 1 1 1 1 1 1 1 1 2 2 1 2 2 2 2 2 1 1 2 2 2 2 1 2 2 2 1 1 1 2 1 2 1 1 1 2 2 1 2 1 1 1...
output:
result:
Subtask #3:
score: 0
Runtime Error
Test #31:
score: 0
Runtime Error
input:
200000 0 1 2 2 2 2 2 2 1 1 2 2 1 1 1 2 1 1 1 2 1 2 1 1 1 2 1 1 1 1 2 2 2 2 2 1 2 2 1 2 1 1 2 2 2 2 1 2 2 1 2 1 1 2 1 1 2 1 2 2 1 2 2 2 1 1 2 1 1 1 2 2 2 2 1 1 2 2 1 1 2 1 2 2 2 2 2 1 1 2 2 2 2 1 2 1 2 2 2 1 2 2 2 2 1 2 2 2 1 1 1 2 2 1 2 2 2 1 1 1 1 1 2 1 2 1 2 1 2 1 2 1 2 2 1 2 2 2 1 1 1 2 1 2 1 1 1...
output:
result:
Subtask #4:
score: 0
Runtime Error
Test #61:
score: 0
Runtime Error
input:
200000 200000 1 2 1 2 2 1 2 1 2 1 1 2 1 1 2 1 1 2 1 2 2 1 2 2 2 1 2 2 2 2 2 1 2 1 2 1 1 2 1 1 2 2 2 1 1 2 2 1 2 1 2 1 1 2 1 2 2 2 1 2 1 2 1 1 1 1 2 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 2 2 1 2 2 2 2 2 1 1 1 2 2 2 1 1 1 1 1 1 1 2 2 1 2 2 1 1 1 1 1 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 1 1 1 2 2 1 2 2 2 1 1 1 2 ...
output:
result:
Subtask #5:
score: 0
Wrong Answer
Test #71:
score: 0
Wrong Answer
time: 47ms
memory: 30144kb
input:
100000 100000 2 1 1 1 1 1 1 2 2 2 2 1 2 1 1 1 2 2 1 2 1 2 2 2 2 2 2 2 1 2 2 2 1 1 1 1 1 2 2 2 2 1 1 2 2 2 1 2 2 1 2 1 2 2 2 2 1 2 1 1 1 2 2 2 1 1 2 1 1 1 2 1 2 2 2 1 1 2 1 1 2 1 1 1 1 1 1 1 2 2 1 1 2 1 2 1 2 1 2 2 2 2 2 2 2 1 1 1 1 2 1 2 1 1 1 1 2 2 2 1 2 1 1 1 2 2 2 1 1 2 1 2 2 2 2 2 1 1 2 1 1 1 1 ...
output:
49859
result:
wrong answer 1st words differ - expected: '49860', found: '49859'
Subtask #6:
score: 0
Runtime Error
Test #101:
score: 0
Runtime Error
input:
200000 200000 1 2 1 1 2 1 1 1 2 1 2 2 2 1 2 1 1 2 2 2 1 2 2 2 2 1 2 1 1 1 1 2 1 2 2 1 2 2 2 2 1 1 1 2 1 1 1 2 2 1 1 1 2 1 1 2 1 1 2 2 1 1 2 2 2 1 1 1 1 1 1 2 1 1 2 1 2 2 1 2 2 2 1 2 2 1 2 2 1 1 1 1 1 2 2 2 1 1 2 2 1 1 1 2 2 1 1 2 2 2 2 2 2 1 2 1 1 2 2 2 1 1 1 2 1 2 1 1 1 1 1 2 1 1 2 2 1 1 2 2 1 2 1 ...