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'',这种正着反着读都一样的 ...
随机推荐
- 经典SQL语句大全之基本函数
SQL Server基本函数 1.字符串函数 长度与分析用 1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格2,substring(expression,sta ...
- 使用lua给wireshark编写uTP的Dissector
lonelycastle做uTP的实验,使用wireshark捕包,但是最初没有找到wireshark下的uTP的dissector,每次都需要比对文档,这样做实验理解报文含义,效率非常低.作为程 ...
- PureMVC(JS版)源码解析(十):Controller类
这篇博客我们继续讲解PureMVC的三大核心类(View/Controller/Model)——Controller类.根据PureMVC模块设计,Controller类保存所有的Comm ...
- javascript常用方法(慢慢整理)
获取类型:[object object],[object function],[object Undefined]等 Object.prototype.toString.apply(obj); 获取对 ...
- Binding 中 Elementname,Source,RelativeSource 三种绑定的方式
在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...
- 我的插件のinput文本框实现宽度自适应
先来最后结果:DEMO 介绍一下如何让一个文本框的宽度能够随着文本框中的内容的宽度增长而增长,也就是能够实现宽度自适应效果. 代码实例如下: <!DOCTYPE html> <htm ...
- javascript 【js‘s word】
http://mp.weixin.qq.com/s?__biz=MjM5MzY2NDY0Ng==&mid=214013689&idx=1&sn=21e03f6c7bf73893 ...
- (转)META http-equiv="refresh" 实现网页自动跳转
***.html自动跳转文件代码如下: <HTML> <HEAD><META http-equiv="Refresh" content="5 ...
- 使用Delphi读取网络上的文本文件,html文件
使用Delphi读取网络上的txt和html文件 可以使用两种方法: 1.下载文件,然后进行读取 下载文件的Delphi代码可以参考: http://www.delphibbs.com/delphib ...
- Oracle计算时间函数(numtodsinterval、numtoyminterval)
numtodsinterval(<x>,<c>) ,x是一个数字,c是一个字符串,表明x的单位,这个函数把x转为interval day to second数据类型 常用的单位 ...