제출 #1226529

#제출 시각아이디문제언어결과실행 시간메모리
1226529ByeWorld보물 찾기 (CEOI13_treasure2)C++20
10 / 100
3 ms1864 KiB
#include "treasure.h"
#include <bits/stdc++.h>
// #pragma GCC optimize("O3")
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
#define que countTreasure
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 1e5+10;
const int SQRT = 450;
const int INF = 1e9+100;
const int LOG = 20;
void chmn(int &a, int b){ a = min(a, b); }
void chmx(int &a, int b){ a = max(a, b); }

int n, pr[1010][1010];
bool ada[1010][1010];
ll pref[1010][1010], a[1010][1010];
map<array<int,4>, int> ma;
ll tot = 0;

int tre(int a, int b, int c, int d){
	array <int, 4> te = {a, b, c, d};
	if(ma.find(te) != ma.end()) return ma[te];

	tot += n*n - (c-a+1)*(d-b+1)+1;
	ma[te] = que(a,b,c,d);
	return ma[te];
}

void findTreasure (int N) {
	n = N;
	int las = 0, x, y;
	for(int i=1; i<=n/2+1; i++){ // kiri atas
		for(int j=1; j<=n/2+1; j++){
			// cout << i << ' ' << j << " kiritatas\n";
			pr[i][j] = tre(i,j, n,n);
			las = pr[i][j];
			if(i==n/2+1 && j==1) x = pr[i][j];
			if(i==n/2+1 && j==n/2+1) y = pr[i][j];
		}
	}
	for(int i=1; i<=n/2; i++){
		for(int j=1; j<=n/2; j++){
			int th = pr[i][j]-pr[i+1][j]-pr[i][j+1]+pr[i+1][j+1];
			ada[i][j] = th;
		}
	}
	
	// cout << tot << " tot\n";
	// kanan bawah
	for(int i=n; i>=n/2+1; i--){
		for(int j=n; j>=n/2+1; j--){
			if(i==n/2+1 && j==n/2+1) continue; // gk ush
			// cout << i << ' ' << j << " kananbwah\n";
			pr[i][j] = tre(1,1, i,j);
		}
	}
	int sum = 0;
	for(int i=n; i>=n/2+1; i--){
		for(int j=n; j>=n/2+1; j--){
			if(i==n/2+1 && j==n/2+1){
				ada[i][j] = las-sum; continue;
			}
			int th = pr[i][j]-pr[i-1][j]-pr[i][j-1]+pr[i-1][j-1];
			ada[i][j] = th;
			sum += th;
		}
	}

	int p = x-y;

	for(int i=n; i>=1; i--){
		for(int j=1; j<=n; j++){
			pref[i][j] = pref[i+1][j]+pref[i][j-1]-pref[i+1][j-1];
			if(i==n/2+1 && j==n/2) pref[i][j] += p;
			pref[i][j] += ada[i][j];
		}
	}
	for(int i=1; i<=n/2; i++){ // atas kanan
		for(int j=n; j>=n/2+1; j--){
			pref[i][j] = tre(i, 1, n, j);
		}
	}
	// for(int i=1; i<=n; i++){
	// 	for(int j=1; j<=n; j++){
	// 		cout << pref[i][j] << ' ';
	// 	}
	// 	cout << '\n';
	// }
	// cout << " done\n";
	for(int i=n/2; i>=1; i--){ // atas kanan
		for(int j=n/2+1; j<=n; j++){
			int th = pref[i][j]-pref[i+1][j]-pref[i][j-1]+pref[i+1][j-1];
			ada[i][j] = th;
		}
	}

	// kiri bawah
	for(int i=1; i<=n; i++){
		for(int j=n; j>=1; j--){
			pref[i][j] = pref[i-1][j]+pref[i][j+1]-pref[i-1][j+1];
			pref[i][j] += ada[i][j];
		}
	}
	for(int i=n/2+1; i<=n; i++)
		for(int j=n/2; j>=1; j--)
			pref[i][j] = tre(1, j, i, n);

	for(int i=n/2+1; i<=n; i++){
		for(int j=n/2; j>=1; j--){
			int th = pref[i][j]-pref[i-1][j]-pref[i][j+1]+pref[i-1][j+1];
			ada[i][j] = th;
		}
	}


	// for(int i=1; i<=n; i++){
	// 	for(int j=1; j<=n; j++){
	// 		cout << ada[i][j];
	// 	}
	// 	cout << '\n';
	// }
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
			if(ada[i][j])
				Report(i, j);
			
}
#Verdict Execution timeMemoryGrader output
Fetching results...