UVA 12633 Super Rooks on Chessboard [fft 生成函数]
Super Rooks on Chessboard
题意:
超级车可以攻击行、列、主对角线3 个方向。
R * C 的棋盘上有N 个超级车,问不被攻击的格子总数。
行列好好做啊,就是不被攻击的行数*列数
减去主对角线的,就是不被攻击的行列中求\(r - c = d\)的三元组个数
考虑写出行和列生成函数 \(A(x)=\sum x^{r_i},B(x)=\sum x^{-c_i}\),乘起来就行了
可以乘上\(x^c\)来避免负指数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = (1<<17) + 5;
const double PI = acos(-1.0);
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
}
struct meow{
double x, y;
meow(double a=0, double b=0):x(a), y(b){}
};
meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
meow conj(meow a) {return meow(a.x, -a.y);}
typedef meow cd;
namespace fft {
int n, rev[N];
cd omega[N], omegaInv[N];
void init(int lim) {
n = 1; int k = 0; while(n < lim) n <<= 1, k++;
for(int i=0; i<n; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));
for(int i=0; i<n; i++) {
omega[i] = cd(cos(2*PI/n*i), sin(2*PI/n*i));
omegaInv[i] = conj(omega[i]);
}
}
void dft(cd *a, int flag) {
cd *w = flag == 1 ? omega : omegaInv;
for(int i=0; i<n; i++) if(i < rev[i]) swap(a[i], a[rev[i]]);
for(int l=2; l<=n; l<<=1) {
int m = l>>1;
for(cd *p = a; p != a+n; p += l)
for(int k=0; k<m; k++) {
cd t = w[n/l*k] * p[k+m];
p[k+m] = p[k] - t;
p[k] = p[k] + t;
}
}
if(flag == -1) for(int i=0; i<n; i++) a[i].x /= n;
}
void mul(cd *a, cd *b) {
dft(a, 1); dft(b, 1);
for(int i=0; i<n; i++) a[i] = a[i] * b[i];
dft(a, -1);
}
}
int r, c, n, m, R[N], C[N], D[N], x, y;
cd a[N], b[N];
int main() {
freopen("in", "r", stdin);
int T = read(), cas = 0;
while(T--) {
r = read(); c = read(); n = read(); m = max(r, c);
fft::init(m+m+1);
for(int i=0; i<fft::n; i++) a[i] = b[i] = cd(), R[i] = C[i] = D[i] = 0;
for(int i=1; i<=n; i++)
x=read(), y=read(), R[x] = 1, C[y] = 1, D[x+m-y] = 1;
int tr = 0, tc = 0;
for(int i=1; i<=r; i++) if(!R[i]) tr++, a[i].x = 1.0;
for(int i=1; i<=c; i++) if(!C[i]) tc++, b[m-i].x = 1.0;
ll ans = (ll) tr * tc, t = 0;
fft::mul(a, b);
for(int i=0; i <= m<<1; i++) if(D[i]) t += (ll) floor(a[i].x + 0.5);
printf("Case %d: %lld\n", ++cas, ans - t);
}
}
UVA 12633 Super Rooks on Chessboard [fft 生成函数]的更多相关文章
- UVA 12633 Super Rooks on Chessboard(FFT)
题意: 给你一个R*C的棋盘,棋盘上的棋子会攻击,一个棋子会覆盖它所在的行,它所在的列,和它所在的从左上到右下的对角线,那么问这个棋盘上没有被覆盖的棋盘格子数.数据范围R,C,N<=50000 ...
- UVA 12633 Super Rooks on Chessboard ——FFT
发现对角线上的和是一个定值. 然后就不考虑斜着,可以处理出那些行和列是可以放置的. 然后FFT,统计出每一个可行的项的系数和就可以了. #include <map> #include &l ...
- [UVA 12633] Super Rooks on Chessboard FFT+计数
如果只有行和列的覆盖,那么可以直接做,但现在有左上到右下的覆盖. 考虑对行和列的覆盖情况做一个卷积,然后就有了x+y的非覆盖格子数. 然后用骑士的左上到右下的覆盖特判掉那些x+y的格子就可以了. 注意 ...
- UVA 12633 Super Rooks on Chessboard (生成函数+FFT)
题面传送门 题目大意:给你一张网格,上面有很多骑士,每个骑士能横着竖着斜着攻击一条直线上的格子,求没被攻击的格子的数量总和 好神奇的卷积 假设骑士不能斜着攻击 那么答案就是没被攻击的 行数*列数 接下 ...
- UVa12633 Super Rooks on Chessboard(容斥 + FFT)
题目 Source http://acm.hust.edu.cn/vjudge/problem/42145 Description Let’s assume there is a new chess ...
- UVA12633 Super Rooks on Chessboard
题目描述 题解: 第一眼满眼骚操作,然后全部否掉. 然后屈服于题解,才发现这题这么执掌. 首先,如果这个东西是普通的车,那我们可以记录一下$x,y$的覆盖情况,然后减一下; 但是这个可以斜着走. 所以 ...
- UVA - 12298 Super Poker II NTT
UVA - 12298 Super Poker II NTT 链接 Vjudge 思路 暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数&q ...
- 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 ...
- uva 11134 - Fabled Rooks(问题转换+优先队列)
题目链接:uva 11134 - Fabled Rooks 题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...
随机推荐
- 在windows下详解:大端对齐和小端对齐
计算机的内存最小单位是什么?是BYTE,是字节.一个大于BYTE的数据类型在内存中存放的时候要有先后顺序. 高内存地址放整数的高位,低内存地址放整数的低位,这种方式叫倒着放,术语叫小端对齐.电脑X86 ...
- 为什么vertical-align不起作用
先看一段代码 <style> .title { margin:50px; color:blue; } .title span { font-size:24px; } .title span ...
- 高性能网络编程(1)—accept建立连接(转载,作者:陶辉)
编 写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发 的效率,追求更快的完成项目功能点.希望应用代码完全 ...
- c#委托事件入门--第一讲:委托入门
说起委托,有些刚刚入门c#的人感觉很高大上,没有接触过,但是其实很多人都用过Lambda表达式,实际上Lambda表达式就是一个委托. 关于委托入门有个大神写的很详细:张子阳的博客 C#中的委托和事 ...
- django入门基础
首先要说的是django与其他的框架不同,django是一个封装的及其完善的框架,我们使用django也不会像之前写学生系统那样,django操作数据库使用自带的ORM来进行操作,Torando与Fl ...
- dedecms 封面模板和列表模板有什么不同
封面模板,相当于你一个大栏目的封面.举例:你有一个栏目叫做"建站"而下面有很多子栏目,例如代码教程.模板下载.seo经验等,那么封面就相当于这个大栏目的首页,然后您可以在这个页面展 ...
- Fontawesome字体使用说明及其常用效果语法
标签: 字体图标iconfontawesom Font web开发(17) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 本文主要介绍如何在我们的站点里引入Footaweso ...
- socket编程--相关函数--sendto();read();
{1} 头文件:#include <sys/types.h> #include <sys/socket.h>定义函数:int sendto(int s, const voi ...
- 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)
原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...
- mysql-SQL优化总结
1.查询首先考虑在where和order by设计的列上建立索引,尽量避免全表扫描. 2.尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描. select ...