题解:P17242 [IOI 2026] 方块游戏 / tiling
考虑最极端的情况,每个
如上图,我们可以让要填在左上角的小块和右上角的小块放在同一行,当一行填满后再从下一行开始填,由于白块在放的角的对面,因此一定不会出现
其中中间两行是交汇处,左边填的部分偶数行一定有一个白色,右边填的部分奇数行一定有一个白色,而中间(列)交汇处的两列都有一个白色。对于中间行和上下两行的相较(即图片中的第
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
int n,m;
int mp[101][101],up,down,lu,ru,ld,rd,op,l,r;
void init(int _n,int _m)
{
n=_n,m=_m;
up=0,down=n-1;
lu=ld=0,ru=rd=m-1;
l=r=-1;
}
pii receive_block(int tl,int tr,int bl,int br)
{
if(up==down)
{
if(l==-1)l=max(lu,ld),r=min(ru,rd);
pii ans;
if(!tl||!bl)
{
ans={down<<1,r<<1};
r--;
}
else
{
ans={down<<1,l<<1};
l++;
}
return ans;
}
if(!tl)
{
pii ans={down<<1,rd<<1};
rd--;
if(rd<ld)
{
down--;
ld=0,rd=m-1;
}
return ans;
}
if(!tr)
{
pii ans={down<<1,ld<<1};
ld++;
if(rd<ld)
{
down--;
ld=0,rd=m-1;
}
return ans;
}
if(!bl)
{
pii ans={up<<1,ru<<1};
ru--;
if(ru<lu)
{
up++;
lu=0,ru=m-1;
}
return ans;
}
if(!br)
{
pii ans={up<<1,lu<<1};
lu++;
if(ru<lu)
{
up++;
lu=0,ru=m-1;
}
return ans;
}
}