UVA 12633 Super Rooks on Chessboard (生成函数+FFT)
题目大意:给你一张网格,上面有很多骑士,每个骑士能横着竖着斜着攻击一条直线上的格子,求没被攻击的格子的数量总和
好神奇的卷积
假设骑士不能斜着攻击
那么答案就是没被攻击的 行数*列数
接下来考虑斜着攻击对答案的贡献
以左下角为坐标原点建立坐标系,发现一条对角线的点的$(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 ;
- }
UVA 12633 Super Rooks on Chessboard (生成函数+FFT)的更多相关文章
- UVA 12633 Super Rooks on Chessboard [fft 生成函数]
Super Rooks on Chessboard UVA - 12633 题意: 超级车可以攻击行.列.主对角线3 个方向. R * C 的棋盘上有N 个超级车,问不被攻击的格子总数. 行列好好做啊 ...
- 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的格子就可以了. 注意 ...
- 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个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...
随机推荐
- LDA 两种含义
关于LDA有两种含义,一种是线性判别分析(Linear Discriminant Analysis),一种是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称 ...
- angularjs时间轴
1.炫酷的图片是开端啊 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- Delicious Apples (hdu 5303 贪心+枚举)
Delicious Apples Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- QQ好友列表数据模型封装
QQ好友中的信息较多.假设我们单独从plist 中直接取出数据 是能够解决这个问题 可是相当复杂.以为列表中分组 .每组中还有不同信息 大致模型是 数组套数组 数组套字典 所以我们要封装数据模型 / ...
- Struts简单介绍
一.在介绍struts之前,先来了解一下什么是MVC框架吧. 1.MVC介绍 MVC全名是Model View Controller.是模型(model)-视图(view)-控制器(controlle ...
- java.util.ComparableTimSort中的sort()方法简单分析
TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中能够有较好的性能. 该算法最初是由Tim Peters于2002年在Python语言中提出的. T ...
- Grace Hopper
葛丽丝·穆雷·霍普(英语:Grace Murray Hopper,1906年12月9日-1992年1月1日),本姓穆雷(Murray),霍普(Hopper)为夫姓,生于美国纽约州纽约市,美国海军准将及 ...
- org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的systemPropertiesModeName属性
转自:https://www.cnblogs.com/huqianliang/p/5673701.html 使用PropertyPlaceholderConfigurer类载入外部配置 在Spring ...
- H3C路由器查看序列号信息
H3C MSR系列的路由器,查看本机的MAC地址.序列号信息和生产日期信息等可以使用dis device manuinfo 命令查看,以下是执行结果: slot 0 DEVICE_NAME ...
- LINUX/UNIX找回删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹.管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志.有时可以通过lsof来恢复这些 ...