Submission #813932

# Submission time Handle Problem Language Result Execution time Memory
813932 2023-08-08T04:39:14 Z 이동현(#10122) Posters on the wall (CPSPC17_posters) C++17
90 / 100
991 ms 946164 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#define int long long
using namespace std;

struct Node{
	int l, r, A, B, Alazy, Blazy;

	Node(){
		l = 0, r = 0, A = 0, B = 0, Alazy = 0, Blazy = 0;
	}
};
const int SZ = (int)2e7;
Node tr[SZ];
int tn;

void push(int x, int s, int e, int ps, int pe, int pa, int pb){
	// cout << x << ' ' << s << ' ' << e << ' ' << ps << ' ' << pe << ' ' << pa << ' ' << pb << endl;
	if(ps <= s && pe >= e){
		tr[x].A += pa * (e - s + 1), tr[x].Alazy += pa;
		tr[x].B += pb * (e - s + 1), tr[x].Blazy += pb;
		return;
	}

	int m = s + e >> 1;

	if(tr[x].Alazy || tr[x].Blazy || ps <= m){
		tr[++tn] = tr[tr[x].l];
		tr[x].l = tn;
	}
	if(tr[x].Alazy || tr[x].Blazy || pe > m){
		tr[++tn] = tr[tr[x].r];
		tr[x].r = tn;
	}

	tr[tr[x].l].A += tr[x].Alazy * (m - s + 1), tr[tr[x].l].Alazy += tr[x].Alazy;
	tr[tr[x].l].B += tr[x].Blazy * (m - s + 1), tr[tr[x].l].Blazy += tr[x].Blazy;
	tr[tr[x].r].A += tr[x].Alazy * (e - m), tr[tr[x].r].Alazy += tr[x].Alazy;
	tr[tr[x].r].B += tr[x].Blazy * (e - m), tr[tr[x].r].Blazy += tr[x].Blazy;

	tr[x].Alazy = tr[x].Blazy = 0;

	if(ps <= m){
		push(tr[x].l, s, m, ps, pe, pa, pb);
	}
	if(pe > m){
		push(tr[x].r, m + 1, e, ps, pe, pa, pb);
	}

	tr[x].A = tr[tr[x].l].A + tr[tr[x].r].A;
	tr[x].B = tr[tr[x].l].B + tr[tr[x].r].B;
}

pair<int, int> get(int x, int s, int e, int fs, int fe){
	if(fe < s || fs > e) return {0, 0};
	if(fs <= s && fe >= e){
		return {tr[x].A, tr[x].B};
	}
	
	int m = s + e >> 1;

	if(tr[x].Alazy || tr[x].Blazy){
		tr[++tn] = tr[tr[x].l];
		tr[x].l = tn;
		tr[++tn] = tr[tr[x].r];
		tr[x].r = tn;
		
		tr[tr[x].l].A += tr[x].Alazy * (m - s + 1), tr[tr[x].l].Alazy += tr[x].Alazy;
		tr[tr[x].l].B += tr[x].Blazy * (m - s + 1), tr[tr[x].l].Blazy += tr[x].Blazy;
		tr[tr[x].r].A += tr[x].Alazy * (e - m), tr[tr[x].r].Alazy += tr[x].Alazy;
		tr[tr[x].r].B += tr[x].Blazy * (e - m), tr[tr[x].r].Blazy += tr[x].Blazy;

		tr[x].Alazy = tr[x].Blazy = 0;
	}

	auto lv = get(tr[x].l, s, m, fs, fe);
	auto rv = get(tr[x].r, m + 1, e, fs, fe);

	return {lv.first + rv.first, lv.second + rv.second};
}

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	int h, w, n, m, mod;
	cin >> h >> w >> n >> m >> mod;

	vector<array<int, 5>> que;
	vector<int> srt;
	for(int i = 0; i < n; ++i){
		int x1, y1, x2, y2;
		cin >> y1 >> x1 >> y2 >> x2;
		if(x1 > x2) swap(x1, x2);
		if(y1 > y2) swap(y1, y2);

		que.push_back({x1, y1, y2 - 1, 1, -x1});
		que.push_back({x2, y1, y2 - 1, -1, x2});

		srt.push_back(x1);
		srt.push_back(x2);
	}

	sort(que.begin(), que.end());
	sort(srt.begin(), srt.end());
	srt.erase(unique(srt.begin(), srt.end()), srt.end());
	vector<int> rt((int)srt.size());

	int lst = 0;
	for(auto&[x, y1, y2, A, B]:que){
		int nrt = ++tn;

		tr[nrt] = tr[lst];
		push(nrt, 0, h - 1, y1, y2, A, B);

		// cout << tr[nrt].A << ' ' << tr[nrt].B << endl;

		int pos = lower_bound(srt.begin(), srt.end(), x) - srt.begin();
		rt[pos] = nrt;
		lst = nrt;
	}

	int preans = 0;
	for(int rep = 0; rep < m; ++rep){
		int x1, y1, x2, y2, v;
		cin >> y1 >> x1 >> y2 >> x2 >> v;

		x1 = (x1 + preans * v) % mod;
		x2 = (x2 + preans * v) % mod;
		y1 = (y1 + preans * v) % mod;
		y2 = (y2 + preans * v) % mod;
		
		if(x1 > x2) swap(x1, x2);
		if(y1 > y2) swap(y1, y2);

		auto sol = [&](int x, int y1, int y2)->int{
			int pos = lower_bound(srt.begin(), srt.end(), x + 1) - srt.begin() - 1;
			if(pos < 0){
				return 0;
			}

			auto rv = get(rt[pos], 0, h - 1, y1, y2 - 1);
			// cout << pos << ' ' << rv.first << ' ' << rv.second << endl;
			return rv.first * x + rv.second;
		};

		preans = sol(x2, y1, y2) - sol(x1, y1, y2);

		// cout << x1 << ' ' << y1 << ' ' << x2 << ' ' << y2 << endl;
		cout << preans << '\n';
	}
	
	return 0;
}

Compilation message

Main.cpp: In function 'void push(long long int, long long int, long long int, long long int, long long int, long long int, long long int)':
Main.cpp:27:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   27 |  int m = s + e >> 1;
      |          ~~^~~
Main.cpp: In function 'std::pair<long long int, long long int> get(long long int, long long int, long long int, long long int, long long int)':
Main.cpp:62:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   62 |  int m = s + e >> 1;
      |          ~~^~~
# Verdict Execution time Memory Grader output
1 Correct 296 ms 939648 KB Output is correct
2 Correct 299 ms 939696 KB Output is correct
3 Correct 291 ms 939628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 296 ms 939648 KB Output is correct
2 Correct 299 ms 939696 KB Output is correct
3 Correct 291 ms 939628 KB Output is correct
4 Correct 321 ms 940336 KB Output is correct
5 Correct 305 ms 940408 KB Output is correct
6 Correct 311 ms 940336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 296 ms 939648 KB Output is correct
2 Correct 299 ms 939696 KB Output is correct
3 Correct 291 ms 939628 KB Output is correct
4 Correct 321 ms 940336 KB Output is correct
5 Correct 305 ms 940408 KB Output is correct
6 Correct 311 ms 940336 KB Output is correct
7 Correct 404 ms 945756 KB Output is correct
8 Correct 681 ms 945792 KB Output is correct
9 Correct 527 ms 945748 KB Output is correct
10 Correct 641 ms 945788 KB Output is correct
11 Correct 583 ms 945784 KB Output is correct
12 Correct 611 ms 945812 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 296 ms 939648 KB Output is correct
2 Correct 299 ms 939696 KB Output is correct
3 Correct 291 ms 939628 KB Output is correct
4 Correct 321 ms 940336 KB Output is correct
5 Correct 305 ms 940408 KB Output is correct
6 Correct 311 ms 940336 KB Output is correct
7 Correct 571 ms 946024 KB Output is correct
8 Correct 875 ms 946036 KB Output is correct
9 Correct 649 ms 945772 KB Output is correct
10 Correct 813 ms 945968 KB Output is correct
11 Correct 796 ms 946036 KB Output is correct
12 Correct 790 ms 945968 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 296 ms 939648 KB Output is correct
2 Correct 299 ms 939696 KB Output is correct
3 Correct 291 ms 939628 KB Output is correct
4 Correct 321 ms 940336 KB Output is correct
5 Correct 305 ms 940408 KB Output is correct
6 Correct 311 ms 940336 KB Output is correct
7 Correct 404 ms 945756 KB Output is correct
8 Correct 681 ms 945792 KB Output is correct
9 Correct 527 ms 945748 KB Output is correct
10 Correct 641 ms 945788 KB Output is correct
11 Correct 583 ms 945784 KB Output is correct
12 Correct 611 ms 945812 KB Output is correct
13 Correct 571 ms 946024 KB Output is correct
14 Correct 875 ms 946036 KB Output is correct
15 Correct 649 ms 945772 KB Output is correct
16 Correct 813 ms 945968 KB Output is correct
17 Correct 796 ms 946036 KB Output is correct
18 Correct 790 ms 945968 KB Output is correct
19 Correct 603 ms 946144 KB Output is correct
20 Correct 991 ms 946164 KB Output is correct
21 Correct 691 ms 945896 KB Output is correct
22 Correct 858 ms 946032 KB Output is correct
23 Correct 737 ms 946060 KB Output is correct
24 Correct 697 ms 946128 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 401 ms 945756 KB Output is correct
2 Correct 675 ms 945804 KB Output is correct
3 Correct 514 ms 945712 KB Output is correct
4 Correct 612 ms 945740 KB Output is correct
5 Correct 597 ms 945752 KB Output is correct
6 Correct 626 ms 945716 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 401 ms 945756 KB Output is correct
2 Correct 675 ms 945804 KB Output is correct
3 Correct 514 ms 945712 KB Output is correct
4 Correct 612 ms 945740 KB Output is correct
5 Correct 597 ms 945752 KB Output is correct
6 Correct 626 ms 945716 KB Output is correct
7 Incorrect 615 ms 945776 KB Output isn't correct
8 Halted 0 ms 0 KB -