BZOJ5217: [Lydsy2017省队十连测]航海舰队
被FFT的空间卡了半天 后来发现根本不用开那么大…
首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0
两个串匹配起来如果某一位两个串是1和1 则礁石与舰艇会在同一位置不可能到达 那么这个匹配所对应的图中的位置就不成立
因为要确定每个位置可以想到将T翻转后做FFT后每一位(每一位代表了一个小矩形的匹配情况)上结果是0就可以匹配上 为1不成立 选出为0的 做一遍BFS 求出可以到达的位置
可以发现可行的状态里面会有重复的空地 所以再做一次FFT T串为小矩形的正序串 S串为BFS后的可行装状态串 之后对结果的数组中实数个数计数就是答案咧
#include<bits/stdc++.h>
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define ll long long
#define mod 1000000007
#define inf 2e9
#define PI acos(-1.0)
#define pii pair<int,int>
#define fi first
#define se second
#define mk make_pair
using namespace std;
const int N=1e6+5
const int MXN=7e2+5;
struct cp {double x,y;cp(double _x=0,double _y=0) { x=_x,y=_y;}
}A[N],B[N];
cp operator + (cp x,cp y){cp z;z.x=x.x+y.x;z.y=x.y+y.y;return z;}
cp operator - (cp x,cp y){cp z;z.x=x.x-y.x;z.y=x.y-y.y;return z;}
cp operator * (cp x,cp y){cp z;z.x=x.x*y.x-x.y*y.y;z.y=x.y*y.x+x.x*y.y;return z;}int ans,up=inf,dn,lf=inf,rt,W,H,all,k,len,M,n,m,r[N],T[N];
queue<pii >q;
char a[MXN][MXN];
bool vis[N],v[N];
void init(){for(int i=0;i<n;i++) for(int j=0;j<m;j++){if(a[i][j]=='#') B[i*m+j]=cp(1,0);else if(a[i][j]=='o'){up=min(up,i),dn=max(dn,i);lf=min(lf,j),rt=max(rt,j);}}for(int i=up;i<=dn;i++) for(int j=lf;j<=rt;j++) if(a[i][j]=='o')T[(i-up)*m+j-lf]=1;W=rt-lf+1,H=dn-up+1,len=(H-1)*m+W;
}
void FFT(cp *x,int f){for(int i=0;i<M;i++) if(r[i]>i) swap(x[r[i]],x[i]); for(int i=1;i<M;i<<=1){cp wn(cos(PI/i),f*sin(PI/i));for(int j=0;j<M;j+=i<<1){cp w=1;for(int k=0;k<i;k++,w=w*wn){cp a=x[j+k],b=w*x[j+k+i];x[j+k]=a+b,x[j+k+i]=a-b;}}}if(f==-1) for(int i=0;i<M;i++) x[i].x/=M;
}
void work(){q.push(mk(dn,rt));while(!q.empty()){int x=q.front().fi,y=q.front().se;q.pop();if(x<0||x>=n||y<0||y>=m) continue;int z=x*m+y;if(!v[z]||vis[z]) continue;vis[z]=1;q.push(mk(x+1,y)),q.push(mk(x-1,y)),q.push(mk(x,y-1)),q.push(mk(x,y+1)); }
}
int main(){
#ifdef Devil_Garyfreopen("in.txt","r",stdin);
#endif/* freopen("sailing.in","r",stdin);freopen("sailing.out","w",stdout);*/cin>>n>>m,all=n*m;for(int i=0;i<n;i++) scanf("%s",a[i]);init();for(M=1;M<=all;M<<=1,k++);for(int i=1;i<M;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(k-1));for(int i=0;i<len;i++) if(T[i]) A[len-i-1]=1;FFT(A,1),FFT(B,1);for(int i=0;i<M;i++) A[i]=A[i]*B[i];FFT(A,-1);for(int i=H-1;i<n;i++) for(int j=W-1;j<m;j++) if(A[i*m+j].x<0.5) v[i*m+j]=1; work();for(int i=0;i<M;i++) A[i]=T[i];for(int i=0;i<M;i++) B[i]=vis[i];FFT(A,1),FFT(B,1);for(int i=0;i<M;i++) A[i]=A[i]*B[i];FFT(A,-1);for(int i=0;i<M;i++) if(A[i].x>0.5) ans++;return printf("%d\n",ans),0;
}
BZOJ5217: [Lydsy2017省队十连测]航海舰队相关推荐
- BZOJ5217: [Lydsy2017省队十连测]航海舰队 FFT
被FFT的空间卡了半天 后来发现根本不用开那么大... 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串 ...
- [Lydsy2017省队十连测]航海舰队
SOL: 我们用FFT匹配字符串. 不知道为什么我的NTT挂了,贴一个别人的FFT. #include<bits/stdc++.h> #define ll long long #defin ...
- bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 93 Solved: 53 [Submit][Status ...
- BZOJ5243 : [Lydsy2017省队十连测]绝版题
要找的就是这棵树的带权重心,以带权重心为根时每棵子树的权值和不超过总权值和的一半. 因此按$\frac{v[i]}{\sum v[i]}$的概率随机选取一个点$x$,则重心有$\frac{1}{2}$ ...
- 2017.10.24队内互测——压轴出场的互测终曲|(*_-)
出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...
- winpcap基本原理及常见应用_碳十四测年的基本原理和常见应用谬误
如果说地层学原理是18世纪地质学给19世纪考古学的重要礼物,那么放射性碳定年法就是20世纪考古学最重要的进步之一.这两种方法都对年代判定做出了重要的贡献,因为若是没有某种类型的年代测定,我们就不可能建 ...
- 【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)
Problem C: [noip2016十连测第三场]序列 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 78 Solved: 32 [Submi ...
- 2017.9.16队内互测——老年组Day1
2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...
- 十年测开如何理解自动化测试里的数据驱动、关键字驱动思路
初次接触自动化测试时,对数据驱动和关键字驱动不甚理解,觉得有点故弄玄须,不就是参数和函数其嘛!其实其也体现了测试所不同与开发的一些特点(主要指系统测试),以及和对技术发展的脉络的展现. 01.录制/回 ...
最新文章
- 如何做好SOC的一点点体会
- RxJava使用(三)Scheduler 线程控制
- 如何解决Windows Update错误80070003
- vb检测电脑温度_电脑硬件温度多少正常?如何查看电脑硬件温度?
- 反垃圾邮件,需要全面了解各种方案
- centos7从有线切换到无线_如何简单实现内外网自由切换?
- [Java] webservice soap,wsdl 例子
- Hibernate Session get()vs load()的区别
- c语言的跳线帽,电脑主板上跳线帽有什么作用图文介绍
- 东方智慧和西方智慧的比较
- 2018java面试集合
- 偏最小二乘法与最小二乘法的区别
- Mac OS X磁盘重新分区后 BootCamp Windows启动项丢失
- 电路交换与分组交换技术
- Your app declares support for audio in the UIBackgroundModes key in your Info.plist 错误
- 常用数据库的种类与特点
- 西方文化寻根思潮的跨世纪演化——透视“新时代运动“
- 关于我写了三万字博客后悔了好久这件事之第二个三万字GUI(swing)
- 谱本征正交分解 (SPOD)附matlab代码
- 前端图表类可视化插件