[ARC175E] Three View Drawing

WrongAnswer_90發表於2024-08-27

My Blogs

[ARC175E] Three View Drawing

哎,構造。

首先考慮 \(m=n^2\) 怎麼做:顯然是最上面一層填滿第一條主對角線,第二層填滿第二條主對角線...(主對角線指可以迴圈的對角線)。

\(n\) 變成滿足 \(n^2\geq m\) 的最小的 \(n\)。然後考慮刪去 \(n^2-m\) 個。可以發現(誰能發現啊啊啊)在矩形的右下角刪掉一個 L 型即可。如果 \(n^2-m\) 是偶數則右下角的 \((n,n,n)\) 保留即可。

image.png

\(x\) 表示 \(L\) 的邊長 \(-1\)(圖中為 \(4\))。上圖是正方體的俯檢視,把正方體從上到下分成 \(1,2,3\dots n\) 層,某個位置填了 \(x\) 代表這個的格子存在於第 \(x\) 層。

首先對於暖色調的填法,可以發現這樣對於前 \(n-1-x\) 層,從正面和側面看都是填滿的,和俯檢視是相同的。

對於紫色,這個位置填的是 \(n\),正好對應了在第 \(n\) 層只有最左邊三個有值,符合俯檢視。

對於冷色調的其他顏色,都在一個 \((n-1)\times(n-1)\) 的正方形裡面填的,所以對於第 \((n-x)\sim(n-1)\) 層,每層從正面和右面看都是恰好 \(n-1\) 個格子,也符合俯檢視。

int n,m,a[510][510];
vector<tup> ans;
inline void mian()
{
	read(n,m),memset(a,-1,sizeof(a));
	while((n-1)*(n-1)>=m)--n;
	m=n*n-m;
	if(!(m&1))ans.eb(tup(n-1,n-1,n-1));else --m;
	m>>=1,assert(m<n);
	for(int i=0;i+m+1<n;++i)for(int j=0;j<n;++j)a[j][(i-1-j+n)%n]=i;
	for(int i=0;i<n-1-m;++i)a[i][n-2-m-i]=n-1;
	for(int i=n-m-1;i<n-1;++i)for(int j=0;j<n-1;++j)a[j][(i-j+(n-1))%(n-1)]=i;
	for(int i=0;i<n;++i)for(int j=0;j<n;++j)if(a[i][j]!=-1)ans.eb(tup(i,j,a[i][j]));
	for(auto [x,y,z]:ans)write(x,' ',y,' ',z,'\n');
}

相關文章