首页 > 编程语言 >P6751 [IOI2019]视觉程序 题解--zhengjun

P6751 [IOI2019]视觉程序 题解--zhengjun

时间:2023-01-12 13:00:36浏览次数:38  
标签:std IOI2019 -- 题解 ge 距离 int add

提供一种简介易懂的做法。

首先曼哈顿距离的绝对值比较难处理,所以可以转成切比雪夫距离。

具体地说,就是 \((x,y)\) 变成 \((x+y,x-y)\)(接下来所述的坐标都是变换后的)。

这样 \((x,y),(a,b)\) 之间的距离就是 \(\max\{|a-x|,|b-y|\}\)。

虽然这里还有绝对值,但是这个我们其实是知道大小的,所以并不影响。

接下来考虑怎么构造方案。

由于现在的距离带着 \(\max\),所以考虑判断两点间距离是否 \(\ge d\)。

也就是 \(a-x\ge d\) 或 \(b-y\ge d\),两维分开考虑,这里以 \(x\) 一维为例;

若枚举 \(x\),则只需判断是否存在 \(\ge x+d\) 的 \(a\) 即可。

所以先用 \(O(n+m)\) 次查询,共 \(O(nm)\) 个数,统计出变换后的坐标有无黑点。

再做一次后缀和,然后就直接判断存在 \(\ge k\) 并且不存在 \(\ge k+1\) 即可。

代码

#include<bits/stdc++.h>
void construct_network(int H, int W, int K);
int add_and(std::vector<int> Ns);
int add_or(std::vector<int> Ns);
int add_xor(std::vector<int> Ns);
int add_not(int N);
using namespace std;const int N=2e2+10,M=N*2;
int n,m,k,a[M],b[M],c[M],d[M];vector<int>A[M],B[M];
int chk(int t){//判断两黑点距离是否 >= t 
	int x=add_or({add_and({a[0],c[t]}),add_and({b[0],d[t]})});
	for(int i=1;i+t<k;i++)x=add_or({x,add_and({a[i],c[i+t]})});
	for(int i=1;i+t<k;i++)x=add_or({x,add_and({b[i],d[i+t]})});
	return x;
}
void construct_network(int H,int W,int K){
	n=H;m=W;k=n+m-1;
	for(int i=0;i<n;i++)for(int j=0;j<m;j++)A[i+j].push_back(i*m+j);//切比雪夫坐标 
	for(int i=0;i<n;i++)for(int j=0;j<m;j++)B[i-j+m-1].push_back(i*m+j);
	for(int i=0;i<k;i++)a[i]=add_or(A[i]),b[i]=add_or(B[i]);
	c[k-1]=a[k-1];for(int i=k-2;i>=0;i--)c[i]=add_or({c[i+1],a[i]});//后缀 or 
	d[k-1]=b[k-1];for(int i=k-2;i>=0;i--)d[i]=add_or({d[i+1],b[i]});
	if(K<k-1)add_and({chk(K),add_not(chk(K+1))});else chk(K);
}

标签:std,IOI2019,--,题解,ge,距离,int,add
From: https://www.cnblogs.com/A-zjzj/p/17046325.html

相关文章

  • 健康生活、快乐工作
    ——传智播客举办2015年趣味健步走活动北京的九月阳光明媚,秋高气爽。为了提高广大员工的身体素质,丰富员工的业余文化生活,传智播客教育集团于2015年9月19日上午在北京奥......
  • 程序猿会不会找UI设计师做女朋友?
    看到这个标题,所有程序员就该吐槽了:程序员都是屌丝,女朋友都是淘宝上买的,哪里是做设计的!在这里,我就跟大家分享下程序猿为什么要找一个设计师做女朋友!! 1.作为看过各种片的程序......
  • UTF8 和 AL32UTF8 的区别
      UTF8和AL32UTF8是Unicode字符集的编码,包括所有现代语言的所有字符。UTF8和AL32UTF8允许使用受支持语言的任意组合从一个数据库实例运行Oracle应用程序。AL3......
  • 【收藏】不可错过的javascript迷你库
    最近看着下自己的githubstar,把我吓坏了,手贱党,收藏癖的我都收藏了300+个仓库了,是时候整理一下了。Unix主张kiss,小而美被实践是最好用的,本文将介绍笔者收集的一些非常赞的......
  • Effective C++ 笔记
    EffectiveC++笔记Sec0Introduction本书的目的:如何有效运用C++,使软件易理解、易维护、可移植、可扩充、高效、并有预期行为提出的忠告分两类:一般性的设计策略,带有......
  • 工作流引擎架构设计
    原文链接:工作流引擎架构设计最近开发的安全管理平台新增了很多工单申请流程需求,比如加白申请,开通申请等等。最开始的两个需求,为了方便,也没多想,就直接开发了对应的业务代......
  • 工作中一些sqlserver函数运用
         ......
  • 二叉搜索树
    1.二叉搜索树二叉搜索树又称二叉排序树,他的左子树上的节点都小于根节点,他的右子树上的节点都大于根节点,每一个左右子树又是一个二叉搜索树 2. 删除节点的几......
  • NoClassDefFoundError的两种情况
    ClassNotFoundExceptionvs.NoClassDefFoundErrorClassNotFoundException关于ClassNotFoundException发生的原因,这篇文章ClassNotFoundExceptionvs.NoClassDefFoundEr......
  • 使用Android 调试桥(ADB)卸载手机自带软件
    今天忍受不了手机自带的应用商店广告过多,打算卸载了,结果在应用管理页面中这个软件没有卸载按钮,后面查找了可以使用ADB命令行卸载,这里做一些简单记录。1.准备1.1硬件准......