从上到下枚举上下底边,那么涉及两行的添加和删除。

首先预处理出对于每一列,每个位置添加和删除时,是否会对往下$k$个里出现这个颜色造成影响。

然后对于每种颜色维护一个长度为$m$的bitset,表示哪些列出现过该颜色。

那么每次修改时,找到前驱和后继,对这一行答案的影响是一段区间加,差分前缀和即可。

时间复杂度$O(\frac{nm^2}{64})$。

#include<cstdio>
typedef unsigned int U;
const int N=3010,M=100010,BUF=72000000;
char Buf[BUF],*buf=Buf;
int n,m,K,lim,i,j,k,u,d,a[N][N],cnt[M],s[N],mx;long long ans;bool in[N][N],ou[N][N];
U f[M][N/32+5];
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline void add(U*f,int x){
int y=x>>5,pre=-1,suf=-1;
if(f[y]){
int o=x&31;U z=f[y];
for(int i=o-1;~i;i--)if(z>>i&1){pre=y<<5|i;break;}
for(int i=o+1;i<32;i++)if(z>>i&1){suf=y<<5|i;break;}
}
if(pre<0)for(int i=y-1;~i;i--)if(f[i]){pre=i<<5|(31-__builtin_clz(f[i]));break;}
if(suf<0)for(int i=y+1;i<=lim;i++)if(f[i]){suf=i<<5|__builtin_ctz(f[i]);break;}
int l=max(pre+1,x-K+1),r=min(x,suf-K);
if(l<=r)s[l]++,s[r+1]--;
f[y]^=1U<<(x&31);
}
inline void del(U*f,int x){
int y=x>>5,pre=-1,suf=-1;
f[y]^=1U<<(x&31);
if(f[y]){
int o=x&31;U z=f[y];
for(int i=o-1;~i;i--)if(z>>i&1){pre=y<<5|i;break;}
for(int i=o+1;i<32;i++)if(z>>i&1){suf=y<<5|i;break;}
}
if(pre<0)for(int i=y-1;~i;i--)if(f[i]){pre=i<<5|(31-__builtin_clz(f[i]));break;}
if(suf<0)for(int i=y+1;i<=lim;i++)if(f[i]){suf=i<<5|__builtin_ctz(f[i]);break;}
int l=max(pre+1,x-K+1),r=min(x,suf-K);
if(l<=r)s[l]--,s[r+1]++;
}
int main(){
fread(Buf,1,BUF,stdin);read(n),read(m),read(K);
for(i=1;i<=n;i++)for(j=1;j<=m;j++)read(a[i][j]);
for(j=1;j<=m;j++){
for(d=1;d<K;d++)if(!(cnt[a[d][j]]++))in[d][j]=1;
for(u=0;d<=n;u++,d++){
if(u)if(!(--cnt[a[u][j]]))ou[u][j]=1;
if(!(cnt[a[d][j]]++))in[d][j]=1;
}
for(i=1;i<=n;i++)cnt[a[i][j]]=0;
}
lim=(m+1)>>5;
for(i=1;i<M;i++){
f[i][0]=1;
f[i][(m+1)>>5]|=1U<<((m+1)&31);
}
for(d=1;d<K;d++)for(j=1;j<=m;j++)if(in[d][j])add(f[a[d][j]],j);
for(u=0;d<=n;u++,d++){
if(u)for(j=1;j<=m;j++)if(ou[u][j])del(f[a[u][j]],j);
for(j=1;j<=m;j++)if(in[d][j])add(f[a[d][j]],j);
for(j=1,k=0;j+K-1<=m;j++){
k+=s[j];
if(k>mx)mx=k;
ans+=k;
}
}
return printf("%d %lld",mx,ans),0;
}

  

BZOJ5103 : [POI2018]Róznorodno的更多相关文章

  1. bzoj5103: [POI2018]Ró?norodno

    Description 给定一个n行m列的矩阵,请对于每个长宽均为k的连续子正方形,统计里面出现过的数值的种类数. Input 第一行包含三个正整数n,m,k(n,m<=3000,k<=m ...

  2. bzoj5100 [POI2018]Plan metra 构造

    5100: [POI2018]Plan metra Time Limit: 40 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 189  Sol ...

  3. [POI2018]Pionek

    [POI2018]Pionek 题目大意: 在无限大的二维平面的原点放置着一个棋子.你有\(n(n\le2\times10^5)\)条可用的移动指令,每条指令可以用一个二维整数向量表示.请你选取若干条 ...

  4. 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[ ...

  5. POI2018

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

  6. 【BZOJ5102】[POI2018]Prawnicy 堆

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

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

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

  8. 【BZOJ5100】[POI2018]Plan metra 构造

    [BZOJ5100][POI2018]Plan metra Description 有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度. 已知2到n-1每个点 ...

  9. 【BZOJ5101】[POI2018]Powód 并查集

    [BZOJ5101][POI2018]Powód Description 在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水箱与外界之间有一堵高度无 ...

随机推荐

  1. hdu 5183(Hash处理区间问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2+a3-a4+.....+/-an 中是否 ...

  2. tomcat安装出现的闪退问题

    如果闪退 在该文件中结尾添加pause  可以检测到路径问题是不是有问题

  3. python爬虫-淘宝商品密码(图文教程附源码)

    今天闲着没事,不想像书上介绍的那样,我相信所有的数据都是有规律可以寻找的,然后去分析了一下淘宝的商品数据的规律和加密方式,用了最简单的知识去解析了需要的数据. 这个也让我学到了,解决问题的方法不止一个 ...

  4. 【C++ Primer | 10】再探迭代器

    插入迭代器 1. 测试代码: #include<iostream> #include<vector> #include<list> #include<iter ...

  5. babelrc

    .babelrc文件 // 简单版 { "presets": ["es2015", "stage-2"], // 使用 es2015 npm ...

  6. webstorm ps

    2018WebStorm注册码   2018-10-10 2018年08月22日 17:36:58 阳光明媚的味道 阅读数:6325   8月21日 http://webstorm.autoseasy ...

  7. jQuery中ajax如何返回值到上层函数里?

    这个涉及到js的异步执行了,程序本身是同步执行的,到了getJSON这里的时候,这个函数是异步的,而 load_val这个函数是同步的,你需要这样来异步返回这个值 function load_val( ...

  8. Sql与C#中日期格式转换总结

    SQL中的转换方法: 一.将string转换为datetime,主要是使用Convert方法, 方法,Convert(datetime [ ( length ) ] , expression, [st ...

  9. WebApi接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...

  10. Centos6.5系统压力测试过程大量TIME_WAIT

    统计tcp状态的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' netstat -n | awk '/ ...