被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省队十连测]航海舰队相关推荐

  1. BZOJ5217: [Lydsy2017省队十连测]航海舰队 FFT

    被FFT的空间卡了半天 后来发现根本不用开那么大... 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串 ...

  2. [Lydsy2017省队十连测]航海舰队

    SOL: 我们用FFT匹配字符串. 不知道为什么我的NTT挂了,贴一个别人的FFT. #include<bits/stdc++.h> #define ll long long #defin ...

  3. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 93  Solved: 53 [Submit][Status ...

  4. BZOJ5243 : [Lydsy2017省队十连测]绝版题

    要找的就是这棵树的带权重心,以带权重心为根时每棵子树的权值和不超过总权值和的一半. 因此按$\frac{v[i]}{\sum v[i]}$的概率随机选取一个点$x$,则重心有$\frac{1}{2}$ ...

  5. 2017.10.24队内互测——压轴出场的互测终曲|(*_-)

    出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...

  6. winpcap基本原理及常见应用_碳十四测年的基本原理和常见应用谬误

    如果说地层学原理是18世纪地质学给19世纪考古学的重要礼物,那么放射性碳定年法就是20世纪考古学最重要的进步之一.这两种方法都对年代判定做出了重要的贡献,因为若是没有某种类型的年代测定,我们就不可能建 ...

  7. 【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)

    Problem C: [noip2016十连测第三场]序列 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 78  Solved: 32 [Submi ...

  8. 2017.9.16队内互测——老年组Day1

    2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...

  9. 十年测开如何理解自动化测试里的数据驱动、关键字驱动思路

    初次接触自动化测试时,对数据驱动和关键字驱动不甚理解,觉得有点故弄玄须,不就是参数和函数其嘛!其实其也体现了测试所不同与开发的一些特点(主要指系统测试),以及和对技术发展的脉络的展现. 01.录制/回 ...

最新文章

  1. 如何做好SOC的一点点体会
  2. RxJava使用(三)Scheduler 线程控制
  3. 如何解决Windows Update错误80070003
  4. vb检测电脑温度_电脑硬件温度多少正常?如何查看电脑硬件温度?
  5. 反垃圾邮件,需要全面了解各种方案
  6. centos7从有线切换到无线_如何简单实现内外网自由切换?
  7. [Java] webservice soap,wsdl 例子
  8. Hibernate Session get()vs load()的区别
  9. c语言的跳线帽,电脑主板上跳线帽有什么作用图文介绍
  10. 东方智慧和西方智慧的比较
  11. 2018java面试集合
  12. 偏最小二乘法与最小二乘法的区别
  13. Mac OS X磁盘重新分区后 BootCamp Windows启动项丢失
  14. 电路交换与分组交换技术
  15. Your app declares support for audio in the UIBackgroundModes key in your Info.plist 错误
  16. 常用数据库的种类与特点
  17. 西方文化寻根思潮的跨世纪演化——透视“新时代运动“
  18. 关于我写了三万字博客后悔了好久这件事之第二个三万字GUI(swing)
  19. 谱本征正交分解 (SPOD)附matlab代码
  20. 前端图表类可视化插件

热门文章

  1. 鸿蒙天钟壁纸,AI加持的另类彩电之华为智慧屏带你体验鸿蒙
  2. SpringMVC中的文件上传与下载
  3. finally在java程序中的作用_深入理解Java中的finally
  4. 找人才更高效?招聘小程序会是企业的最佳选择!
  5. CSS实现《花样边框》
  6. mysql bi方案_《奥威Power-BI基于MySQL数据源制作报表》精彩回顾
  7. 专攻发票云生态,百望云获评“2018企业服务产品TOP50”!
  8. 2023特种作业操作证熔化焊接与热切割一[安考星]
  9. ubuntu查看磁盘io
  10. java 实现画图板