Submission #157378

# Submission time Handle Problem Language Result Execution time Memory
157378 2019-10-11T03:55:21 Z qkxwsm Rectangles (IOI19_rect) C++14
100 / 100
4487 ms 784980 KB
#include "rect.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

template<class T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

template<class T, class U>
void ckmin(T &a, U b)
{
	if (a > b) a = b;
}

template<class T, class U>
void ckmax(T &a, U b)
{
	if (a < b) a = b;
}

#define y1 qkx
#define y2 wsm
#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)
#define SZ(x) ((int) (x).size())
#define ALL(x) (x).begin(), (x).end()
#define INF 1000000007
#define MAXN 2513

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;

int N, M;
vector<pair<short, short> > ev[MAXN][MAXN], eh[MAXN][MAXN];
int fen[MAXN];
ll ans;

void update(int idx, int v)
{
	for (int e = idx + 1; e <= max(N, M); e += e & (-e)) fen[e] += v;
}
int query(int idx)
{
	int res = 0;
	for (int e = idx + 1; e; e -= e & (-e)) res += fen[e];
	return res;
}
bool cmp(pair<short, short> a, pair<short, short> b)
{
	return (a.se < b.se);
}

ll count_rectangles(vector<vi> a)
{
	N = SZ(a); M = SZ(a[0]);
	FOR(i, 0, N)
	{
		vpi cand; cand.PB({INF, M + 1});
		FORD(j, M, 0)
		{
			while(cand.back().fi < a[i][j]) cand.pop_back();
			short idx = cand.back().se;
			if (idx < M && idx != j + 1)
			{
				eh[i][j + 1].PB({idx - 1, i});
			}
			cand.PB({a[i][j], j});
		}
		cand.clear(); cand.PB({INF, -2});
		FOR(j, 0, M)
		{
			while(cand.back().fi < a[i][j]) cand.pop_back();
			short idx = cand.back().se;
			if (idx >= 0 & idx != j - 1)
			{
				eh[i][idx + 1].PB({j - 1, i});
			}
			cand.PB({a[i][j], j});
		}
	}
	FOR(i, 0, M)
	{
		vpi cand; cand.PB({INF, N + 1});
		FORD(j, N, 0)
		{
			while(cand.back().fi < a[j][i]) cand.pop_back();
			short idx = cand.back().se;
			if (idx < N && idx != j + 1)
			{
				ev[j + 1][i].PB({idx - 1, i});
			}
			cand.PB({a[j][i], j});
		}
		cand.clear(); cand.PB({INF, -2});
		FOR(j, 0, N)
		{
			while(cand.back().fi < a[j][i]) cand.pop_back();
			short idx = cand.back().se;
			if (idx >= 0 && idx != j - 1)
			{
				ev[idx + 1][i].PB({j - 1, i});
			}
			cand.PB({a[j][i], j});
		}
	}
	FOR(i, 0, N)
	{
		FOR(j, 0, M)
		{
			sort(ALL(ev[i][j])); ev[i][j].erase(unique(ALL(ev[i][j])), ev[i][j].end());
			sort(ALL(eh[i][j])); eh[i][j].erase(unique(ALL(eh[i][j])), eh[i][j].end());
		}
	}
	FOR(i, 0, N)
	{
		FORD(j, M, 0)
		{
			int idx = 0;
			FOR(k, 0, SZ(ev[i][j]))
			{
				int x = ev[i][j][k].fi;
				while(idx < SZ(ev[i][j + 1]) && ev[i][j + 1][idx].fi < x) idx++;
				if (idx >= SZ(ev[i][j + 1]) || ev[i][j + 1][idx].fi != x) continue;
				ev[i][j][k].se = ev[i][j + 1][idx].se;
			}
		}
	}
	FOR(i, 0, M)
	{
		FORD(j, N, 0)
		{
			int idx = 0;
			FOR(k, 0, SZ(eh[j][i]))
			{
				int y = eh[j][i][k].fi;
				while(idx < SZ(eh[j + 1][i]) && eh[j + 1][i][idx].fi < y) idx++;
				if (idx >= SZ(eh[j + 1][i]) || eh[j + 1][i][idx].fi != y) continue;
				eh[j][i][k].se = eh[j + 1][i][idx].se;
			}
		}
	}
	//log factor here too.
	FOR(i, 1, N - 1)
	{
		FOR(j, 1, M - 1)
		{
			sort(ALL(eh[i][j]), cmp);
			for (auto p : eh[i][j])
			{
				update(p.fi, 1);
			}
			int iter = 0;
			FOR(k, 0, SZ(ev[i][j]))
			{
				while(iter < SZ(eh[i][j]) && eh[i][j][iter].se < ev[i][j][k].fi)
				{
					update(eh[i][j][iter].fi, -1);
					iter++;
				}
				ans += query(ev[i][j][k].se);
			}
			while(iter < SZ(eh[i][j]))
			{
				update(eh[i][j][iter].fi, -1);
				iter++;
			}
		}
	}
	return ans;
}

Compilation message

rect.cpp: In function 'll count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:88:12: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
    if (idx >= 0 & idx != j - 1)
        ~~~~^~~~
# Verdict Execution time Memory Grader output
1 Correct 284 ms 296840 KB Output is correct
2 Correct 288 ms 296952 KB Output is correct
3 Correct 289 ms 297020 KB Output is correct
4 Correct 281 ms 296944 KB Output is correct
5 Correct 280 ms 296924 KB Output is correct
6 Correct 280 ms 296952 KB Output is correct
7 Correct 280 ms 296952 KB Output is correct
8 Correct 282 ms 297060 KB Output is correct
9 Correct 292 ms 296980 KB Output is correct
10 Correct 281 ms 296952 KB Output is correct
11 Correct 292 ms 296880 KB Output is correct
12 Correct 310 ms 297080 KB Output is correct
13 Correct 281 ms 296956 KB Output is correct
14 Correct 281 ms 296952 KB Output is correct
15 Correct 282 ms 297092 KB Output is correct
16 Correct 283 ms 297112 KB Output is correct
17 Correct 282 ms 296952 KB Output is correct
18 Correct 283 ms 296952 KB Output is correct
19 Correct 285 ms 296952 KB Output is correct
20 Correct 282 ms 297060 KB Output is correct
21 Correct 283 ms 296860 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 284 ms 296840 KB Output is correct
2 Correct 288 ms 296952 KB Output is correct
3 Correct 289 ms 297020 KB Output is correct
4 Correct 281 ms 296944 KB Output is correct
5 Correct 280 ms 296924 KB Output is correct
6 Correct 280 ms 296952 KB Output is correct
7 Correct 280 ms 296952 KB Output is correct
8 Correct 282 ms 297060 KB Output is correct
9 Correct 292 ms 296980 KB Output is correct
10 Correct 281 ms 296952 KB Output is correct
11 Correct 292 ms 296880 KB Output is correct
12 Correct 310 ms 297080 KB Output is correct
13 Correct 281 ms 296956 KB Output is correct
14 Correct 281 ms 296952 KB Output is correct
15 Correct 282 ms 297092 KB Output is correct
16 Correct 283 ms 297112 KB Output is correct
17 Correct 285 ms 297372 KB Output is correct
18 Correct 286 ms 297336 KB Output is correct
19 Correct 285 ms 297340 KB Output is correct
20 Correct 286 ms 297216 KB Output is correct
21 Correct 284 ms 297168 KB Output is correct
22 Correct 285 ms 297208 KB Output is correct
23 Correct 282 ms 297208 KB Output is correct
24 Correct 280 ms 297004 KB Output is correct
25 Correct 282 ms 296952 KB Output is correct
26 Correct 283 ms 296952 KB Output is correct
27 Correct 285 ms 296952 KB Output is correct
28 Correct 282 ms 297060 KB Output is correct
29 Correct 283 ms 296860 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 284 ms 296840 KB Output is correct
2 Correct 288 ms 296952 KB Output is correct
3 Correct 289 ms 297020 KB Output is correct
4 Correct 281 ms 296944 KB Output is correct
5 Correct 280 ms 296924 KB Output is correct
6 Correct 280 ms 296952 KB Output is correct
7 Correct 280 ms 296952 KB Output is correct
8 Correct 282 ms 297060 KB Output is correct
9 Correct 292 ms 296980 KB Output is correct
10 Correct 281 ms 296952 KB Output is correct
11 Correct 292 ms 296880 KB Output is correct
12 Correct 310 ms 297080 KB Output is correct
13 Correct 281 ms 296956 KB Output is correct
14 Correct 281 ms 296952 KB Output is correct
15 Correct 282 ms 297092 KB Output is correct
16 Correct 283 ms 297112 KB Output is correct
17 Correct 285 ms 297372 KB Output is correct
18 Correct 286 ms 297336 KB Output is correct
19 Correct 285 ms 297340 KB Output is correct
20 Correct 286 ms 297216 KB Output is correct
21 Correct 284 ms 297168 KB Output is correct
22 Correct 285 ms 297208 KB Output is correct
23 Correct 282 ms 297208 KB Output is correct
24 Correct 280 ms 297004 KB Output is correct
25 Correct 295 ms 300024 KB Output is correct
26 Correct 295 ms 300032 KB Output is correct
27 Correct 295 ms 300024 KB Output is correct
28 Correct 298 ms 298196 KB Output is correct
29 Correct 313 ms 298616 KB Output is correct
30 Correct 299 ms 298744 KB Output is correct
31 Correct 297 ms 298768 KB Output is correct
32 Correct 297 ms 298744 KB Output is correct
33 Correct 282 ms 296952 KB Output is correct
34 Correct 283 ms 296952 KB Output is correct
35 Correct 285 ms 296952 KB Output is correct
36 Correct 282 ms 297060 KB Output is correct
37 Correct 283 ms 296860 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 284 ms 296840 KB Output is correct
2 Correct 288 ms 296952 KB Output is correct
3 Correct 289 ms 297020 KB Output is correct
4 Correct 281 ms 296944 KB Output is correct
5 Correct 280 ms 296924 KB Output is correct
6 Correct 280 ms 296952 KB Output is correct
7 Correct 280 ms 296952 KB Output is correct
8 Correct 282 ms 297060 KB Output is correct
9 Correct 292 ms 296980 KB Output is correct
10 Correct 281 ms 296952 KB Output is correct
11 Correct 292 ms 296880 KB Output is correct
12 Correct 310 ms 297080 KB Output is correct
13 Correct 281 ms 296956 KB Output is correct
14 Correct 281 ms 296952 KB Output is correct
15 Correct 282 ms 297092 KB Output is correct
16 Correct 283 ms 297112 KB Output is correct
17 Correct 285 ms 297372 KB Output is correct
18 Correct 286 ms 297336 KB Output is correct
19 Correct 285 ms 297340 KB Output is correct
20 Correct 286 ms 297216 KB Output is correct
21 Correct 284 ms 297168 KB Output is correct
22 Correct 285 ms 297208 KB Output is correct
23 Correct 282 ms 297208 KB Output is correct
24 Correct 280 ms 297004 KB Output is correct
25 Correct 295 ms 300024 KB Output is correct
26 Correct 295 ms 300032 KB Output is correct
27 Correct 295 ms 300024 KB Output is correct
28 Correct 298 ms 298196 KB Output is correct
29 Correct 313 ms 298616 KB Output is correct
30 Correct 299 ms 298744 KB Output is correct
31 Correct 297 ms 298768 KB Output is correct
32 Correct 297 ms 298744 KB Output is correct
33 Correct 425 ms 319368 KB Output is correct
34 Correct 402 ms 313120 KB Output is correct
35 Correct 376 ms 313020 KB Output is correct
36 Correct 364 ms 306912 KB Output is correct
37 Correct 496 ms 334696 KB Output is correct
38 Correct 495 ms 334576 KB Output is correct
39 Correct 499 ms 334820 KB Output is correct
40 Correct 479 ms 332408 KB Output is correct
41 Correct 420 ms 309500 KB Output is correct
42 Correct 453 ms 312060 KB Output is correct
43 Correct 534 ms 318336 KB Output is correct
44 Correct 536 ms 320036 KB Output is correct
45 Correct 403 ms 308600 KB Output is correct
46 Correct 408 ms 308788 KB Output is correct
47 Correct 514 ms 318064 KB Output is correct
48 Correct 546 ms 318804 KB Output is correct
49 Correct 282 ms 296952 KB Output is correct
50 Correct 283 ms 296952 KB Output is correct
51 Correct 285 ms 296952 KB Output is correct
52 Correct 282 ms 297060 KB Output is correct
53 Correct 283 ms 296860 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 288 ms 297232 KB Output is correct
2 Correct 297 ms 297180 KB Output is correct
3 Correct 282 ms 297180 KB Output is correct
4 Correct 280 ms 296952 KB Output is correct
5 Correct 280 ms 297176 KB Output is correct
6 Correct 283 ms 297256 KB Output is correct
7 Correct 286 ms 297080 KB Output is correct
8 Correct 284 ms 297208 KB Output is correct
9 Correct 285 ms 297104 KB Output is correct
10 Correct 281 ms 296952 KB Output is correct
11 Correct 283 ms 297092 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 284 ms 296936 KB Output is correct
2 Correct 1182 ms 368356 KB Output is correct
3 Correct 2441 ms 448252 KB Output is correct
4 Correct 2411 ms 448900 KB Output is correct
5 Correct 2401 ms 449008 KB Output is correct
6 Correct 571 ms 326008 KB Output is correct
7 Correct 866 ms 347936 KB Output is correct
8 Correct 903 ms 351096 KB Output is correct
9 Correct 282 ms 296952 KB Output is correct
10 Correct 283 ms 296952 KB Output is correct
11 Correct 285 ms 296952 KB Output is correct
12 Correct 282 ms 297060 KB Output is correct
13 Correct 283 ms 296860 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 284 ms 296840 KB Output is correct
2 Correct 288 ms 296952 KB Output is correct
3 Correct 289 ms 297020 KB Output is correct
4 Correct 281 ms 296944 KB Output is correct
5 Correct 280 ms 296924 KB Output is correct
6 Correct 280 ms 296952 KB Output is correct
7 Correct 280 ms 296952 KB Output is correct
8 Correct 282 ms 297060 KB Output is correct
9 Correct 292 ms 296980 KB Output is correct
10 Correct 281 ms 296952 KB Output is correct
11 Correct 292 ms 296880 KB Output is correct
12 Correct 310 ms 297080 KB Output is correct
13 Correct 281 ms 296956 KB Output is correct
14 Correct 281 ms 296952 KB Output is correct
15 Correct 282 ms 297092 KB Output is correct
16 Correct 283 ms 297112 KB Output is correct
17 Correct 285 ms 297372 KB Output is correct
18 Correct 286 ms 297336 KB Output is correct
19 Correct 285 ms 297340 KB Output is correct
20 Correct 286 ms 297216 KB Output is correct
21 Correct 284 ms 297168 KB Output is correct
22 Correct 285 ms 297208 KB Output is correct
23 Correct 282 ms 297208 KB Output is correct
24 Correct 280 ms 297004 KB Output is correct
25 Correct 295 ms 300024 KB Output is correct
26 Correct 295 ms 300032 KB Output is correct
27 Correct 295 ms 300024 KB Output is correct
28 Correct 298 ms 298196 KB Output is correct
29 Correct 313 ms 298616 KB Output is correct
30 Correct 299 ms 298744 KB Output is correct
31 Correct 297 ms 298768 KB Output is correct
32 Correct 297 ms 298744 KB Output is correct
33 Correct 425 ms 319368 KB Output is correct
34 Correct 402 ms 313120 KB Output is correct
35 Correct 376 ms 313020 KB Output is correct
36 Correct 364 ms 306912 KB Output is correct
37 Correct 496 ms 334696 KB Output is correct
38 Correct 495 ms 334576 KB Output is correct
39 Correct 499 ms 334820 KB Output is correct
40 Correct 479 ms 332408 KB Output is correct
41 Correct 420 ms 309500 KB Output is correct
42 Correct 453 ms 312060 KB Output is correct
43 Correct 534 ms 318336 KB Output is correct
44 Correct 536 ms 320036 KB Output is correct
45 Correct 403 ms 308600 KB Output is correct
46 Correct 408 ms 308788 KB Output is correct
47 Correct 514 ms 318064 KB Output is correct
48 Correct 546 ms 318804 KB Output is correct
49 Correct 288 ms 297232 KB Output is correct
50 Correct 297 ms 297180 KB Output is correct
51 Correct 282 ms 297180 KB Output is correct
52 Correct 280 ms 296952 KB Output is correct
53 Correct 280 ms 297176 KB Output is correct
54 Correct 283 ms 297256 KB Output is correct
55 Correct 286 ms 297080 KB Output is correct
56 Correct 284 ms 297208 KB Output is correct
57 Correct 285 ms 297104 KB Output is correct
58 Correct 281 ms 296952 KB Output is correct
59 Correct 283 ms 297092 KB Output is correct
60 Correct 284 ms 296936 KB Output is correct
61 Correct 1182 ms 368356 KB Output is correct
62 Correct 2441 ms 448252 KB Output is correct
63 Correct 2411 ms 448900 KB Output is correct
64 Correct 2401 ms 449008 KB Output is correct
65 Correct 571 ms 326008 KB Output is correct
66 Correct 866 ms 347936 KB Output is correct
67 Correct 903 ms 351096 KB Output is correct
68 Correct 2211 ms 543936 KB Output is correct
69 Correct 2053 ms 463680 KB Output is correct
70 Correct 1606 ms 463528 KB Output is correct
71 Correct 1408 ms 382776 KB Output is correct
72 Correct 4386 ms 737888 KB Output is correct
73 Correct 2499 ms 450340 KB Output is correct
74 Correct 2658 ms 455944 KB Output is correct
75 Correct 4019 ms 548012 KB Output is correct
76 Correct 2513 ms 448132 KB Output is correct
77 Correct 3343 ms 498708 KB Output is correct
78 Correct 4123 ms 548928 KB Output is correct
79 Correct 2340 ms 438808 KB Output is correct
80 Correct 3918 ms 535000 KB Output is correct
81 Correct 3820 ms 527612 KB Output is correct
82 Correct 2664 ms 561444 KB Output is correct
83 Correct 4325 ms 737560 KB Output is correct
84 Correct 4384 ms 737584 KB Output is correct
85 Correct 4487 ms 784980 KB Output is correct
86 Correct 282 ms 296952 KB Output is correct
87 Correct 283 ms 296952 KB Output is correct
88 Correct 285 ms 296952 KB Output is correct
89 Correct 282 ms 297060 KB Output is correct
90 Correct 283 ms 296860 KB Output is correct