考场几乎想到了正解,然而我也不知道当时在想啥,在没有证伪的情况下只是觉得无法实现就否了……

最后打的好象是达哥说的O(4*15*n*m),复杂度不是很会证反正T成了暴力……


题解:

对于测试点8,9,10:bfs每个0的联通块,如果联通块边缘某累方块出现了x个,那么贡献为x*(x-1)/2。注意去掉既相邻又处于同一联通块的贡献。由于这些测试点的性质,统计出来的答案是正确的。

推广到一般情况,上面的结论不是完全适用。

考虑上面结论会错在什么地方,当两个方块同时属于多个0的联通块时会被算重,考虑容斥。(由于没有想到复杂度合适的实现方法考场止步于此)

考虑给每个0的联通块编号,为了方便起见,设相邻两个同类方块之间也有一个0联通块。

首先bfs求出每个非0点属于的0联通块,复杂度$O(nm)$。

对于每类方块,求出f1[i]表示处于i联通块的个数,f2[i][j]表示处于i,j(可以有其他)的个数,f3[][][],f4[][][][]同理。

之后就可以奇加偶减统计答案。

然而数组并开不了那么大,考虑Hash_map.

由于hash结构体并不是很好弄,于是我用了map,更容易理解,代码复杂度也更低一些。

所以下面的代码极易被卡常。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#define int LL
#define pair pair<int,int>
#define fir first
#define sec second
#define MP(a,b) make_pair(a,b)
#define LL long long
#define s1 (a.a<b.a)
#define s2 (a.b<b.b)
#define s3 (a.c<b.c)
#define s4 (a.d<b.d)
#define s5 (a.s<b.s)
#define d1 (a.a==b.a)
#define d2 (a.b==b.b)
#define d3 (a.c==b.c)
#define d4 (a.d==b.d)
#define d5 (a.s==b.s)
using namespace std;
struct node1{int a,s;friend bool operator < (node1 a,node1 b){return d1?s5:s1;}};
struct node2{int a,b,s;friend bool operator < (node2 a,node2 b){return d1?(d2?s5:s2):s1;}};
struct node3{int a,b,c,s;friend bool operator < (node3 a,node3 b){return d1?(d2?(d3?s5:s3):s2):s1;}};
struct node4{int a,b,c,d,s;friend bool operator < (node4 a,node4 b){return d1?(d2?(d3?(d4?s5:s4):s3):s2):s1;}};
map<node1,int>mp1;
map<node2,int>mp2;
map<node3,int>mp3;
map<node4,int>mp4;
int n,m,k,mp[1010][1010];
int bel[1010][1010],cnt;
int t[1000010];
bool v[1010][1010];
int ix[5]={0,1,-1,0, 0};
int iy[5]={0,0, 0,1,-1};
vector<int> be[1010][1010]; bool is(int x,int y,int sor){return x>0&&x<=n&&y>0&&y<=m&&mp[x][y]==sor;}
bool ok(int x,int y){return x>0&&x<=n&&y>0&&y<=m&&mp[x][y]==0;}
void bfs(int nx,int ny)
{
bel[nx][ny]=cnt;
queue<pair >q;q.push(MP(nx,ny));
while(!q.empty())
{
int x=q.front().fir,y=q.front().sec;q.pop();
for(int i=1;i<=4;i++)
{
int tx=x+ix[i],ty=y+iy[i];
if(ok(tx,ty)&&!bel[tx][ty])q.push(MP(tx,ty)),bel[tx][ty]=cnt;
else if(tx>0&&tx<=n&&ty>0&&ty<=m&&mp[tx][ty])be[tx][ty].push_back(cnt);
}
}
}
signed main()
{
// freopen("ex_link3.in","r",stdin);
// freopen("in.txt","r",stdin);
// freopen("1.out","w",stdout); cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j]; for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!mp[i][j]&&!bel[i][j])++cnt,bfs(i,j);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(mp[i][j]&&is(i+1,j,mp[i][j]))be[i][j].push_back(++cnt),be[i+1][j].push_back(cnt);
if(mp[i][j]&&is(i,j+1,mp[i][j]))be[i][j].push_back(++cnt),be[i][j+1].push_back(cnt);
} for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
sort(be[i][j].begin(),be[i][j].end());
int t=unique(be[i][j].begin(),be[i][j].end())-be[i][j].begin();
while(be[i][j].size()>t)be[i][j].pop_back();
} for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(mp[i][j])
{
sort(be[i][j].begin(),be[i][j].end());int siz=be[i][j].size();
if(siz>=1){for(int k=0;k<siz;k++)mp1[(node1){be[i][j][k],mp[i][j]}]++;}
if(siz>=2){for(int k=0;k<siz;k++)for(int l=k+1;l<siz;l++)mp2[(node2){be[i][j][k],be[i][j][l],mp[i][j]}]++;}
if(siz>=3){for(int k=0;k<siz;k++)for(int l=k+1;l<siz;l++)for(int r=l+1;r<siz;r++)
mp3[(node3){be[i][j][k],be[i][j][l],be[i][j][r],mp[i][j]}]++;}
if(siz>=4){mp4[(node4){be[i][j][0],be[i][j][1],be[i][j][2],be[i][j][3],mp[i][j]}]++;}
}
map<node1,int>::iterator it1;
map<node2,int>::iterator it2;
map<node3,int>::iterator it3;
map<node4,int>::iterator it4;
LL ans=0;
for(it1=mp1.begin();it1!=mp1.end();it1++)ans+=it1->second*(it1->second-1)/2;
for(it2=mp2.begin();it2!=mp2.end();it2++)ans-=it2->second*(it2->second-1)/2;
for(it3=mp3.begin();it3!=mp3.end();it3++)ans+=it3->second*(it3->second-1)/2;
for(it4=mp4.begin();it4!=mp4.end();it4++)ans-=it4->second*(it4->second-1)/2;
printf("%lld\n",ans);
}

HZOJ 连连看的更多相关文章

  1. 传智播客--XAML布局--连连看界面(小白内容)

    一个简单的10*10连连看,有100个格子,可以在XAML里面用ColumnDefinition和RowDefinition各写10组,但是这样效率会很慢,因此,可以采用动态生成的方式进行. publ ...

  2. 连连看游戏(dfs)【华为上机题目】

    1 连连看游戏 今天同学给我做了道编程题目,貌似是华为的,题目描述大概是这样的: 给定一个连连看棋盘,棋盘上每个点都有各种图案(用非0数字表示),输入棋盘上的任意两个左标,判断这两个坐标对应的图案是否 ...

  3. mfc 连连看3.2 修改器

    内涵图 连连看3.2下载

  4. JavaScript写一个连连看的游戏

    天天看到别人玩连连看, 表示没有认真玩过, 不就把两个一样的图片连接在一起么, 我自己写一个都可以呢. 使用Javascript写了一个, 托管到github, 在线DEMO地址查看:打开 最终的效果 ...

  5. 连连看[HDU1175]

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. Android 绿豆蛙版连连看(简陋版)

    (里面有六张绿豆蛙的图片) 1.选中会有红色框 2.可以直线连(横竖相邻或是横竖间隔空格) 3.可以拐一次弯连接 4.可以拐两次弯连接 5.连接时会有线显示 6.绿色代表进度条,蓝色代表时间条 imp ...

  7. HDU 1175 连连看

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  8. 连连看的设计与实现——四人小组项目(GUI)

    项目GUI界面经过简单设计,整理如下:(图片截取致宠物连连看3.1) 点开游戏后界面显示: 点击菜单游戏—>初级 后显示 -------------------------- > 当游戏时 ...

  9. 连连看的设计与实现——四人小组项目(NABCD)

    小组名称:天天向上 成员:王森.张政,张金生,栾骄阳 题目:连连看游戏 NABCD N(需求) 游戏最大的乐趣在于玩法,我们要想在众多的连连看游戏当中脱颖而出,就需要增加更多富有乐趣.吸引用户的玩法. ...

随机推荐

  1. 字符串匹配算法之kmp算法

    kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...

  2. 跟我一起了解koa(二)

    koa中路由动态传值 1.路由 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET.POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问. 通俗的 ...

  3. LUOGU P1414 又是毕业季II

    题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业 ...

  4. bootstrap-datetimepicker下ie8对indexOf的支持问题

    问题: 由于ie8不支持indexOf这个方法,所以在引入bootstrap-datetimepicker.js的时候js会抛出错误. 解决: // 在bootstrap-datetimepicker ...

  5. dp入门 hdu2059 龟兔赛跑

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. jnhs中国省市县区mysql数据表不带gps坐标

    1.查省 SELECT * FROM china WHERE china.Pid=0 2.查市 SELECT * FROM chinaWHERE china.Pid=330000 3.查区 SELEC ...

  7. fedora python访问mysql

    1 下载驱动库 http://sourceforge.net/projects/mysql-python/ 2, yum install mysql-dev* yum install python-d ...

  8. MyBatis小问题-Mapper中错误No constructor found...

    前两天又被公司叫去修改其他产品的一些问题了,没有看java相关的,今天周六,看了看MyBatis东西. 就是简单的在MySql中建了个users表,很简单,包含id,name,age,写了个bean. ...

  9. python基础--反射、元类、单例设计模式

    反射:reflect,反射指的是一个对象应该具备可以检测.修改.增加自身属性的能力,反射就是通过字符串操作属性 hasattr(对象,带查询的属性名称) 判断某个对象中是否存在某个属性 getattr ...

  10. pytorch 常用问题解决

    1.RuntimeError: cuda runtime erorr (77): an illegal memory access was encountered at 在使用命令前面加上CUDA_L ...