bzoj 1414: [ZJOI2009]对称的正方形 manacher算法+單調隊列
1414: [ZJOI2009]对称的正方形
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 331 Solved: 149
[Submit][Status]
Description
Input
Output
Sample Input
4 2 4 4 4
3 1 4 4 3
3 5 3 3 3
3 1 5 3 3
4 2 1 2 4
Sample Output
数据范围
对于30%的数据 n,m≤100
对于100%的数据 n,m≤1000 ,矩阵中的数的大小≤109
- manacher算法中忘記更行mx,id變量,導致其退化成O(n^2),在這個問題調試的時候我確信了manacher算法複雜度是嚴格O(n)的。
- 單調隊列中兩相鄰元素所夾區間應屬於後面一個元素。
- 這樣得題數組大小一定要準確,如果所有下標範圍都開大一倍一定會MLE
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 2100
#define MAXV MAXN*2
#define MAXE MAXV*2
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
typedef long long qword;
inline int nextInt()
{
char ch;
int x=;
bool flag=false;
do
ch=(char)getchar(),flag=(ch=='-')?true:flag;
while(ch<''||ch>'');
do x=x*+ch-'';
while (ch=(char)getchar(),ch<='' && ch>='');
return x*(flag?-:);
} int n,m;
typedef int arr_t[MAXN];
typedef int arr2[MAXN*];
typedef arr_t map_t[MAXN];
map_t a,b;
map_t sa,sb,tsb,tsa; void manacher(arr2 seq,int n,arr2 &res)
{
int id,mx;
int i,j;
id=mx=-;
int cnt=;
for (i=;i<n;i++)
{
if (i<mx)
{
res[i]=min(mx-i,res[id*-i]);
}else res[i]=;
while (i-res[i]->= && i+res[i]+<n && seq[i+res[i]+]==seq[i-res[i]-])
{
res[i]++;
//cnt++;
}
if (i+res[i]>mx)//Do not forget
{
mx=i+res[i];
id=i;
}
}
return ;
}
void init_p(map_t mp,int n,int m,map_t &sl)
{
int i,j;
arr2 seq,res;
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
seq[j*+]=mp[i][j];
seq[j*]=-INF;
}
seq[*m]=-INF;
manacher(seq,*m+,res);
for (j=;j<m;j++)
{
sl[i][j]=res[j*+];
}
}
}
int pseq[MAXN];
int head,tail;
map_t fa,fb,fc;
void pm(map_t &a)
{
int i,j;
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
} void work(map_t &sa,map_t &sb,map_t &fa,int n,int m)
{
int i,j;
for (i=;i<n;i++)
for (j=;j<m/;j++)
{
swap(sb[i][j],sb[i][m-j-]);
swap(sa[i][j],sa[i][m-j-]);
}
for (i=;i<n;i++)
{
head=,tail=;
pseq[]=-;
pseq[]=;
fa[i][m-]=;
for (j=;j<m;j++)
{
while (tail>=head && sb[i][j]<sb[i][pseq[tail]])tail--;
pseq[++tail]=j;
int l,r,mid;
l=-,r=tail;
while (l+<r)
{
int mid=(l+r)>>;
if (sb[i][pseq[mid]]>=j-pseq[mid])
r=mid;
else
l=mid;
}
fa[i][m-j-]=min(j-(pseq[l]+),min(sa[i][j],sb[i][pseq[r]]));
}
}
for (i=;i<n;i++)
for (j=;j<m/;j++)
{
swap(sb[i][j],sb[i][m-j-]);
swap(sa[i][j],sa[i][m-j-]);
} for (i=;i<n;i++)
{
head=,tail=;
pseq[]=-;
pseq[]=;
fa[i][]=;
for (j=;j<m;j++)
{
while (tail>=head && sb[i][j]<sb[i][pseq[tail]])tail--;
pseq[++tail]=j;
int l,r,mid;
l=-,r=tail;
while (l+<r)
{
int mid=(l+r)>>;
if (sb[i][pseq[mid]]>=j-pseq[mid])
r=mid;
else
l=mid;
}
fa[i][j]=min(fa[i][j],min(j-(pseq[l]+),min(sa[i][j],sb[i][pseq[r]])));
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int i,j,k;
int x,y,z;
int ans=;
scanf("%d%d",&n,&m);
memset(a,INF,sizeof(a));
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
scanf("%d",&x);
a[i*+][j*+]=x;
b[j*+][i*+]=x;
}
}
n*=;m*=;n++;m++;
init_p(a,n,m,sa);
init_p(b,m,n,tsb);
for (i=;i<n;i++)
for (j=;j<m;j++)
sb[i][j]=tsb[j][i];
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
sa[i][j]/=;
sb[i][j]/=;
}
} work(sa,sb,fa,n,m); for (i=;i<n;i++)
for (j=;j<m;j++)
tsa[i][j]=a[i][j];
for (i=;i<n;i++)
for (j=;j<m;j++)
b[i][m-j-]=a[m-j-][i]=tsa[i][j];
swap(n,m);
init_p(a,n,m,sa);
init_p(b,m,n,tsb); for (i=;i<n;i++)
for (j=;j<m;j++)
sb[i][j]=tsb[j][i];
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
sa[i][j]/=;
sb[i][j]/=;
}
}
work(sa,sb,fb,n,m);
for (i=;i<n;i++)
for (j=;j<m;j++)
tsb[i][j]=fb[i][j];
swap(n,m);
for (i=;i<n;i++)
for (j=;j<m;j++)
fb[i][j]=tsb[m-j-][i]; //pm(fa);
//pm(fb);
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
fc[i][j]=max(,min(fa[i][j]-(i%==),fb[i][j]-(j%==)));
fc[i][j]=(fc[i][j]+)/;
}
}
//pm(fc);
for (i=;i<n;i++)
{
for (j=;j<m;j++)
{
if (i%+j%==)continue;
ans+=fc[i][j];
}
}
cout<<ans<<endl; }
bzoj 1414: [ZJOI2009]对称的正方形 manacher算法+單調隊列的更多相关文章
- bzoj 1414: [ZJOI2009]对称的正方形
Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...
- 【bzoj 1414】对称的正方形 单调队列+manacher
Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...
- 【BZOJ1414】[ZJOI2009]对称的正方形(哈希)
[BZOJ1414][ZJOI2009]对称的正方形(哈希) 题面 BZOJ 洛谷 题解 深思熟虑一波,发现一个矩阵如果左右对称的话,那么它每行都是一个回文串,同理,如果上下对称的话,那么每列都是一个 ...
- 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash
[BZOJ1414/3705][ZJOI2009]对称的正方形 Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们 ...
- BZOJ 2342 双倍回文(manacher算法)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2342 题意:定义双倍回文串为:串的长度为4的倍数且串的前一半.后一半.串本身均是回文的. ...
- [luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)
传送门 很蒙蔽,不知道怎么搞. 网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学. 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二 ...
- 题解-------[ZJOI2009]对称的正方形
传送门 题目大意 找到所有的上下左右都相同的正方形. 思路:二分+二维Hash 这道题我们首先想到不能暴力判断一个正方形是否合法. 然后我们发现当一个正方形合法时,以这个正方形为中心且比它小的正方形也 ...
- manacher算法学习(求最长回文子串长度)
Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...
- 【学习笔记】Manacher算法
本文部分图片来源 代码来源(代码是学姐哒.. 一.引入 Manacher算法是用来求最长回文子串的算法,时间复杂度O(n). 回文子串指的是''aacaa'',''noon'',这种正着反着读都一样的 ...
随机推荐
- window下手动搭建 PHP+Nginx+Mysql(转)
首先还是下载 nginx: http://nginx.org/en/download.html php : http://windows.php.net/download/ mysql: ht ...
- 异步DNS解析的实现
在高性能爬虫为什么使用定制DNS客户端一文中阐述了DNS解析是网络爬虫的瓶颈. 目前主要有两种方法来提高DNS解析效率: 1. 基于多线程的DNS 解析 2. 基于NIO的DNS解析 dnsjava中 ...
- Android开发之ContentProvider(内容提供者)
1. ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问 ...
- Java基础知识强化之IO流笔记24:FileInputStream / FileOutputStream 复制文本文件案例2
1. 需求:把d盘下的a.txt的内容复制到f盘下的b.txt中: 代码示例: package com.himi.filecopy; import java.io.FileInputStream; i ...
- IIS Shared Configuration
Introduction The Internet changes the ways in which companies handle their day-to-day business and h ...
- Oracle中not exists 与not in 的使用情况
1.在oracle11g以上版本,oracle已经做了优化,能够自动将in优化成exists方式,因此oracle11g以上版本,使用in和exists效果是一样的. 2.在oracle中,使用not ...
- 用标准版的Eclipse搭建PHP环境
用标准版的Eclipse搭建PHP环境 ——@梁WP 摘要:用标准版的Eclipse搭建PHP环境. 一.下载Eclipse的PHP插件 百度搜索phpeclipse,看到某条结果是带有SourceF ...
- pc机安装centos6.5,提示sda必须有一个GPT磁盘标签处理
1.在进入安装界面,也就出现图形界面时,对它命令首先创建gpt --按ctrl+alt+f2的组合键,然后进入命令行 --进行如下操作输入parted输入mklabel gpt /dev/sda在提示 ...
- C# DbHelperSQLite,SQLite数据库帮助类 (转载)
主要功能如下数据访问抽象基础类 主要是访问SQLite数据库主要实现如下功能 .数据访问基础类(基于SQLite),主要是用来访问SQLite数据库的. .得到最大值:是否存在:是否存在(基于SQLi ...
- c#中var关键字用法
Technorati 标签: C# 转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6175533 var关键字是C# 3.0开始新 ...