제출 #1333680

#제출 시각아이디문제언어결과실행 시간메모리
1333680PlayVoltz모자이크 (IOI24_mosaic)C++20
12 / 100
106 ms48864 KiB
#include "mosaic.h"
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back

vector<int> csum, rsum, cpsum, rpsum;
vector<vector<int> > srow, scol;

int sum(int h, int w){
	if (h<=0||w<=0)return 0;
	if (h>w)return csum[w]+rsum[h]-rsum[h-w]-csum[1]*min(h, w);
	return csum[w]+rsum[h]-csum[w-h]-csum[1]*min(h, w);
}

int special(int t, int b, int l, int r){
	if (t>2&&l>2)return 0;
	if (b<=2)return srow[b][r]-(t?srow[t-1][r]:0)-(l?srow[b][l-1]:0)+(t&&l?srow[t-1][l-1]:0);
	if (r<=2)return scol[b][r]-(l?scol[b][l-1]:0)-(t?scol[t-1][r]:0)+(t&&l?scol[t-1][l-1]:0);
	if (t<=2&&l<=2)return srow[2][r]-(t?srow[t-1][r]:0)-(l?srow[2][l-1]:0)+(t&&l?srow[t-1][l-1]:0)+scol[b][2]-(l?scol[b][l-1]:0)-scol[2][2]+(l?scol[2][l-1]:0);
	if (t<=2)return srow[min(b, 2ll)][r]-(t?srow[t-1][r]:0)-(l?srow[min(b, 2ll)][l-1]:0)+(t&&l?srow[t-1][l-1]:0);
	if (l<=2)return scol[b][min(r, 2ll)]-(l?scol[b][l-1]:0)-(t?scol[t-1][min(r, 2ll)]:0)+(t&&l?scol[t-1][l-1]:0);
	return 0;
}

vector<int> mosaic(vector<signed> x, vector<signed> y, vector<signed> t, vector<signed> b, vector<signed> l, vector<signed> r){
	int n=x.size();
	vector<vector<int> > row(3, vector<int>(n, 0)), col(n, vector<int>(3, 0));
	srow.resize(3, vector<int>(n, 0));
	scol.resize(n, vector<int>(3, 0));
	for (int i=0; i<n; ++i)row[0][i]=srow[0][i]=x[i], col[i][0]=scol[i][0]=y[i];
	for (int i=0; i<3; ++i)row[i][0]=srow[i][0]=y[i], col[0][i]=scol[0][i]=x[i];
	for (int i=1; i<3; ++i)for (int j=1; j<n; ++j)if (!row[i-1][j]&&!row[i][j-1])srow[i][j]=row[i][j]=1;
	for (int i=1; i<n; ++i)for (int j=1; j<3; ++j)if (!col[i-1][j]&&!col[i][j-1])scol[i][j]=col[i][j]=1;
	for (int i=1; i<3; ++i)for (int j=0; j<n; ++j)srow[i][j]+=srow[i-1][j];
	for (int i=0; i<3; ++i)for (int j=1; j<n; ++j)srow[i][j]+=srow[i][j-1];
	for (int i=1; i<n; ++i)for (int j=0; j<3; ++j)scol[i][j]+=scol[i-1][j];
	for (int i=0; i<n; ++i)for (int j=1; j<3; ++j)scol[i][j]+=scol[i][j-1];
	rsum.resize(n-1, 0);
	csum.resize(n-1, 0);
	rpsum.resize(n-1, 0);
	cpsum.resize(n-1, 0);
	for (int i=1; i<n-1; ++i)rpsum[i]=rpsum[i-1]+row[2][i+1], cpsum[i]=cpsum[i-1]+col[i+1][2], csum[i]=csum[i-1]+cpsum[i], rsum[i]=rsum[i-1]+rpsum[i];
	vector<int> ans(r.size());
	for (int i=0; i<r.size(); ++i)ans[i]=special(t[i], b[i], l[i], r[i])+sum(b[i]-max(3, t[i])+1, r[i]-max(3, l[i])+1);
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...