Submission #589720

# Submission time Handle Problem Language Result Execution time Memory
589720 2022-07-05T07:48:09 Z 8e7 Fish 2 (JOI22_fish2) C++17
31 / 100
1899 ms 289992 KB
//Challenge: Accepted
#include <bits/stdc++.h>
using namespace std;
#ifdef zisk
void debug(){cout << endl;}
template<class T, class ... U> void debug(T a, U ... b){cout << a << " ", debug(b...);}
template<class T> void pary(T l, T r) {
	while (l != r) cout << *l << " ", l++;
	cout << endl;
}
#else
#define debug(...) 0
#define pary(...) 0
#endif
#define ll long long
#define maxn 100005
#define pii pair<int, int>
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);cin.tie(0);
const int inf = 1<<30;

struct segtree_interval{
	stack<pii> stk[4*maxn];	
	bool in (pii &p, int x) {
		return p.ff <= x && x <= p.ss;
	}
	void remove(int cur, int l, int r, int ind, vector<pii> &v) {
		if (r <= l) return;
		while (stk[cur].size() && in(stk[cur].top(), ind)) {
			v.push_back(stk[cur].top());
			stk[cur].pop();
		}
		int m = (l + r) / 2;
		if (ind < m) remove(cur*2, l, m, ind, v);
		else if (ind > m) remove(cur*2+1, m+1, r, ind, v);
	}
	void ins(int cur, int l, int r, pii p) {
		if (r <= l) return;
		int m = (l + r) / 2;
		if (in(p, m)) {
			stk[cur].push(p);
			return;
		}
		if (m > p.ss) ins(cur*2, l, m, p);
		else if (m < p.ff) ins(cur*2+1, m+1, r, p);
	}
} inter;
struct segtree_mincnt{
	pii seg[4*maxn];
	int tag[4*maxn];
	void init(int cur, int l, int r) {
		if (r <= l) return;
		seg[cur].ss = (r - l);
		if (r - l == 1) return;
		int m = (l + r) / 2;
		init(cur*2, l, m), init(cur*2+1, m, r);
	}
	void push(int cur, int l, int r) {
		seg[cur].ff += tag[cur];
		if (r - l > 1) {
			tag[cur*2] += tag[cur];
			tag[cur*2+1] += tag[cur];
		}
		tag[cur] = 0;
	}
	void merge(pii &a, pii &b, pii &c) {
		a.ff = min(b.ff, c.ff);
		a.ss = (b.ff == a.ff ? b.ss : 0) + (c.ff == a.ff ? c.ss : 0);
	}
	void pull(int cur, int l, int r) {
		int m = (l + r) / 2;
		push(cur*2, l, m), push(cur*2+1, m, r);
		merge(seg[cur], seg[cur*2], seg[cur*2+1]);
	}
	void modify(int cur, int l, int r, int ql, int qr, int v) {
		if (r <= l || ql >= r || qr <= l) return;
		push(cur, l, r);
		if (ql <= l && qr >= r) {
			tag[cur] += v;
			return;
		}
		int m = (l + r) / 2;
		modify(cur*2, l, m, ql, qr, v); 
		modify(cur*2+1, m, r, ql, qr, v); 
		pull(cur, l, r);
	}
	pii query(int cur, int l, int r, int ql, int qr) {
		if (r <= l || ql >= r || qr <= l) return {inf, 0};
		push(cur, l, r);
		if (ql <= l && qr >= r) return seg[cur];
		int m = (l + r) / 2;
		pii ret, vl = query(cur*2, l, m, ql, qr), vr = query(cur*2+1, m, r, ql, qr);
		merge(ret, vl, vr);
		return ret;
	}
} mincnt;

struct segtree{
	ll seg[4*maxn], tag[4*maxn];
	void init(int cur, int l, int r, ll a[]) {
		if (r <= l) return;
		if (r - l == 1) {
			seg[cur] = a[l];
			return;
		}
		int m = (l + r) / 2;
		init(cur*2, l, m, a), init(cur*2+1, m, r, a);
		seg[cur] = max(seg[cur*2], seg[cur*2+1]);
	}
	void push(int cur, int l, int r) {
		seg[cur] += tag[cur];
		if (r - l > 1) {
			tag[cur*2] += tag[cur];
			tag[cur*2+1] += tag[cur];
		}
		tag[cur] = 0;
	}
	void pull(int cur, int l, int r) {
		int m = (l + r) / 2;
		push(cur*2, l, m), push(cur*2+1, m, r);
		seg[cur] = max(seg[cur*2], seg[cur*2+1]);
	}
	void modify(int cur, int l, int r, int ql, int qr, ll x) {
		if (r <= l || ql >= r || qr <= l) return;
		push(cur, l, r);
		if (ql <= l && qr >= r) {
			tag[cur] += x;
			return;
		}
		int m = (l + r) / 2;
		modify(cur*2, l, m, ql, qr, x);
		modify(cur*2+1, m, r, ql, qr, x);
		pull(cur, l, r);
	}
	int search(int cur, int l, int r, int ql, int qr, bool type, ll t) {
		//type 0: left, 1:right
		push(cur, l, r);
		if (r <= l || ql >= r || qr <= l || seg[cur] < t) return -1;
		if (r - l == 1) return l;
		int m = (l + r) / 2;
		if (type) {
			int vr = search(cur*2+1, m, r, ql, qr, type, t);
			if (vr != -1) return vr;
			return search(cur*2, l, m, ql, qr, type, t);
		} else {
			int vl = search(cur*2, l, m, ql, qr, type, t);
			if (vl != -1) return vl;
			return search(cur*2+1, m, r, ql, qr, type, t);
		}
	}
	ll query(int cur, int l, int r, int x) { //getpnt
		if (r <= l) return 0;
		push(cur, l, r);
		if (r - l == 1) return seg[cur];
		int m = (l + r) / 2;
		if (x < m) return query(cur*2, l, m, x);
		else query(cur*2+1, m, r, x);
	}
} tr, lb, rb; 
struct BIT{
	ll bit[maxn];
	void modify(int ind, ll val) {
		ind++;
		for (;ind < maxn;ind += ind & (-ind)) bit[ind] += val;
	}
	ll query(int ind) {
		ll ret = 0;
		ind++;
		for (;ind > 0;ind -= ind & (-ind)) ret += bit[ind];
		return ret;
	}
	ll sum(int l, int r) {
		return query(r) - query(l-1);	
	}
} sum;
ll a[maxn];
int main() {
	io
	int n, q;
	cin >> n;
	for (int i = 0;i < n;i++) {
		cin >> a[i];
		sum.modify(i, a[i]);
	}
	bool ini = 1;
	auto check = [&] (int l, int r, ll s) { //stuck in [l, r]
		if (r < l) return;
		if (ini) s = sum.sum(l, r);
	
		if(!((l && s >= a[l-1]) || (r < n - 1 && s >= a[r+1]))) {
			debug(l, r);
			inter.ins(1, 0, n, {l, r});				
			mincnt.modify(1, 0, n, l, r+1, 1);	
		}
	};
	tr.init(1, 0, n, a);
	mincnt.init(1, 0, n);
	{
		ll pref[maxn];
		for (int i = 0;i < n;i++) {
			pref[i] = a[i] + (i ? pref[i-1] : 0);
			lb.modify(1, 0, n, i, i+1, a[i] - (i ? pref[i-1] : 0));	
			rb.modify(1, 0, n, i, i+1, a[i] + pref[i]);
		}
		
		stack<int> stk;
		for (int i = 0;i < n;i++) {
			while (stk.size() && a[i] >= a[stk.top()]) {
				check(stk.top()+1, i-1, 0);
				stk.pop();	
			}
			if (stk.size()) check(stk.top()+1, i-1, 0);	
			else check(0, i-1, 0);
			stk.push(i);
		}
		while (stk.size()) {
			check(stk.top()+1, n-1, 0);
			stk.pop();
		}
	}
	ini = 0;
	cin >> q;
	while (q--) {
		int type;
		cin >> type;
		if (type == 1) {
			int i, y;
			cin >> i >> y;
			i--;
			ll d = y - a[i];
			tr.modify(1, 0, n, i, i+1, d); 
			lb.modify(1, 0, n, i, i+1, d);
			rb.modify(1, 0, n, i, i+1, d);
			lb.modify(1, 0, n, i+1, n, -d);
			rb.modify(1, 0, n, i+1, n, d);
			sum.modify(i, d);
			a[i] = y;

			vector<pii> rem;
			inter.remove(1, 0, n, i, rem);
			inter.remove(1, 0, n, i-1, rem);
			inter.remove(1, 0, n, i+1, rem);
			for (auto p:rem) {
				debug("rem", p.ff, p.ss);
				mincnt.modify(1, 0, n, p.ff, p.ss+1, -1);
			}
			vector<int> lef, rig;
			int cur = i+1;		
			ll s = a[i];
			if (i+1 < n) {
				s = min(s, a[i+1]);
				lef.push_back(i+1);
			}
			while (cur < n) {
				int nxt = tr.search(1, 0, n, cur, n, 0, s+1);
				if (nxt != -1) {
					rig.push_back(nxt-1);
					cur = nxt;
					s += a[nxt];
				} else {
					break;
				}
			}
			rig.push_back(n-1);	
			cur = i-1, s = a[i];	
			if (i-1 >= 0) {
				s = min(s, a[i-1]);
				rig.insert(rig.begin(), i-1);
			}
			while (cur >= 0) {
				int nxt = tr.search(1, 0, n, 0, cur+1, 1, s+1);
				if (nxt != -1) {
					lef.push_back(nxt+1);
					cur = nxt;
					s += a[nxt];
				} else {
					break;
				}
			}
			lef.push_back(0);

			lef.resize(int(unique(lef.begin(), lef.end()) - lef.begin()));
			rig.resize(int(unique(rig.begin(), rig.end()) - rig.begin()));
			vector<ll> ls, rs;
			for (int I:lef) ls.push_back(sum.query(I-1)); 
			for (int I:rig) rs.push_back(sum.query(I));
			for (int I = (int)lef.size() - 1;I >= 0;I--) {
				for (int j = 0;j < rig.size();j++) {
					check(lef[I], rig[j], rs[j] - ls[I]);
				}
			}

		} else {
			int l, r;
			cin >> l >> r;
			l--; //[l, r)
			ll suml = -sum.query(l-1)+1, sumr = sum.query(r-1)+1;
			int il = lb.search(1, 0, n, l, r, 1, suml);
			int ir = rb.search(1, 0, n, l, r, 0, sumr)+1;
			if (il != -1) l = il;
			if (ir != -1) r = ir;
			debug("query", l, r);
			cout << mincnt.query(1, 0, n, l, r).ss << "\n";
		}
	}
}
/*
*/

Compilation message

fish2.cpp: In lambda function:
fish2.cpp:12:20: warning: statement has no effect [-Wunused-value]
   12 | #define debug(...) 0
      |                    ^
fish2.cpp:192:4: note: in expansion of macro 'debug'
  192 |    debug(l, r);
      |    ^~~~~
fish2.cpp: In function 'int main()':
fish2.cpp:12:20: warning: statement has no effect [-Wunused-value]
   12 | #define debug(...) 0
      |                    ^
fish2.cpp:245:5: note: in expansion of macro 'debug'
  245 |     debug("rem", p.ff, p.ss);
      |     ^~~~~
fish2.cpp:289:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  289 |     for (int j = 0;j < rig.size();j++) {
      |                    ~~^~~~~~~~~~~~
fish2.cpp:12:20: warning: statement has no effect [-Wunused-value]
   12 | #define debug(...) 0
      |                    ^
fish2.cpp:303:4: note: in expansion of macro 'debug'
  303 |    debug("query", l, r);
      |    ^~~~~
# Verdict Execution time Memory Grader output
1 Correct 161 ms 273540 KB Output is correct
2 Correct 159 ms 273596 KB Output is correct
3 Correct 160 ms 273720 KB Output is correct
4 Correct 166 ms 273604 KB Output is correct
5 Incorrect 180 ms 273736 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 191 ms 273592 KB Output is correct
2 Correct 285 ms 286888 KB Output is correct
3 Correct 273 ms 286724 KB Output is correct
4 Correct 274 ms 286920 KB Output is correct
5 Correct 303 ms 286644 KB Output is correct
6 Correct 263 ms 287416 KB Output is correct
7 Correct 243 ms 286572 KB Output is correct
8 Correct 262 ms 287268 KB Output is correct
9 Correct 252 ms 286612 KB Output is correct
10 Correct 259 ms 286884 KB Output is correct
11 Correct 246 ms 286680 KB Output is correct
12 Correct 258 ms 286604 KB Output is correct
13 Correct 259 ms 286556 KB Output is correct
14 Correct 265 ms 287000 KB Output is correct
15 Correct 258 ms 286996 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 161 ms 273540 KB Output is correct
2 Correct 159 ms 273596 KB Output is correct
3 Correct 160 ms 273720 KB Output is correct
4 Correct 166 ms 273604 KB Output is correct
5 Incorrect 180 ms 273736 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 191 ms 273592 KB Output is correct
2 Correct 285 ms 286888 KB Output is correct
3 Correct 273 ms 286724 KB Output is correct
4 Correct 274 ms 286920 KB Output is correct
5 Correct 303 ms 286644 KB Output is correct
6 Correct 263 ms 287416 KB Output is correct
7 Correct 243 ms 286572 KB Output is correct
8 Correct 262 ms 287268 KB Output is correct
9 Correct 252 ms 286612 KB Output is correct
10 Correct 259 ms 286884 KB Output is correct
11 Correct 246 ms 286680 KB Output is correct
12 Correct 258 ms 286604 KB Output is correct
13 Correct 259 ms 286556 KB Output is correct
14 Correct 265 ms 287000 KB Output is correct
15 Correct 258 ms 286996 KB Output is correct
16 Correct 170 ms 273544 KB Output is correct
17 Correct 434 ms 288440 KB Output is correct
18 Correct 436 ms 288708 KB Output is correct
19 Correct 467 ms 288356 KB Output is correct
20 Correct 396 ms 288392 KB Output is correct
21 Correct 411 ms 288448 KB Output is correct
22 Correct 454 ms 288848 KB Output is correct
23 Correct 384 ms 288352 KB Output is correct
24 Correct 463 ms 288344 KB Output is correct
25 Correct 424 ms 288432 KB Output is correct
26 Correct 407 ms 288292 KB Output is correct
27 Correct 478 ms 289264 KB Output is correct
28 Correct 419 ms 289280 KB Output is correct
29 Correct 428 ms 289240 KB Output is correct
30 Correct 363 ms 288240 KB Output is correct
31 Correct 347 ms 288136 KB Output is correct
32 Correct 383 ms 288332 KB Output is correct
33 Correct 427 ms 288736 KB Output is correct
34 Correct 416 ms 288316 KB Output is correct
35 Correct 377 ms 288288 KB Output is correct
36 Correct 404 ms 288640 KB Output is correct
37 Correct 384 ms 288208 KB Output is correct
38 Correct 423 ms 288192 KB Output is correct
39 Correct 492 ms 288884 KB Output is correct
40 Correct 402 ms 288756 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 191 ms 273592 KB Output is correct
2 Correct 285 ms 286888 KB Output is correct
3 Correct 273 ms 286724 KB Output is correct
4 Correct 274 ms 286920 KB Output is correct
5 Correct 303 ms 286644 KB Output is correct
6 Correct 263 ms 287416 KB Output is correct
7 Correct 243 ms 286572 KB Output is correct
8 Correct 262 ms 287268 KB Output is correct
9 Correct 252 ms 286612 KB Output is correct
10 Correct 259 ms 286884 KB Output is correct
11 Correct 246 ms 286680 KB Output is correct
12 Correct 258 ms 286604 KB Output is correct
13 Correct 259 ms 286556 KB Output is correct
14 Correct 265 ms 287000 KB Output is correct
15 Correct 258 ms 286996 KB Output is correct
16 Correct 178 ms 273572 KB Output is correct
17 Incorrect 1899 ms 289992 KB Output isn't correct
18 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 161 ms 273540 KB Output is correct
2 Correct 159 ms 273596 KB Output is correct
3 Correct 160 ms 273720 KB Output is correct
4 Correct 166 ms 273604 KB Output is correct
5 Incorrect 180 ms 273736 KB Output isn't correct
6 Halted 0 ms 0 KB -