[CF677E] Vanya and Balloons
题目大意
给你一个只有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相关推荐
- 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 ...
- 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 ...
- sdut 2152:Balloons(第一届山东省省赛原题,DFS搜索)
Balloons Time Limit: 1000MS Memory limit: 65536K 题目描述 Both Saya and Kudo like balloons. One day, the ...
- UVA 2474 - Balloons in a Box 爆搜
2474 - Balloons in a Box 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...
- C. Vanya and Scales
C. Vanya and Scales time limit per test 1 second memory limit per test 256 megabytes input standard ...
- codeforces C. Vanya and Scales
C. Vanya and Scales Vanya has a scales for weighing loads and weights of masses w0, w1, w2, ..., w10 ...
- 打破气球所能获得的最大积分 Burst Balloons
2019独角兽企业重金招聘Python工程师标准>>> 问题: Given n balloons, indexed from 0 to n-1. Each balloon is pa ...
- codeforce 780C Andryusha and Colored Balloons
C. Andryusha and Colored Balloons Andryusha goes through a park each day. The squares and paths betw ...
- UVA10934 Dropping water balloons【DP】
It's frosh week, and this year your friends have decided that they would initiate the new computer s ...
最新文章
- docker 厂商 容器_中国容器厂商综合实力排名,新鲜出炉!
- 集合框架源码学习之HashMap(JDK1.8)
- java 设置系统参数_Java如何设置系统参数和运行参数
- PyTorch框架学习一——PyTorch的安装(CPU版本)
- HBase编程 API入门系列之HTable pool(6)
- tornado异步请求响应速度的实例测试
- 数据分析,如何构建指标体系
- mysql单库tps_简单计算mysql 的QPS,TPS
- CCF NOI1139 高精度减法
- tensorflow学习之常用函数总结:tensorflow.argmax()函数
- 【大数据部落】R语言RFM模型在电商行业的应用
- Spring揭秘-笔记
- 关于Vmware workstation的软驱功能
- 小程序滑动窗口的实现,固定第一列和第一行
- MTK 平台TP 驱动
- 明源售楼系统技术解析(四)右键菜单
- 华硕笔记本安装Ubuntu20.04
- 东华考研复试21-30oj
- 2020年度国产数据库:openGauss
- 盘点中国未来最具潜力的IT培训学校前5名
热门文章
- 电视连接后显示服务器异常,电视老显示链接服务器异常
- 百度下架PLATO了
- Solidity语言学习笔记————20、函数修饰符
- 非法侵入个人计算机系统构成,非法侵入计算机系统罪的法律规定、犯罪构成、追诉标准、量刑标准方面-广州刑事辩护律师...
- java在底图上生成二维码以及文字
- ORB_SLAM2 源码解析 单目初始化器Initializer(三)
- 干货 | Elasticsearch 数据建模指南
- seetaface6JNI ,windows和linux环境自适应,支持GPU
- SQL 去掉字符串中的字母,数字和符号
- 基于JAVA百分百教育集团教务管理系统设计计算机毕业设计源码+系统+lw文档+部署