QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#822906#9907. 最大匹配 2 lfxxx0 47ms30144kbC++145.2kb2024-12-20 17:22:002024-12-20 17:22:00

Judging History

你现在查看的是最新测评结果

  • [2024-12-20 17:22:00]
  • 评测
  • 测评结果:0
  • 用时:47ms
  • 内存:30144kb
  • [2024-12-20 17:22:00]
  • 提交

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

Details

Tip: Click on the bar to expand more detailed information

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 ...

output:


result: