jzoj6404. 【NOIP2019模拟11.04】B
题目描述
Description

Input
从文件b.in中读入数据. 第丬行三个正整数 n, m, K. 接下来 n 行每行 m 个正整数, 表示矩阵A.
Output
输出到文件b.out中. 不行, 两个数分别表示机大值和和.
Sample Input
3 5 2
1 5 3 3 3
4 1 3 3 4
4 2 4 4 3
Sample Output
4 20
Data Constraint

题解
从左往右扫,维护一个宽为K的区域
对于一个位置(i,j),求出bz[i][j]表示(i,j+1)~(i,j+K)之中是否有a[i][j]
那么在求以每个点为左上角时,区域内的点的纵坐标不会影响到结果
所以维护每种权值出现的行,0-->1就直接加,1-->0就是在删掉一个bz[i][j]=0的值时
只需要在删/加的时候求出一种值上的一个位置的前/后继
可以线段树,也可以用bitset的_Find_next()
然而NOIP应该不能用
所以显然手写bitset(
code
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define change(T,t) b[T][(t)/64]^=p[(t)%64]
#define pd(T,t) (b[T][(t)/64]&p[(t)%64])
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define low(x) ((x)&-(x))
#define Len 100000
using namespace std;
unsigned long long p[64];
int a[3001][3001];
int f[3002][3001];
bool bz[3001][3001];
int num[100001];
unsigned long long b[200001][47];
char st[72000001];
char *Ch=st;
int N,n,m,K,i,j,k,l;
long long ans1,ans2;
int getint()
{
int x=0;
while (*Ch<'0' || *Ch>'9') *++Ch;
while (*Ch>='0' && *Ch<='9') x=x*10+(*Ch-'0'),*++Ch;
return x;
}
int find(int T,int t)
{
int i,j,s=t/64;t%=64;
unsigned long long S=b[T][s];
if (t<63)
S>>=t+1;
else
S=0;
if (S)
return floor(log2(low(S))+0.1)+64*s+t+1;
fo(i,s+1,N)
if (b[T][i])
return floor(log2(low(b[T][i]))+0.1)+64*i;
return -1;
}
void add(int I,int i,int j,int s)
{
int k,l,L,R;
change(a[i][j],i);
change(a[i][j]+Len,n-i+1);
k=find(a[i][j]+Len,n-i+1);if (k!=-1) k=n-k+1;
l=find(a[i][j],i);
L=max(i-K+1,1);
R=i;
if (k!=-1) L=max(L,k+1);
if (l!=-1) R=min(R,l-K);
if (L<=R)
f[L][I]+=s,f[R+1][I]-=s;
}
int main()
{
// freopen("b53.in","r",stdin);
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
fread(st,1,72000001,stdin);
p[0]=1;
fo(i,1,63)
p[i]=p[i-1]<<1;
n=getint(),m=getint(),K=getint();N=n/64;
fo(i,1,n)
{
fo(j,1,m)
a[i][j]=getint();
}
memset(num,127,sizeof(num));
fo(i,1,n)
{
fd(j,m,1)
{
bz[i][j]=(num[a[i][j]]-j)<=K;
num[a[i][j]]=j;
}
fo(j,1,m)
num[a[i][j]]=2133333333;
}
fo(j,1,K)
{
fo(i,1,n)
if (!pd(a[i][j],i))
add(1,i,j,1);
}
fo(j,2,m-K+1)
{
fo(i,1,n)
f[i][j]=f[i][j-1];
fo(i,1,n)
{
if (!pd(a[i][j+K-1],i))
add(j,i,j+K-1,1);
if (!bz[i][j-1])
add(j,i,j-1,-1);
}
}
fo(i,1,n-K+1)
{
fo(j,1,m-K+1)
{
f[i][j]+=f[i-1][j];
ans1=max(ans1,f[i][j]);
ans2+=f[i][j];
}
}
printf("%lld %lld\n",ans1,ans2);
fclose(stdin);
fclose(stdout);
return 0;
}
jzoj6404. 【NOIP2019模拟11.04】B的更多相关文章
- 6423. 【NOIP2019模拟11.11】画
题目描述 Description Input Output Sample Input 3 2 3 3 6 5 1 2 1 3 Sample Output 15 Data Constraint 题解 迫 ...
- 6407. 【NOIP2019模拟11.05】小 D 与随机
题目描述 Description Input 第一行两个个整数 n,k. 之后 n -1 行,第 i 行两个整数 ui, vi, 表示一条树边. 保证输入的数据构成一棵树. Output 一行一个数表 ...
- 6402. 【NOIP2019模拟11.01】Cover(启发式合并)
题目描述 Description 小 A 现在想用
- 6411. 【NOIP2019模拟11.06】上网
题目描述 Description Input Output 若无解,则输出"Impossible". 否则第一行输出"Possible",第二行输出 n 个正整 ...
- 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)
题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ...
- 【NOIP2019模拟11.01】Game(贪心+线段树)
Description: 小 A 和小 B 在玩一个游戏,他们两个人每人有
- How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)
How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新) 重要通知: 最近开题报告已差不多告一段落, ...
- 安装qt5.3.2后,qtcreator在ubuntu 11.04无法启动的问题
在官方网站下载.run文件安装后,qtcreator启动失败,然后找到命令行启动,失败原因如下: shr@shr-Sieyuan:~/Qt5.3.2/Tools/QtCreator/bin$ ./qt ...
- ubuntu 11.04 源 更新不了,全显示ign、404
原文地址:http://blog.csdn.net/enjio/article/details/11603373 ubuntu 11.04 源 更新不了 分类: 开发相关2013-09-12 14 ...
随机推荐
- Jmeter接口测试系列之判断测试结果
在使用jmeter进行接口测试时,我们需要根据测试用例判断其测试结果是否一致,判断其执行是否成功. 在jmeter中也可以使用响应断言去判断,但是有时我们需要根据不同的用例,其判断条件不同,所以这里我 ...
- MySQL学习-入门语句以及增删查改
1. SQL入门语句 SQL,指结构化查询语言,全称是 Structured Query Language,是一种 ANSI(American National Standards Institute ...
- 【HBase】五、HBase的Java接口
HBase是Hadoop中的一个重要组件,自然也是基于Java语言开发的,因此HBase有很好的Java接口供程序员调用,通过一个例子来演示java如何使用HBase数据库. 要想在HBase ...
- finereport连接mysql8.0的解决办法
1.具体连接操作 首先将mysql-connector-java-8.0以上的jar包放到FindReport安装目录下的webapps下的WEB-INF下的lib下. 打开finereport,找到 ...
- sql query执行的顺序
第一, from, 选择或者join多个表得到基础数据表,所以,联结是第一步要执行的操作,它在获取最基础的数据表: 第二,where,过滤掉基础数据表中不符合条件的行,得到后续操作的数据表: 第三, ...
- urllib基本库的使用
get方法的学习 1import urllib.request 2import ssl 3#设置全局证书 4ssl._create_default_https_context = ssl._creat ...
- 《剑指offer》面试题25 二叉树中和为某一值的路径 Java版
(判断是否有从根到叶子节点的路径,其和为给定值.记录这些路径.) 我的方法:这道题我是按照回溯的思路去做的,我们需要一个数据结构来保存和删除当前递归函数中添加的值.这里要打印一条路径,我们可以选择Li ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- jquery导航栏高亮(二级菜单点击一级保持高亮)
<script type="text/javascript"> var urlstr = location.href; var urlstatus=false; $(& ...
- Mysql中explain作用详解
一.MYSQL的索引 1.索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构.2.索引的作用:便于查询和排序(所以添 ...