在BZOJ上蜜汁RE
但是main上过了
if p > q then swap(p,q)
for I := 1 to n do
if i没有放 then
if i + p没有放 then 放(i,i+p,i+p+q)
else 放(i,i+q,i+p+q)
为什么这么做可行呢 可以证明对于每个循环时发现没被占用的i,i+q必然没有被占用过
证明其实很轻易 因为p<q i+q只能是i-p通过+p+q占用 那么这样的话i-p+p即i比被占用 与i未占用矛盾
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=360005;
int p,q,n;
int vst[N];
int tot,a[N],b[N],c[N];
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d%d%d",&p,&q,&n);
if (p>q) swap(p,q);
for (int i=1;i<=n;i++)
if (!vst[i])
if (!vst[i+p]){
vst[i]=vst[i+p]=vst[i+p+q]=1;
a[++tot]=i; b[tot]=i+p; c[tot]=i+p+q;
}else{
vst[i]=vst[i+q]=vst[i+p+q]=1;
a[++tot]=i; b[tot]=i+q; c[tot]=i+p+q;
}
printf("%d\n",tot);
for (int i=1;i<=tot;i++)
printf("%d %d %d\n",a[i],b[i],c[i]);
return 0;
}