发现对角线上的和是一个定值。

然后就不考虑斜着,可以处理出那些行和列是可以放置的。

然后FFT,统计出每一个可行的项的系数和就可以了。

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair #define maxn 200005 struct Complex{
double x,y;
Complex () {}
Complex (double _x,double _y) {x=_x;y=_y;}
Complex operator + (Complex a) {return Complex(x+a.x,y+a.y);}
Complex operator - (Complex a) {return Complex(x-a.x,y-a.y);}
Complex operator * (Complex a) {return Complex(x*a.x-y*a.y,x*a.y+y*a.x);}
}A[maxn],B[maxn],C[maxn]; int t,r,c,n,k,m,len,line[maxn],row[maxn],ang[maxn],rev[maxn],cntl=0,cntr=0,kas=0;
ll ans=0; const double pi=acos(-1.0); void FFT(Complex * x,int n,int flag)
{
F(i,0,n-1) if (rev[i]>i) swap(x[i],x[rev[i]]);
for (int m=2;m<=n;m<<=1)
{
Complex wn=Complex(cos(2*pi/m),flag*sin(2*pi/m));
for (int i=0;i<n;i+=m)
{
Complex w=Complex(1.0,0);
for (int j=0;j<(m>>1);++j)
{
Complex u=x[i+j],v=x[i+j+(m>>1)]*w;
x[i+j]=u+v; x[i+j+(m>>1)]=u-v;
w=w*wn;
}
}
}
if (flag==-1) F(i,0,n-1) x[i].x=(x[i].x+0.3)/n;
} int main()
{
scanf("%d",&t);
while (t--)
{
memset(line,0,sizeof line);
memset(row,0,sizeof row);
memset(ang,0,sizeof ang);
cntl=cntr=0;
scanf("%d%d%d",&r,&c,&k);
F(i,1,k)
{
int x,y;
scanf("%d%d",&x,&y);
x=r-x+1;
if (!line[x]) cntl++;
if (!row[y]) cntr++;
line[x]=1; row[y]=1;
ang[x+y]=1;
}
ans=((ll)r-(ll)cntl)*((ll)c-(ll)cntr);
n=r+c+10;m=1;len=0;
while (m<=n) m<<=1,len++;n=m;
F(i,0,n-1)
{
int ret=0,t=i;
F(j,1,len) ret<<=1,ret|=t&1,t>>=1;
rev[i]=ret;
}
F(i,0,n-1) A[i].x=B[i].x=A[i].y=B[i].y=0;
F(i,1,r) if (!line[i]) A[i].x=1.0;
F(i,1,c) if (!row[i]) B[i].x=1.0;
FFT(A,n,1); FFT(B,n,1);
F(i,0,n-1) C[i]=A[i]*B[i];
FFT(C,n,-1);
F(i,1,r+c) if (ang[i]) ans-=(ll)C[i].x;
printf("Case %d: ",++kas);printf("%lld\n",ans);
}
}

  

UVA 12633 Super Rooks on Chessboard ——FFT的更多相关文章

  1. UVA 12633 Super Rooks on Chessboard [fft 生成函数]

    Super Rooks on Chessboard UVA - 12633 题意: 超级车可以攻击行.列.主对角线3 个方向. R * C 的棋盘上有N 个超级车,问不被攻击的格子总数. 行列好好做啊 ...

  2. UVA 12633 Super Rooks on Chessboard(FFT)

    题意: 给你一个R*C的棋盘,棋盘上的棋子会攻击,一个棋子会覆盖它所在的行,它所在的列,和它所在的从左上到右下的对角线,那么问这个棋盘上没有被覆盖的棋盘格子数.数据范围R,C,N<=50000 ...

  3. [UVA 12633] Super Rooks on Chessboard FFT+计数

    如果只有行和列的覆盖,那么可以直接做,但现在有左上到右下的覆盖. 考虑对行和列的覆盖情况做一个卷积,然后就有了x+y的非覆盖格子数. 然后用骑士的左上到右下的覆盖特判掉那些x+y的格子就可以了. 注意 ...

  4. UVA 12633 Super Rooks on Chessboard (生成函数+FFT)

    题面传送门 题目大意:给你一张网格,上面有很多骑士,每个骑士能横着竖着斜着攻击一条直线上的格子,求没被攻击的格子的数量总和 好神奇的卷积 假设骑士不能斜着攻击 那么答案就是没被攻击的 行数*列数 接下 ...

  5. UVa12633 Super Rooks on Chessboard(容斥 + FFT)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/42145 Description Let’s assume there is a new chess ...

  6. UVA12633 Super Rooks on Chessboard

    题目描述 题解: 第一眼满眼骚操作,然后全部否掉. 然后屈服于题解,才发现这题这么执掌. 首先,如果这个东西是普通的车,那我们可以记录一下$x,y$的覆盖情况,然后减一下; 但是这个可以斜着走. 所以 ...

  7. UVA - 12298 Super Poker II NTT

    UVA - 12298 Super Poker II NTT 链接 Vjudge 思路 暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数&q ...

  8. UVA - 11134 Fabled Rooks[贪心 问题分解]

    UVA - 11134 Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n × n board subject to t ...

  9. uva 11134 - Fabled Rooks(问题转换+优先队列)

    题目链接:uva 11134 - Fabled Rooks 题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...

随机推荐

  1. 升级win10后电脑经常自动重启的问题

    升级win10后用户体验度确实比win7强了很多,但是电脑无故的重启,让人无法接受,下面就介绍win10电脑自动重启问题的解决方案 问题分析: 遇到这种情况主要是硬件与系统不兼容所致 解决方案: 1, ...

  2. 关于小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题

    问题:小程序的input组件经常用到,但在使用input组件的时候会出现一种现象:明明设置了input的宽度,但是输入的内容显示的长度范围却怎么都不到一整个input组件的宽度,而且后面没显示的地方无 ...

  3. 【计数】cf223C. Partial Sums

    考试时候遇到这种题只会找规律 You've got an array a, consisting of n integers. The array elements are indexed from ...

  4. Ubuntu 下使用虚拟串口进行开发测试

    1. python 工具 #coding = utf-8 import pty import os import select def mkpty(): master1, slave = pty.op ...

  5. centos7安装mongodb3.6

    1. 安装一下centos(6.5) + 虚拟机,在VMware中安装mongodb 2. 下载mongodb最新版本:mongodb-linux-x86_64-3.6.4.tgz,传到centos ...

  6. ASP.NET 自定义路由 RouteBase

    适用场景:当前项目有一个接口:http://xxx.com/a.aspx,现在我们在不需要a.aspx这个文件的,直接处理这个地址的请求,我们可以做很多的事情,比如,直接返回一个静态的JSON文件内容 ...

  7. 利用PHPExcel 实现excel数据的导入导出(源码实现)

    利用PHPExcel 实现excel数据的导入导出(源码实现) 在开发过程中,经常会遇到导入导出的需求,利用phpexcel类实现起来也是比较容易的,下面,我们一步一步实现 提前将phpexcel类下 ...

  8. Laravel 打印已执行的sql语句

    打开app\Providers\AppServiceProvider.PHP,在boot方法中添加如下内容 5.2以下版本 // 先引入DB use DB; // 或者直接使用 \DB:: DB::l ...

  9. Special Segments of Permutation - CodeForces - 1156E (笛卡尔树上的启发式合并)

    题意 给定一个全排列\(a\). 定义子区间\([l,r]\),当且仅当\(a_l + a_r = Max[l,r]\). 求\(a\)序列中子区间的个数. 题解 笛卡尔树上的启发式合并. \(200 ...

  10. HihoCoder - 1636 Pangu and Stones(区间DP)

    有n堆石子,每次你可以把相邻的最少L堆,最多R堆合并成一堆. 问把所有石子合并成一堆石子的最少花费是多少. 如果不能合并,输出0. 石子合并的变种问题. 用dp[l][r][k]表示将 l 到 r 之 ...