bzoj5103: [POI2018]Ró?norodno
Description
Input
Output
对每种颜色分别算贡献,一个点对一个边长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的更多相关文章
- BZOJ5103 : [POI2018]Róznorodno
从上到下枚举上下底边,那么涉及两行的添加和删除. 首先预处理出对于每一列,每个位置添加和删除时,是否会对往下$k$个里出现这个颜色造成影响. 然后对于每种颜色维护一个长度为$m$的bitset,表示哪 ...
- 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 ...
- [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes
################## Rancher v2.1.7 + Kubernetes 1.13.4 ################ ##################### ...
- 利用python进行数据分析2_数据采集与操作
txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...
- Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页
{#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...
- 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条可用的移动指令,每条指令可以用一个二维整数向量表示.每条指令最多只 ...
随机推荐
- .net获取程序根目录
获取程序的根目录: var path = HttpRuntime.AppDomainAppPath;
- iOS分类底层实现原理小记
摘要:iOS分类底层是怎么实现的?本文将分如下四个模块进行探究分类的结构体编译时的分类分类的加载总结本文使用的runtime源码版本是objc4-680文中类与分类代码如下//类@interfaceP ...
- Linux c 获取cpu使用率
部分代码改编自来自http://blog.csdn.net/primeprime/article/details/41458731 主要的原理就是获取top -n 1 | grep Cpu执行的结果, ...
- python-模块2
from collections import namedtuple # # 类 # p = namedtuple("Point", ["x", "y ...
- unity中Event Trigger组件应用代码
using UnityEngine; using System.Collections; using UnityEngine.Events; using UnityEngine.EventSystem ...
- Java框架部分---面试题
说说Spring? Spring的核心是控制反转.依赖注入,Aop(面向切面)相当于把每个bean与bean之间的关系交给第 三方容器进行管理. 说SpringIOC.SpringAOP? Sprin ...
- Java包装类的自动拆装箱
题目: Integer i = 42; Long l = 42l; Double d = 42.0; 下面为true的是 A.(i == l) B.(i == d) C.(l == d) D.i.eq ...
- qssp2017 source
ftp://ftp.gfz-potsdam.de/pub/home/turk/wang
- FCC JS基础算法题(12):Where do I belong(数组排序并找出元素索引)
题目描述: 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引.举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变成[1,1.5 ...
- Java学习笔记35(sql补充)
在上一篇里,写了数据库的增删该查,没有写完,这里补充 CREATE DATABASE Zs_Base; USE Zs_Base; # 创建表 CREATE TABLE PRODUCT( ID INT ...