Description

给定一个n行m列的矩阵,请对于每个长宽均为k的连续子正方形,统计里面出现过的数值的种类数。

Input

第一行包含三个正整数n,m,k(n,m<=3000,k<=min(n,m))。
接下来n行,每行m个正整数a[i][j](1<=a[i][j]<=100000),表示矩阵中每个位置的数值。

Output

输出一行两个整数M和S。
设f(i,j)表示以(i,j)为左上角的正方形内出现过的数值的种类数,则M表示f的最大值,S表示f的总和。

对每种颜色分别算贡献,一个点对一个边长k的正方形内每个位置贡献1,但同色贡献只算一次,这是一个正方形求并问题。考虑扫描线,由于边长固定,每个正方形进入和离开扫描线时,至多改变扫描线一个区间的状态,求这个区间的端点,则需要在扫描线上查前趋后继,可以用线段树维护。

#include<bits/stdc++.h>
typedef unsigned int u32;
const u32 A=-;
const int N=1e5+,M=;
char ib[M*M*],*ip=ib;
inline int _(){
int x=;
while(*ip<)++ip;
while(*ip>)x=x*+*ip++-;
return x;
}
u32 bs[M][][M/+],t0[N][],t1[N][M/+];
int n,m,k,mx,a[M][M],s[M][M],pv[N];
long long sum;
inline void _xor(u32*a,int x){a[x>>]^=<<x;}
inline int _get(u32*a,int x){return a[x>>]>>x&;}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
#define ctz(x) __builtin_ctz(x)
#define clz(x) (31^__builtin_clz(x))
inline void cal(int x,int y,int w,int sgn){
int L=-,R=,p1=y>>,p2=y>>,p3;
u32 v;
v=t1[w][p1]&A<<y;
if(v)R=p1<<|ctz(v);
else{
v=t0[w][p2]&A<<p1<<;
if(v){
p3=p2<<|ctz(v);
R=p3<<|ctz(t1[w][p3]);
}else for(int i=p2+;i<;++i)if(t0[w][i]){
p3=i<<|ctz(t0[w][i]);
R=p3<<|ctz(t1[w][p3]);
break;
}
}
v=t1[w][p1]&A>>(^y);
if(v)L=p1<<|clz(v);
else{
v=t0[w][p2]&A>>(^p1)>>;
if(v){
p3=p2<<|clz(v);
L=p3<<|clz(t1[w][p3]);
}else for(int i=p2-;i>=;--i)if(t0[w][i]){
p3=i<<|clz(t0[w][i]);
L=p3<<|clz(t1[w][p3]);
break;
}
} L=max(y,L+k);
R=min(min(m+,y+k),R);
if(L<R)s[x][L]+=sgn,s[x][R]-=sgn;
}
inline void del(int x,int y,int w){
_xor(t1[w],y);
if(!t1[w][y>>])_xor(t0[w],y>>);
cal(x,y,w,-);
}
inline void ins(int x,int y,int w){
cal(x,y,w,);
if(!t1[w][y>>])_xor(t0[w],y>>);
_xor(t1[w],y);
}
int main(){
fread(ib,,sizeof(ib),stdin);
n=_();m=_();k=_();
for(int i=;i<=n;++i){
for(int j=;j<=m;++j){
a[i][j]=_();
}
}
for(int j=;j<=m;++j){
for(int i=;i<=n;++i){
int x=a[i][j],&y=pv[x];
if(y&&y>i-k)_xor(bs[y][],j),_xor(bs[i][],j);
y=i;
}
for(int i=;i<=n;++i)pv[a[i][j]]=;
}
for(int i=;i<=n;++i){
for(int j=;j<=m;++j){
if(i>k&&!_get(bs[i-k][],j))del(i,j,a[i-k][j]);
if(!_get(bs[i][],j))ins(i,j,a[i][j]);
}
}
for(int i=;i<=n;++i){
for(int j=;j<=m;++j)s[i][j]+=s[i][j-];
for(int j=;j<=m;++j)s[i][j]+=s[i-][j];
if(i>=k)for(int j=k;j<=m;++j){
sum+=s[i][j];
if(s[i][j]>mx)mx=s[i][j];
}
}
printf("%d %lld\n",mx,sum);
return ;
}

bzoj5103: [POI2018]Ró?norodno的更多相关文章

  1. BZOJ5103 : [POI2018]Róznorodno

    从上到下枚举上下底边,那么涉及两行的添加和删除. 首先预处理出对于每一列,每个位置添加和删除时,是否会对往下$k$个里出现这个颜色造成影响. 然后对于每种颜色维护一个长度为$m$的bitset,表示哪 ...

  2. zapewnia stale poprawiając relacje związane

    W porównaniu do LG5, ta http://www.butyrunning.com/lunarestoa-2-m%C3%84%C2%99skie-c-2_70_71.html kon ...

  3. [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes

    ##################    Rancher v2.1.7  +    Kubernetes 1.13.4  ################ ##################### ...

  4. 利用python进行数据分析2_数据采集与操作

    txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...

  5. Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页

    {#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...

  6. bzoj千题计划249:bzoj5100: [POI2018]Plan metra

    http://www.lydsy.com/JudgeOnline/problem.php?id=5100 1.找到d1[i]+dn[i] 最小的点,作为1到n链上的点 2.令链长为D,若abs(d1[ ...

  7. POI2018

    [BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...

  8. 【BZOJ5102】[POI2018]Prawnicy 堆

    [BZOJ5102][POI2018]Prawnicy Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大 ...

  9. 【BZOJ5099】[POI2018]Pionek 几何+双指针

    [BZOJ5099][POI2018]Pionek Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表示.每条指令最多只 ...

随机推荐

  1. tensorflow中数据批次划分示例教程

    1.简介 将数据划分成若干批次的数据,使用的函数主要有: tf.train.slice_input_producer(tensor_list,shuffle=True,seed=None,capaci ...

  2. QLineSeries QChartView 生成折线

    效果图 // 创建折线上点的序列 QLineSeries *splineSeries = new QLineSeries(); //QSplineSeries *splineSeries = new ...

  3. CUDA 例程

    scalar add #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include &l ...

  4. Vue(六) 表单与 v-model

    学习使用 v-model 指令完成表单数据双向绑定 基本用法 表单控件在实际业务较为常见,比如单选,多选.下拉选择.输入框等,用他们可以完成数据的录入.校验.提交等.Vue.js 提供了 v-mode ...

  5. jdk安装环境变量配置

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  6. 架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)

    [前言] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(一)>中小编简单的讲解了Nginx的原理!俗话说:光说不练假把式.接下来,小编就和大家一起来做个小Demo来体会一下N ...

  7. GDT全局描述符表

    GDT全局描述符表 什么是GDT全局描述符表 GDT全称为Global Descriptor Table,全局描述符表. 保护模式的寻址方式不在使用寄存器分段的方式直接寻址方式了.而采用的是使用GDT ...

  8. Android : 跟我学Binder --- (4) 驱动情景分析

    目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...

  9. JVM的永久代会发生垃圾回收吗?

    垃圾回收不会发生在永久代中.当永久代满或者超过临界值时,就会触发完全垃圾回收(Full GC).如果仔细查看垃圾收集器中的输出信息,就会发现永久代也是被回收的.这就是正确的永久代大小对避免Full G ...

  10. centos7下zabbix4.0配置磁盘IO监控

    一:准备 1.1:安装sysstat yum -y install sysstat 1.2:安装zabbix-get yum install -y zabbix-get.x86_64 1.3:iost ...