题面传送门

题目大意:给你一张网格,上面有很多骑士,每个骑士能横着竖着斜着攻击一条直线上的格子,求没被攻击的格子的数量总和

好神奇的卷积

假设骑士不能斜着攻击

那么答案就是没被攻击的 行数*列数

接下来考虑斜着攻击对答案的贡献

以左下角为坐标原点建立坐标系,发现一条对角线的点的$(x+y)$坐标是相同的

考虑卷积,设计两个生成函数$a,b$

如果第i行没骑士,则$a_{i}=1$,反之为$0$

如果第i列没骑士,则$b_{i}=1$,反之为$0$

我们对两个式子进行卷积,可以求出每一条对角线上还有多少个空格子

答案就是$\sum$ 没有骑士的对角线的空格子数

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 (1<<18)
#define M1 (N1<<1)
#define ll long long
#define dd double
#define idx(X) (X-'a')
using namespace std; int gint()
{
int ret=,fh=; char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int T,n,m,num,r[N1];
int nt[N1],x[N1],y[N1];
const dd pi=acos(-); struct cp{
dd x,y;
friend cp operator + (const cp &s1,const cp &s2){ return (cp){s1.x+s2.x,s1.y+s2.y}; }
friend cp operator - (const cp &s1,const cp &s2){ return (cp){s1.x-s2.x,s1.y-s2.y}; }
friend cp operator * (const cp &s1,const cp &s2){ return (cp){s1.x*s2.x-s1.y*s2.y,s1.y*s2.x+s1.x*s2.y}; }
}a[N1],b[N1],c[N1]; void init()
{
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(c,,sizeof(c));
memset(nt,,sizeof(nt));
}
void FFT(cp *s,int len,int type)
{
int i,j,k; cp wn,w,t;
for(i=;i<len;i++) if(i<r[i]) swap(s[i],s[r[i]]);
for(k=;k<=len;k<<=)
{
wn=(cp){cos(2.0*type*pi/k),sin(2.0*type*pi/k)};
for(i=;i<len;i+=k)
{
w=(cp){,};
for(j=;j<(k>>);j++,w=w*wn)
{
t=w*s[i+j+(k>>)];
s[i+j+(k>>)]=s[i+j]-t;
s[i+j]=s[i+j]+t;
}
}
}
}
void FFT_Main(int len)
{
FFT(a,len,); FFT(b,len,);
for(int i=;i<len;i++) c[i]=a[i]*b[i];
FFT(c,len,-);
for(int i=;i<len;i++) c[i].x=c[i].x/len;
} int main()
{
scanf("%d",&T); int t;
for(t=;t<=T;t++){ init();
scanf("%d%d%d",&n,&m,&num);
int i,j,de,len,L; ll ans=;
for(i=;i<=num;i++) x[i]=n-gint(), y[i]=gint()-, a[x[i]].x=-, b[y[i]].x=-, nt[x[i]+y[i]]=;
for(i=;i<n;i++) a[i].x++;
for(i=;i<m;i++) b[i].x++;
for(len=,L=;len<n+m-;len<<=,L++);
for(i=;i<len;i++) r[i]=(r[i>>]>>)|((i&)<<(L-));
FFT_Main(len);
for(i=;i<=n+m-;i++) if(!nt[i]) ans+=(int)(c[i].x+0.1);
printf("Case %d: %lld\n",t,ans); }
return ;
}
05-11 14:56