题目大意

给你一个只有0,1,2的n*n的矩阵,你现在可以选择一个叉叉或者十字,把里面的数全部取掉,贡献为取掉的数的乘积。
具体的,从某一点(i,j)出发,选择一个长度c:
你可以这样取(1为取,0为不取)
00100
00100
11111
00100
00100
或者这样取
10001
01010
00100
01010
10001
n<=1000

分析

很简单的思路,弄两种,共4个前缀和数组,维护两个对角线的前缀和,还有一行一列的前缀和,然后枚举以哪个点作为中心。然后怎么确定这个点怎么取呢?我们知道如果要取,在取不到0时,肯定c越大越好;取到0就没有意义了。所以两种取法,分别二分长度,看看最大的c是多少,用log比较大小,更新答案即可。
其实原来我还怕精度不够,想直接弄double比较,然而精度其实差不多,而且double只有301位,即 21000 2^{1000},如果全是3的话早爆了。
这道题比较麻烦的地方是对角线前缀和数组,要码得快必须要先规定好表示法,然后再打,这样才能思路清晰,不至于打得慢。
其实这题最好用直角坐标系,然后直接设数组bx[i][j]表示y=±x+i这条直线,会比较好做。
然而我没有转成坐标系,直接bx[i][j]表示起点为(i,1),到(i+j-1,j)的前缀和。另一条对角线类似,以(i,n)为起点,为了储存地址都是正数,还要整体移n。

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double db;
#define fo(i,j,k) for(i=j;i<=k;i++)
#define fd(i,j,k) for(i=j;i>=k;i--)
const int N=2005;
const ll mo=1e9+7;
struct rec
{int c[4];
}ax[N][N],ay[N][N],bx[N][N],by[N][N],ret,ans;
int i,j,k,n,m,l,r,mid,a[N][N],xx,x,y,mn,z,prt;
db two[N];
char ch;
rec ins(rec a,int z)
{a.c[z]++;return a;
}
bool operator <(rec a,rec b)
{if (a.c[0]) return 1;if (b.c[0]) return 0;db aa,bb;aa=log(2)*(db)a.c[2]+log(3)*(db)a.c[3];bb=log(2)*(db)b.c[2]+log(3)*(db)b.c[3];return aa<bb;
}
rec operator +(rec a,rec b)
{a.c[0]=a.c[0]+b.c[0];a.c[1]=a.c[1]+b.c[1];a.c[2]=a.c[2]+b.c[2];a.c[3]=a.c[3]+b.c[3];return a;
}
rec operator -(rec a,rec b)
{a.c[0]=a.c[0]-b.c[0];a.c[1]=a.c[1]-b.c[1];a.c[2]=a.c[2]-b.c[2];a.c[3]=a.c[3]-b.c[3];return a;
}
void get1(int x)
{ret=ax[i][j+x]-ax[i][j-x-1]+ay[j][i+x]-ay[j][i-x-1];
}
void get2(int x)
{int y=n-j+1;ret=bx[i-j+n+1][j+x]-bx[i-j+n+1][j-x-1]+by[i+j][y+x]-by[i+j][y-x-1];
}
int main()
{
//  freopen("677.in","r",stdin);scanf("%d\n",&n);fo(i,1,n) {fo(j,1,n){scanf("%c",&ch);a[i][j]=ch-'0';}scanf("\n");}ans.c[0]=1;fo(i,1,n)fo(j,1,n){ax[i][j]=ins(ax[i][j-1],a[i][j]);ay[j][i]=ins(ay[j][i-1],a[i][j]);}fo(xx,-n+2,n){i=xx+n;x=xx;z=n;fo(y,1,n){if (x>0){bx[i][y]=ins(bx[i][y-1],a[x][y]);by[i][y]=ins(by[i][y-1],a[x][z]);}x++;z--;}}fo(i,1,n)fo(j,1,n)if (a[i][j]){// non-rotatedmn=min(min(i-1,n-i),min(j-1,n-j));l=0;r=mn;while (l<r){mid=(l+r+1)/2;get1(mid);if (ret.c[0]==0) l=mid;else r=mid-1;}get1(l);ret.c[a[i][j]]--;if (ans<ret)ans=ret;//rotatedl=0;r=mn;while (l<r){mid=(l+r+1)/2;get2(mid);if (ret.c[0]==0) l=mid;else r=mid-1;}get2(l);ret.c[a[i][j]]--;if (ans<ret)ans=ret;}prt=1;fo(i,0,3)fo(j,1,ans.c[i])prt=(ll)prt*i%mo;printf("%d\n",prt);
}

[CF677E] Vanya and Balloons相关推荐

  1. Codeforces Round #355 (Div. 2) B. Vanya and Food Processor 水题

    B. Vanya and Food Processor 题目连接: http://www.codeforces.com/contest/677/problem/B Description Vanya ...

  2. 452 Minimum Number of Arrows to Burst Balloons

    452 Minimum Number of Arrows to Burst Balloons 文章目录 452 Minimum Number of Arrows to Burst Balloons 1 ...

  3. sdut 2152:Balloons(第一届山东省省赛原题,DFS搜索)

    Balloons Time Limit: 1000MS Memory limit: 65536K 题目描述 Both Saya and Kudo like balloons. One day, the ...

  4. UVA 2474 - Balloons in a Box 爆搜

    2474 - Balloons in a Box 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...

  5. C. Vanya and Scales

    C. Vanya and Scales time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. codeforces C. Vanya and Scales

    C. Vanya and Scales Vanya has a scales for weighing loads and weights of masses w0, w1, w2, ..., w10 ...

  7. 打破气球所能获得的最大积分 Burst Balloons

    2019独角兽企业重金招聘Python工程师标准>>> 问题: Given n balloons, indexed from 0 to n-1. Each balloon is pa ...

  8. codeforce 780C Andryusha and Colored Balloons

    C. Andryusha and Colored Balloons Andryusha goes through a park each day. The squares and paths betw ...

  9. UVA10934 Dropping water balloons【DP】

    It's frosh week, and this year your friends have decided that they would initiate the new computer s ...

最新文章

  1. docker 厂商 容器_中国容器厂商综合实力排名,新鲜出炉!
  2. 集合框架源码学习之HashMap(JDK1.8)
  3. java 设置系统参数_Java如何设置系统参数和运行参数
  4. PyTorch框架学习一——PyTorch的安装(CPU版本)
  5. HBase编程 API入门系列之HTable pool(6)
  6. tornado异步请求响应速度的实例测试
  7. 数据分析,如何构建指标体系
  8. mysql单库tps_简单计算mysql 的QPS,TPS
  9. CCF NOI1139 高精度减法
  10. tensorflow学习之常用函数总结:tensorflow.argmax()函数
  11. 【大数据部落】R语言RFM模型在电商行业的应用
  12. Spring揭秘-笔记
  13. 关于Vmware workstation的软驱功能
  14. 小程序滑动窗口的实现,固定第一列和第一行
  15. MTK 平台TP 驱动
  16. 明源售楼系统技术解析(四)右键菜单
  17. 华硕笔记本安装Ubuntu20.04
  18. 东华考研复试21-30oj
  19. 2020年度国产数据库:openGauss
  20. 盘点中国未来最具潜力的IT培训学校前5名

热门文章

  1. 电视连接后显示服务器异常,电视老显示链接服务器异常
  2. 百度下架PLATO了
  3. Solidity语言学习笔记————20、函数修饰符
  4. 非法侵入个人计算机系统构成,非法侵入计算机系统罪的法律规定、犯罪构成、追诉标准、量刑标准方面-广州刑事辩护律师...
  5. java在底图上生成二维码以及文字
  6. ORB_SLAM2 源码解析 单目初始化器Initializer(三)
  7. 干货 | Elasticsearch 数据建模指南
  8. seetaface6JNI ,windows和linux环境自适应,支持GPU
  9. SQL 去掉字符串中的字母,数字和符号
  10. 基于JAVA百分百教育集团教务管理系统设计计算机毕业设计源码+系统+lw文档+部署