답안 #616523

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
616523 2022-08-01T05:15:37 Z cheissmart Fish 2 (JOI22_fish2) C++14
60 / 100
4000 ms 54480 KB
// 花啊啊啊啊啊啊啊啊啊啊啊啊
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define IO_OP std::ios::sync_with_stdio(0); std::cin.tie(0);
#define F first
#define S second
#define V vector
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define SZ(v) int((v).size())
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef V<int> vi;

const int INF = 1e9 + 7, N = 1e5 + 7;
const ll oo = 1e18;

ll a[N];
int n;

namespace cover {
	int t[N * 4];
	char tag[N * 4];
	int sum(int v, int len) {
		return tag[v] ? len : t[v];
	}
	void _add(int l, int r, int x, int v = 1, int tl = 1, int tr = n + 1) {
		if(l <= tl && tr <= r) {
			tag[v] += x;
			return;
		}
		int tm = (tl + tr) / 2;
		if(l < tm) _add(l, r, x, v * 2, tl, tm);
		if(r > tm) _add(l, r, x, v * 2 + 1, tm, tr);
		t[v] = sum(v * 2, tm - tl) + sum(v * 2 + 1, tr - tm);
	}
	void add(int l, int r, int x) {
		if(l == 1 && r == n + 1) return;
		_add(l, r, x);
	}
	int qry(int l, int r, int v = 1, int tl = 1, int tr = n + 1) {
		if(l <= tl && tr <= r)
			return sum(v, tr - tl);
		int tm = (tl + tr) / 2, res = 0;
		if(l < tm) res += qry(l, r, v * 2, tl, tm);
		if(r > tm) res += qry(l, r, v * 2 + 1, tm, tr);
		return res;
	}
}

namespace seg {
	struct node {
		V<pair<int, ll>> bad_pref, bad_suff;
		V<pi> bad_seg;
		ll sum;
	} t[N * 4];
	void pull(int v, int posl = INF, int posr = 0) {
		t[v].bad_pref = t[v * 2].bad_pref;
		t[v].bad_suff = t[v * 2 + 1].bad_suff;

		for(auto[pos, sum]:t[v * 2 + 1].bad_pref) if(sum + t[v * 2].sum < a[pos + 1])
			t[v].bad_pref.EB(pos, sum + t[v * 2].sum);
		for(auto[pos, sum]:t[v * 2].bad_suff) if(sum + t[v * 2 + 1].sum < a[pos - 1])
			t[v].bad_suff.EB(pos, sum + t[v * 2 + 1].sum);

		int szi = SZ(t[v * 2].bad_suff);
		int szj = SZ(t[v * 2 + 1].bad_pref);
		int i = 0, j = 0;
		while(i < szi && t[v * 2].bad_suff[i].F > posl)
			i++;
		while(j < szj && t[v * 2 + 1].bad_pref[j].F < posr)
			j++;
		while(i < szi && j < szj) {
			auto& he = t[v * 2].bad_suff[i], be = t[v * 2 + 1].bad_pref[j];
			if(he.S + be.S < min(a[he.F - 1], a[be.F + 1])) {
				t[v].bad_seg.EB(he.F, be.F);
				cover::add(he.F, be.F + 1, 1);
			}
			if(a[he.F - 1] < a[be.F + 1])
				i++;
			else
				j++;
		}
		t[v].sum = t[v * 2].sum + t[v * 2 + 1].sum;
	}
	void build(int v = 1, int tl = 1, int tr = n + 1) {
		if(tr - tl == 1) {
			t[v].sum = a[tl];
			if(a[tl] < a[tl + 1])
				t[v].bad_pref.EB(tl, a[tl]);
			if(a[tl] < a[tl - 1])
				t[v].bad_suff.EB(tl, a[tl]);
			if(a[tl] < a[tl + 1] && a[tl] < a[tl - 1]) {
				t[v].bad_seg.EB(tl, tl);
				cover::add(tl, tl + 1, 1);
			}
		} else {
			int tm = (tl + tr) / 2;
			build(v * 2, tl, tm);
			build(v * 2 + 1, tm, tr);
			pull(v);
		}
	}
	void upd(int pos, int v = 1, int tl = 1, int tr = n + 1) {
		V<pi> tt;
		for(auto[l, r]:t[v].bad_seg) {
			if(r < pos - 1 || l > pos + 1) {
				tt.EB(l, r);
				continue;
			}
			cover::add(l, r + 1, -1);
		}
		t[v].bad_seg = tt, t[v].bad_pref.clear(), t[v].bad_suff.clear();

		if(tr - tl == 1) {
			t[v].sum = a[tl];
			if(a[tl] < a[tl + 1])
				t[v].bad_pref.EB(tl, a[tl]);
			if(a[tl] < a[tl - 1])
				t[v].bad_suff.EB(tl, a[tl]);
			if(a[tl] < a[tl + 1] && a[tl] < a[tl - 1]) {
				t[v].bad_seg.EB(tl, tl);
				cover::add(tl, tl + 1, 1);
			}
		} else {
			int tm = (tl + tr) / 2;
			if(pos - 1 < tm)
				upd(pos, v * 2, tl, tm);
			if(pos + 1 >= tm)
				upd(pos, v * 2 + 1, tm, tr);
			pull(v, pos + 1, pos - 1);
		}
	}
}

void upd(int pos, ll val) {
	a[pos] = val;
	seg::upd(pos);
}

signed main()
{
	IO_OP;

	cin >> n;
	a[0] = a[n + 1] = oo;
	for(int i = 1; i <= n; i++)
		cin >> a[i];

	seg::build();

	int q;
	cin >> q;
	while(q--) {
		int op;
		cin >> op;
		if(op == 1) {
			int x, y;
			cin >> x >> y;
			upd(x, y);
		} else {
			int l, r;
			cin >> l >> r;
			ll tl = a[l - 1], tr = a[r + 1];

			if(l - 1 >= 1) upd(l - 1, 1e15);
			if(r + 1 <= n) upd(r + 1, 1e15);
			if(l != 1 || r != n)
				cover::add(l, r + 1, -1);

			cout << r - l + 1 - cover::qry(l, r + 1) << '\n';

			if(l != 1 || r != n)
				cover::add(l, r + 1, 1);

			if(l - 1 >= 1) upd(l - 1, tl);
			if(r + 1 <= n) upd(r + 1, tr);
		}
	}

}

Compilation message

fish2.cpp: In function 'void seg::pull(int, int, int)':
fish2.cpp:66:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   66 |   for(auto[pos, sum]:t[v * 2 + 1].bad_pref) if(sum + t[v * 2].sum < a[pos + 1])
      |           ^
fish2.cpp:68:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   68 |   for(auto[pos, sum]:t[v * 2].bad_suff) if(sum + t[v * 2 + 1].sum < a[pos - 1])
      |           ^
fish2.cpp: In function 'void seg::upd(int, int, int, int)':
fish2.cpp:111:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  111 |   for(auto[l, r]:t[v].bad_seg) {
      |           ^
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 31572 KB Output is correct
2 Correct 16 ms 31572 KB Output is correct
3 Correct 16 ms 31572 KB Output is correct
4 Correct 18 ms 31576 KB Output is correct
5 Correct 20 ms 31756 KB Output is correct
6 Correct 24 ms 31732 KB Output is correct
7 Correct 19 ms 31700 KB Output is correct
8 Correct 28 ms 31700 KB Output is correct
9 Correct 23 ms 31732 KB Output is correct
10 Correct 17 ms 31748 KB Output is correct
11 Correct 19 ms 31724 KB Output is correct
12 Correct 19 ms 31700 KB Output is correct
13 Correct 26 ms 31700 KB Output is correct
14 Correct 19 ms 31704 KB Output is correct
15 Correct 21 ms 31700 KB Output is correct
16 Correct 21 ms 31728 KB Output is correct
17 Correct 22 ms 31712 KB Output is correct
18 Correct 21 ms 31720 KB Output is correct
19 Correct 19 ms 31656 KB Output is correct
20 Correct 21 ms 31656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 31572 KB Output is correct
2 Correct 74 ms 47536 KB Output is correct
3 Correct 71 ms 46284 KB Output is correct
4 Correct 69 ms 47540 KB Output is correct
5 Correct 66 ms 46376 KB Output is correct
6 Correct 54 ms 41608 KB Output is correct
7 Correct 52 ms 40460 KB Output is correct
8 Correct 53 ms 41592 KB Output is correct
9 Correct 58 ms 40396 KB Output is correct
10 Correct 65 ms 47172 KB Output is correct
11 Correct 56 ms 43500 KB Output is correct
12 Correct 50 ms 41048 KB Output is correct
13 Correct 50 ms 41080 KB Output is correct
14 Correct 61 ms 43776 KB Output is correct
15 Correct 62 ms 43560 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 31572 KB Output is correct
2 Correct 16 ms 31572 KB Output is correct
3 Correct 16 ms 31572 KB Output is correct
4 Correct 18 ms 31576 KB Output is correct
5 Correct 20 ms 31756 KB Output is correct
6 Correct 24 ms 31732 KB Output is correct
7 Correct 19 ms 31700 KB Output is correct
8 Correct 28 ms 31700 KB Output is correct
9 Correct 23 ms 31732 KB Output is correct
10 Correct 17 ms 31748 KB Output is correct
11 Correct 19 ms 31724 KB Output is correct
12 Correct 19 ms 31700 KB Output is correct
13 Correct 26 ms 31700 KB Output is correct
14 Correct 19 ms 31704 KB Output is correct
15 Correct 21 ms 31700 KB Output is correct
16 Correct 21 ms 31728 KB Output is correct
17 Correct 22 ms 31712 KB Output is correct
18 Correct 21 ms 31720 KB Output is correct
19 Correct 19 ms 31656 KB Output is correct
20 Correct 21 ms 31656 KB Output is correct
21 Correct 17 ms 31572 KB Output is correct
22 Correct 74 ms 47536 KB Output is correct
23 Correct 71 ms 46284 KB Output is correct
24 Correct 69 ms 47540 KB Output is correct
25 Correct 66 ms 46376 KB Output is correct
26 Correct 54 ms 41608 KB Output is correct
27 Correct 52 ms 40460 KB Output is correct
28 Correct 53 ms 41592 KB Output is correct
29 Correct 58 ms 40396 KB Output is correct
30 Correct 65 ms 47172 KB Output is correct
31 Correct 56 ms 43500 KB Output is correct
32 Correct 50 ms 41048 KB Output is correct
33 Correct 50 ms 41080 KB Output is correct
34 Correct 61 ms 43776 KB Output is correct
35 Correct 62 ms 43560 KB Output is correct
36 Correct 99 ms 48412 KB Output is correct
37 Correct 148 ms 46760 KB Output is correct
38 Correct 126 ms 46584 KB Output is correct
39 Correct 91 ms 48112 KB Output is correct
40 Correct 119 ms 46500 KB Output is correct
41 Correct 72 ms 42148 KB Output is correct
42 Correct 71 ms 42248 KB Output is correct
43 Correct 80 ms 40984 KB Output is correct
44 Correct 81 ms 41060 KB Output is correct
45 Correct 124 ms 47652 KB Output is correct
46 Correct 94 ms 47836 KB Output is correct
47 Correct 92 ms 42584 KB Output is correct
48 Correct 59 ms 41288 KB Output is correct
49 Correct 72 ms 41524 KB Output is correct
50 Correct 79 ms 44060 KB Output is correct
51 Correct 114 ms 43928 KB Output is correct
52 Correct 89 ms 44128 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 31572 KB Output is correct
2 Correct 74 ms 47536 KB Output is correct
3 Correct 71 ms 46284 KB Output is correct
4 Correct 69 ms 47540 KB Output is correct
5 Correct 66 ms 46376 KB Output is correct
6 Correct 54 ms 41608 KB Output is correct
7 Correct 52 ms 40460 KB Output is correct
8 Correct 53 ms 41592 KB Output is correct
9 Correct 58 ms 40396 KB Output is correct
10 Correct 65 ms 47172 KB Output is correct
11 Correct 56 ms 43500 KB Output is correct
12 Correct 50 ms 41048 KB Output is correct
13 Correct 50 ms 41080 KB Output is correct
14 Correct 61 ms 43776 KB Output is correct
15 Correct 62 ms 43560 KB Output is correct
16 Correct 15 ms 31572 KB Output is correct
17 Execution timed out 4037 ms 52424 KB Time limit exceeded
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 31572 KB Output is correct
2 Correct 74 ms 47536 KB Output is correct
3 Correct 71 ms 46284 KB Output is correct
4 Correct 69 ms 47540 KB Output is correct
5 Correct 66 ms 46376 KB Output is correct
6 Correct 54 ms 41608 KB Output is correct
7 Correct 52 ms 40460 KB Output is correct
8 Correct 53 ms 41592 KB Output is correct
9 Correct 58 ms 40396 KB Output is correct
10 Correct 65 ms 47172 KB Output is correct
11 Correct 56 ms 43500 KB Output is correct
12 Correct 50 ms 41048 KB Output is correct
13 Correct 50 ms 41080 KB Output is correct
14 Correct 61 ms 43776 KB Output is correct
15 Correct 62 ms 43560 KB Output is correct
16 Correct 16 ms 31572 KB Output is correct
17 Correct 857 ms 48912 KB Output is correct
18 Correct 786 ms 54348 KB Output is correct
19 Correct 711 ms 46664 KB Output is correct
20 Correct 639 ms 53380 KB Output is correct
21 Correct 916 ms 49012 KB Output is correct
22 Correct 779 ms 54208 KB Output is correct
23 Correct 816 ms 46920 KB Output is correct
24 Correct 716 ms 54012 KB Output is correct
25 Correct 690 ms 46888 KB Output is correct
26 Correct 296 ms 45100 KB Output is correct
27 Correct 391 ms 45976 KB Output is correct
28 Correct 446 ms 48036 KB Output is correct
29 Correct 345 ms 45408 KB Output is correct
30 Correct 409 ms 46200 KB Output is correct
31 Correct 564 ms 48932 KB Output is correct
32 Correct 734 ms 52600 KB Output is correct
33 Correct 439 ms 43804 KB Output is correct
34 Correct 625 ms 54480 KB Output is correct
35 Correct 344 ms 47308 KB Output is correct
36 Correct 617 ms 51188 KB Output is correct
37 Correct 628 ms 46892 KB Output is correct
38 Correct 377 ms 45368 KB Output is correct
39 Correct 372 ms 47612 KB Output is correct
40 Correct 193 ms 45932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 31572 KB Output is correct
2 Correct 16 ms 31572 KB Output is correct
3 Correct 16 ms 31572 KB Output is correct
4 Correct 18 ms 31576 KB Output is correct
5 Correct 20 ms 31756 KB Output is correct
6 Correct 24 ms 31732 KB Output is correct
7 Correct 19 ms 31700 KB Output is correct
8 Correct 28 ms 31700 KB Output is correct
9 Correct 23 ms 31732 KB Output is correct
10 Correct 17 ms 31748 KB Output is correct
11 Correct 19 ms 31724 KB Output is correct
12 Correct 19 ms 31700 KB Output is correct
13 Correct 26 ms 31700 KB Output is correct
14 Correct 19 ms 31704 KB Output is correct
15 Correct 21 ms 31700 KB Output is correct
16 Correct 21 ms 31728 KB Output is correct
17 Correct 22 ms 31712 KB Output is correct
18 Correct 21 ms 31720 KB Output is correct
19 Correct 19 ms 31656 KB Output is correct
20 Correct 21 ms 31656 KB Output is correct
21 Correct 17 ms 31572 KB Output is correct
22 Correct 74 ms 47536 KB Output is correct
23 Correct 71 ms 46284 KB Output is correct
24 Correct 69 ms 47540 KB Output is correct
25 Correct 66 ms 46376 KB Output is correct
26 Correct 54 ms 41608 KB Output is correct
27 Correct 52 ms 40460 KB Output is correct
28 Correct 53 ms 41592 KB Output is correct
29 Correct 58 ms 40396 KB Output is correct
30 Correct 65 ms 47172 KB Output is correct
31 Correct 56 ms 43500 KB Output is correct
32 Correct 50 ms 41048 KB Output is correct
33 Correct 50 ms 41080 KB Output is correct
34 Correct 61 ms 43776 KB Output is correct
35 Correct 62 ms 43560 KB Output is correct
36 Correct 99 ms 48412 KB Output is correct
37 Correct 148 ms 46760 KB Output is correct
38 Correct 126 ms 46584 KB Output is correct
39 Correct 91 ms 48112 KB Output is correct
40 Correct 119 ms 46500 KB Output is correct
41 Correct 72 ms 42148 KB Output is correct
42 Correct 71 ms 42248 KB Output is correct
43 Correct 80 ms 40984 KB Output is correct
44 Correct 81 ms 41060 KB Output is correct
45 Correct 124 ms 47652 KB Output is correct
46 Correct 94 ms 47836 KB Output is correct
47 Correct 92 ms 42584 KB Output is correct
48 Correct 59 ms 41288 KB Output is correct
49 Correct 72 ms 41524 KB Output is correct
50 Correct 79 ms 44060 KB Output is correct
51 Correct 114 ms 43928 KB Output is correct
52 Correct 89 ms 44128 KB Output is correct
53 Correct 15 ms 31572 KB Output is correct
54 Execution timed out 4037 ms 52424 KB Time limit exceeded
55 Halted 0 ms 0 KB -