A类数据:

将棋盘黑白染色,相邻的点之间连边,求出二分图最大匹配即可。

B类数据:

答案为$\lfloor\frac{n^2-1}{3}\rfloor$,用FFT加速计算即可,时间复杂度$O(L\log L)$。

C类数据:

轮廓线DP,对于轮廓线上每个格子,要么为空,要么被占据,要么被占据且还要向下延伸一格。

设$f[i][j][S][k]$表示考虑到$(i,j)$,轮廓线上$m$个格子状态为$S$,转角处被占据状态为$k$时最多能放几个俄罗斯方块。

时间复杂度$O(nm3^m)$。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char sn[200010],sm[200010],type[5];int K;
namespace SubA{
const int N=105,M=N*N,inf=~0U>>2;
int n,m,cnt,i,j,a[N][N],id[N][N],S,T,h[M],gap[M],ans;
struct E{int t,f;E*nxt,*pair;}*g[M],*d[M],pool[M*6],*cur=pool;
inline void add(int s,int t){
if(!s||!t)return;
E*p=cur++;p->t=t;p->f=1;p->nxt=g[s];g[s]=p;
p=cur++;p->t=s;p->f=0;p->nxt=g[t];g[t]=p;
g[s]->pair=g[t];g[t]->pair=g[s];
}
int sap(int v,int flow){
if(v==T)return flow;
int rec=0;
for(E*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
int ret=sap(p->t,min(flow-rec,p->f));
p->f-=ret;p->pair->f+=ret;d[v]=p;
if((rec+=ret)==flow)return flow;
}
if(!(--gap[h[v]]))h[S]=T;
gap[++h[v]]++;d[v]=g[v];
return rec;
}
void solve(){
sscanf(sn,"%d",&n);
sscanf(sm,"%d",&m);
while(K--)scanf("%d%d",&i,&j),a[i][j]=1;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(!a[i][j])id[i][j]=++cnt;
S=cnt+1;T=S+1;
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if((i+j)&1)add(S,id[i][j]);else add(id[i][j],T);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if((i+j)&1){
add(id[i][j],id[i][j-1]);
add(id[i][j],id[i][j+1]);
add(id[i][j],id[i-1][j]);
add(id[i][j],id[i+1][j]);
}
for(gap[0]=T,i=1;i<=T;i++)d[i]=g[i];
while(h[S]<T)ans+=sap(S,inf);
printf("%d",ans);
}
}
namespace SubB{
const int N=262150;
const double pi=acos(-1.0);
struct comp{
double r,i;comp(double _r=0,double _i=0){r=_r,i=_i;}
comp operator+(const comp&x){return comp(r+x.r,i+x.i);}
comp operator-(const comp&x){return comp(r-x.r,i-x.i);}
comp operator*(const comp&x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
comp conj(){return comp(r,-i);}
}A[N],B[N];
int n,i,j,k,pos[N],c[N];
void FFT(comp*a,int n,int t){
for(int i=1;i<n;i++)if(i<pos[i])swap(a[i],a[pos[i]]);
for(int d=0;(1<<d)<n;d++){
int m=1<<d,m2=m<<1;double o=pi*2/m2*t;comp _w(cos(o),sin(o));
for(int i=0;i<n;i+=m2){
comp w(1,0);
for(int j=0;j<m;j++){
comp&A=a[i+j+m],&B=a[i+j],t=w*A;
A=B-t;B=B+t;w=w*_w;
}
}
}
if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
}
void solve(){
n=strlen(sn);
for(i=0;i<n;i++)A[i]=comp(sn[n-i-1]-'0',sn[n-i-1]-'0');
for(k=1;k<n+n;k<<=1);
j=__builtin_ctz(k)-1;
for(i=0;i<k;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
FFT(A,k,1);
for(i=0;i<k;i++){
j=(k-i)&(k-1);
B[i]=(A[i]*A[i]-(A[j]*A[j]).conj())*comp(0,-0.25);
}
FFT(B,k,-1);
for(i=0;i<k;i++)c[i]=int(B[i].r+0.5);
for(i=0;i<k;i++)c[i+1]+=c[i]/10,c[i]%=10;
for(n=k;!c[n];n--);
c[0]--;
for(i=n;~i;i--){
if(i)c[i-1]+=c[i]%3*10;
c[i]/=3;
}
while(n&&!c[n])n--;
for(i=n;~i;i--)printf("%d",c[i]);
}
}
namespace SubC{
const int N=11,M=180000;
int n,m,i,j,k,t,S,x,E,a[N][N],cnt,q[M],h[1<<22],f[M][2],g[M][2],ans;
inline int get(int x,int y){return x>>(y+y)&3;}
inline void clr(){for(int i=1;i<=cnt;i++)f[i][0]=f[i][1]=-1;}
inline void nxt(){for(int i=1;i<=cnt;i++)g[i][0]=f[i][0],g[i][1]=f[i][1];}
inline void up(int&x,int y){if(x<y)x=y;}
void solve(){
sscanf(sn,"%d",&n);
sscanf(sm,"%d",&m);
while(K--)scanf("%d%d",&i,&j),a[i-1][j-1]=1;
for(S=0;S<(1<<(m+m));S++){
for(j=1,i=0;i<m;i++)if(get(S,i)==3){j=0;break;}
if(j)q[++cnt]=S,h[S]=cnt;
}
clr();
nxt();
for(S=i=0;i<m;i++)S|=1<<(i+i);
g[h[S]][0]=0;
for(i=0;i<n;i++)for(j=0;j<m;j++){
clr();
for(k=1;k<=cnt;k++)for(t=0;t<2;t++)if(~g[k][t]){
S=q[k],x=get(S,j),E=S^(x<<(j+j));
if(x==2){
if(a[i][j])continue;
up(f[h[E^(1<<(j+j))]][x>0],g[k][t]);
}else{
up(f[h[E]][x>0],g[k][t]);
if(a[i][j])continue;
if(i>0)if(!x&&!a[i-1][j])up(f[h[E^(2<<(j+j))]][1],g[k][t]+1);
if(j>=2)if(!get(S,j-1)&&!a[i][j-1]&&!get(S,j-2)&&!a[i][j-2]){
up(f[h[E^(1<<(j+j-4)^(1<<(j+j-2)^(1<<(j+j))))]][x>0],g[k][t]+1);
}
if(j>=1)if(!get(S,j-1)&&!a[i][j-1]){
up(f[h[E^(2<<(j+j-2))^(1<<(j+j))]][x>0],g[k][t]+1);
up(f[h[E^(1<<(j+j-2))^(2<<(j+j))]][x>0],g[k][t]+1);
if(i>0){
if(!t&&!a[i-1][j-1]){
up(f[h[E^(1<<(j+j-2))^(1<<(j+j))]][x>0],g[k][t]+1);
}
if(!x&&!a[i-1][j]){
up(f[h[E^(1<<(j+j-2))^(1<<(j+j))]][1],g[k][t]+1);
}
}
}
}
}
nxt();
}
for(k=1;k<=cnt;k++){
S=q[k];
for(j=1,i=0;i<m;i++)if(get(S,i)==2){j=0;break;}
if(j)for(t=0;t<2;t++)up(ans,g[k][t]);
}
printf("%d",ans);
}
}
int main(){
scanf("%s%s%d%s",sm,sn,&K,type);
if(type[0]=='A')SubA::solve();
if(type[0]=='B')SubB::solve();
if(type[0]=='C')SubC::solve();
return 0;
}

  

BZOJ2706 : [SDOI2012]棋盘覆盖的更多相关文章

  1. bzoj 2706: [SDOI2012]棋盘覆盖 Dancing Link

    2706: [SDOI2012]棋盘覆盖 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 77[Submit][Status] ...

  2. NYOJ 45 棋盘覆盖

    棋盘覆盖 水题,题不难,找公式难 import java.math.BigInteger; import java.util.Scanner; public class Main { public s ...

  3. 棋盘覆盖(大数阶乘,大数相除 + java)

    棋盘覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...

  4. NYOJ 45 棋盘覆盖 模拟+高精度

    题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下 ...

  5. 棋盘覆盖(一) ACM

    棋盘覆盖 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求 ...

  6. 棋盘覆盖问题(算法分析)(Java版)

    1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...

  7. CODEVS 2171 棋盘覆盖

    2171 棋盘覆盖 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少12的多米诺骨牌进行掩盖. 错误日志: 直接在模板上调整 \(maxn\) 时没有在相应邻接表数 ...

  8. 递归与分治策略之棋盘覆盖Java实现

    递归与分治策略之棋盘覆盖 一.问题描述 二.过程详解 1.棋盘如下图,其中有一特殊方格:16*16 . 2.第一个分割结果:8*8 3.第二次分割结果:4*4 4.第三次分割结果:2*2 5.第四次分 ...

  9. JavaScript编写棋盘覆盖

    一.前言 之前做了一个算法作业,叫做棋盘覆盖,本来需要用c语言来编写的,但是因为我的c语言是半桶水(哈哈),所以索性就把网上的c语言写法改成JavaScript写法,并且把它的覆盖效果显示出来 二.关 ...

随机推荐

  1. iOS 文件大小转换成 KB、MB、GB 。。。

    -(NSString *) convertFileSize:(long long)size { ; ; ; if (size >= gb) { return [NSString stringWi ...

  2. db2 Hidden columns

    When a table column is defined with the implicitly hidden attribute, that column is unavailable unle ...

  3. postgres与osm初步使用

    layout: post title: postgres与osm初步使用 date: 2016-9-20 categories: blog tags: [地图开发] description:地图开发 ...

  4. 二、JavaScript语言--事件处理--DOM事件探秘

    第一章 事件流 事件:是文档或浏览器窗口中发生的.特定的交互瞬间.JavaScript和HTML之间的交互都是通过事件来实现的. 事件流:描述的是从页面中接受事件的顺序 IE:事件冒泡流 Netsca ...

  5. AJAX 搜索自动显示练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. mysql的存储过程

    mysql5中开始引入存储过程,存储过程是一组为了完成特定功能的sql语句集,经编译后存储在数据库中. 存储过程的特点(优点): 1:减小网络通信量.调用一个行数不多的存储过程与直接高用SQL语名的网 ...

  7. CLR via C#学习笔记----知识总概括

    第1章 CLR的执行模型 托管模块的各个组成部分:PE32或PE32+头,CLR头,元数据,IL(中间语言)代码. 高级语言通常只公开了CLR的所有功能的一个子集.然而,IL汇编语言允许开发人员访问C ...

  8. 在asp.net利用jquery.MultiFile实现多文件上传(转载)

    转载地址:http://www.cnblogs.com/scy251147/archive/2010/09/30/1839313.html 官网链接:http://www.fyneworks.com/ ...

  9. [JAVA] IOException: Invalid byte 2 of 2-byte UTF-8 sequence(解决办法)

    日志打印不全,后台只打印出出标题的异常信息: 先前的日志打印信息:log.debug(e.getMessage()); 后面改成了日志打印信息:log.debug(e); log.debug(e.ge ...

  10. TensorFlow

    转自:http://blog.csdn.net/stdcoutzyx/article/details/51645396 本片博文是参考文献[1]的阅读笔记,特此声明 TensorFlow,以下简称TF ...