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个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...
随机推荐
- JAVA之StringBuffer测试样码
这类操作大同小异,但是,高手却能从String,StringBuilder,StringBuffer的应用场景和性能上,分析出其在JAVA编译和JVM上的实现过程差别. 我在CSDN上就看到一个高手分 ...
- SCVMM-VMWARE ACE虚拟机管理工具
SCVMM是微软的虚拟化管理工具 VMWARE ACE是另一套虚拟化的工具 这两套工具都是用来管理虚拟机的,可以直接将物理机虚拟化为虚拟机 企业一旦发展到了一定阶段,并然需要自己的服务器和虚拟化环境, ...
- 不错的题目-n个数连接得到的最大值
这道题目还是很不错的 <[字符串排序]n个数连接得到最小或最大的多位整数> 题目 描述:设有n个正整数,将它们依次连成在一排,组成一个多位数,现在要求可能组成的多位数中最大的多位数是什么? ...
- 彻底解决Android GPS没法定位这一顽固问题
大家去网上搜索Android定位location为null没法定位问题.预计有一大堆文章介绍怎样来解决.可是最后大家发现基本没用. 本文将从Android定位实现原理来深入分析没法定位原因并提出真正的 ...
- leetcode第一刷_Minimum Depth of Binary Tree
非常easy的题目.只是还是认为要说一下. 最小深度.非常快想到bfs,层序遍历嘛.本科的时候实在是没写过多少代码,一開始竟然想不到怎么保存一层的信息.后来想到能够压入一个特殊的对象,每次到达这个对象 ...
- hdoj--1598--find the most comfortable road
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- poj--3624--Charm Bracelet(动态规划 水题)
Home Problem Status Contest Add Contest Statistic LOGOUT playboy307 UPDATE POJ - 3624 Charm Bracelet ...
- .net web api跨域问题
No 'Access-Control-Allow-Origin' Ajax跨域访问解决方案 No 'Access-Control-Allow-Origin' header is present o ...
- 多线程之HttpClient
在程序用调用 Http 接口.请求 http 资源.编写 http 爬虫等的时候都需要在程序集中进行 Http 请求. 很多人习惯的 WebClient.HttpWebRequest 在 TPL 下很 ...
- 第7章 性能和可靠性模式 Load-Balanced Cluster(负载平衡群集)
上下文 您已经决定在设计或修改基础结构层时使用群集,以便在能够适应不断变化的要求的同时保持良好的性能. 问题 在保持可接受的性能级别的同时,如何设计一个可适应负载变化的.可伸缩的基础结构层? 影响因素 ...