#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;
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];
ma[te] = que(a,b,c,d);
return ma[te];
}
void findTreasure (int 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++){
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;
}
}
// kanan bawah
for(int i=n; i>=n/2; i--){
for(int j=n; j>=n/2; j--){
if(i==n/2 && j==n/2) continue; // gk ush
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 time | Memory | Grader output |
---|
Fetching results... |