BZOJ5103 : [POI2018]Róznorodno
从上到下枚举上下底边,那么涉及两行的添加和删除。
首先预处理出对于每一列,每个位置添加和删除时,是否会对往下$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的更多相关文章
- bzoj5103: [POI2018]Ró?norodno
Description 给定一个n行m列的矩阵,请对于每个长宽均为k的连续子正方形,统计里面出现过的数值的种类数. Input 第一行包含三个正整数n,m,k(n,m<=3000,k<=m ...
- bzoj5100 [POI2018]Plan metra 构造
5100: [POI2018]Plan metra Time Limit: 40 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 189 Sol ...
- [POI2018]Pionek
[POI2018]Pionek 题目大意: 在无限大的二维平面的原点放置着一个棋子.你有\(n(n\le2\times10^5)\)条可用的移动指令,每条指令可以用一个二维整数向量表示.请你选取若干条 ...
- 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[ ...
- POI2018
[BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...
- 【BZOJ5102】[POI2018]Prawnicy 堆
[BZOJ5102][POI2018]Prawnicy Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大 ...
- 【BZOJ5099】[POI2018]Pionek 几何+双指针
[BZOJ5099][POI2018]Pionek Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表示.每条指令最多只 ...
- 【BZOJ5100】[POI2018]Plan metra 构造
[BZOJ5100][POI2018]Plan metra Description 有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度. 已知2到n-1每个点 ...
- 【BZOJ5101】[POI2018]Powód 并查集
[BZOJ5101][POI2018]Powód Description 在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水箱与外界之间有一堵高度无 ...
随机推荐
- mongodb数据中的复制(副本集)
---恢复内容开始--- 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备 ...
- HDU 3336 Count the string(next数组运用)
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- flanneld,flannel和cni逐步深入
这个问题,现在慢慢搞定. 把这两者的关系搞清楚了. 还有kubeadm join和手工安装Node的故事, 也没那么玄乎~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ htt ...
- java发送http的get、post请求【备忘】
类 package com.dsideal.kq.Controller; import java.io.BufferedReader; import java.io.IOException; impo ...
- 发送Json数据,WebApi查看时为Null的问题(已解决)
1. PostMan :发送请求的Body中选择form-data是不行的.,body中的内容也要选择raw json格式. 2.如果是代码中填写的对象,api中解析为null,说明字段的值未对 ...
- poshytip基本使用
js基本调用方法 $("#tips").poshytip({ content: $this.text(), alignTo: 'target', alignX: direction ...
- nginx的with-http_sub_module模块使用之替换字符串
一.介绍 该ngx_http_sub_module模块是一个过滤器,通过将一个指定的字符串替换为另一个字符串来修改响应.该模块不是默认生成的,它应该使用--with-http_sub_module 配 ...
- Python学习(十) —— 常用模块
一.collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...
- Codeforces 653F Paper task SA
Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h& ...
- Python 实现红绿灯
一.通过Event来实现两个或多个线程间的交互,下面是一个红绿灯的例子,即起动一个线程做交通指挥信号灯,一个线程做车辆,车辆行驶按红灯停,绿灯行的规则. #!/usr/bin/python # -*- ...