首页 > 其他分享 >HT-014 Div3 扫雷 题解 [ 绿 ] [ 二维差分 ]

HT-014 Div3 扫雷 题解 [ 绿 ] [ 二维差分 ]

时间:2024-07-06 17:08:52浏览次数:9  
标签:int 题解 HT -- second 014 pi change first

分析

观察到是曼哈顿距离 \(\le r\) 的范围可以扫到,联想到如下图形:

image

左边是 \(r=1\) 可以扫到的范围,右边是 \(r=2\) 可以扫到的范围。

于是,我们只要对这样的图形在 \(1000*1000\) 的格子里差分一下就好了 。

但这样的复杂度是 \(O(nm)\) 的,会死的很惨。

优化

不难发现这个图形是一个旋转过 \(45°\) 的正方形,所以我们先把他转回来。

归纳法可以得到原先为 \((x,y)\) 的点会变换为 \((n+x-y,x+y-1)\) 。
严格证明有点忘了,记得好像是用一次函数证的。

于是我们就把一个斜着的图形变正了。

接下来就是把这个正方形的四个顶点算出来并且变换一下,套一个二维差分的板子,很简单。

时间为 \(O(m)\) ,常数有点大。

另外,为了不特判边界情况,可以直接开 \(4000*4000\) 的数组,把变换后的点横纵坐标都加一个 \(1000\) ,就不用处理下标为负数的情况。出题人比较好心,给了 \(2000ms\) 和 \(1024Mib\) 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
int n,m,f[5005][5005],q;
pi change(pi ori)
{
	int x=ori.first,y=ori.second;
	return {n+x-y+1100,x+y-1+1100};
}
bool check(pi t)
{
	int x=t.first,y=t.second;
	return (x>=1&&x<=2*n-1&&y>=1&&y<=2*n-1);
}
int main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	while(m--)
	{
		int x,y,r;
		cin>>x>>y>>r;
		pi zs=change({x-r,y});
		pi zx=change({x,y-r});
		pi ys=change({x,y+r});
		pi yx=change({x+r,y});
		f[zs.first][zs.second]++;
		f[zx.first+1][zx.second]--;
		f[ys.first][ys.second+1]--;
		f[yx.first+1][yx.second+1]++;
	}
	for(int i=1;i<=5000;i++)
	{
		for(int j=1;j<=5000;j++)
		{
			f[i][j]=f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1];
		}
	}
	cin>>q;
	while(q--)
	{
		int x,y;
		cin>>x>>y;
		pi now=change({x,y});
		cout<<f[now.first][now.second]<<endl;
	}
	return 0;
}

标签:int,题解,HT,--,second,014,pi,change,first
From: https://www.cnblogs.com/zhr0102/p/18287485

相关文章

  • HT-014 Div3 跳棋 题解 [ 黄 ] [ 并查集 ] [ 树型结构 ]
    分析依旧是一个连通块题。观察题面不难发现两个重要性质:一个跳棋只能以它旁边的两个跳棋为中点跳跃,且满足跳跃路线中除中点以外没有其它跳棋阻挡。只有我们的跳棋可以移动。跳棋的操作具有可逆性/对称性。第三条性质可以这么理解,就是一个跳棋跳过去之后,它还可以跳回来。......
  • httpie/xh 与 curl 对比
    xh相当于是rust版的httpie(httpie是python写的)安装xhhttps://github.com/ducaale/xh?tab=readme-ov-file#via-a-package-managercargoinstallxh--lockededGETcurlhttps://httpbin.org/get?hello=worldxhhttpbin.org/gethello==world#xh默认请求httpx......
  • [POI2015] WYC 题解
    [POI2015]WYC显然矩阵乘法发现点数和边权非常小,所以可以考虑拆点把每个点拆为\(u_1\),\(u_2\),\(u_3\),初始:\(u_1\tou_2\),\(u_2\tou_3\),每一条加边:\(u+(w-1)\timesn\tov\)因为\(k\)非常大,所以考虑倍增优化注意:答案会爆longlong,需要使用unsignedlonglong//Pro......
  • 01 Web基础与HTTP协议
    1.1Web基础本章将介绍Web基础知识,包括域名的概念、DNS原理、静态网页和动态网页的相关知识。1.1.1.域名概述1.域名的概念ip地址不易记忆2.早期使用host文件解析域名主机名重复主机维护困难3.DNS分布式层次式4.域名空间结构根域顶级域组织域国家域二级域名FQDN......
  • python-docx库 写入docx时中文不适配问题,中文异常问题解决办法。
    python-docx库写入docx时中文不适配问题,中文异常问题解决办法。通过以下方法可以成功将正文修改为宋体字体。这个是全文设置。fromdocx.oxml.nsimportqndoc=Document()doc.styles['Normal'].font.name=u'宋体'doc.styles['Normal']._element.rPr.rFonts.set(qn('w:......
  • HashTable,ArrayList,queue等常用方法
    HashTable,ArrayList,queue等常用方法HashMap是Java中非常常用的集合类,它存储键值对,并提供了一系列方便的方法来操作这些数据。以下是一些HashMap的常用方法:1.添加和获取元素:put(key,value):将指定的键值对添加到HashMap中。如果键已存在,则更新对应的值。get(ke......
  • ZeroMQ最全面试题解读(3万字长文)
    目录解释ZeroMQ是什么,它的主要用途是什么?ZeroMQ支持哪些通信模式?描述一下ZeroMQ中的“消息”和“消息帧”如何在C++中初始化一个ZeroMQ上下文?在ZeroMQ中,如何创建一个套接字并将其绑定到特定端口?解释什么是“管道模式”(PipePattern)说明如何使用ZeroMQ进行点对点通信Zer......
  • html+css随手记录第二天
    1.CSS简介    需要对下面的知识有基本的了解:HTML/XHTML1.1什么是CSS?    CSS指层叠样式表(CascadingStyleSheets)    css样式定义如何显示HTML元素,样式通常存储在样式表中,把样式添加到HTML4.0中,是为了解决内容与表现分离的问题,外部样......
  • 题解:CF1256D Binary String Minimizing
    贪心。数据范围\(n\le10^{6}\),因此我们要用时间复杂度为\(\mathcal{O}\left(n\right)\)的算法来解决这个问题。思路从左至右扫一遍序列,如果遇到\(10\),则要将这个\(0\)交换到前面的位置。由于是字典序最小,\(0\)应该尽量在最高位。现在需要知道这个\(0\)被交换到哪......
  • HTML 【实用教程】(2024最新版)
    核心思想——语义化【面试题】如何理解HTML语义化?仅通过标签便能判断内容的类型,特别是区分标题、段落、图片和表格增加代码可读性,让人更容易读懂对SEO更加友好,让搜索引擎更容易读懂html文件的基本结构html文件的文件后缀为.html,如index.htmlvscode中......