AtCoder Beginner Contest 260 G.Scalene Triangle Area(花式二维差分/二维线段树)

news2025/1/21 21:56:12

题目

n*n的网格(n<=2e3),

每个网格内的字符是O或者X,其中O表示(i,j)上有一个棋子,X表示没有

位于(s,t)棋子覆盖住了方格(u,v),当且仅当:

1. \large s\leq u \leq n

2. \large t\leq v\leq n

3. \large (u-s)+\frac{v-t}{2}<m

q(q<=2e5)次询问,第i次给出一个方格位置(xi,yi)(1<=xi,yi<=n),

询问有多少棋子覆盖住了这个方格

思路来源

官方题解&aging佬代码

题解1

Editorial - AtCoder Beginner Contest 260

 可以发现,+1的区域形似一个三角形,纵向失效处为u-s=m,横向失效处为(v-t)/2=m

横向一维差分后得到第二个图,考虑将+和-分开处理,再差分一次,

于是,+是一个列方向差分,-是一个(+1,-2)方向的差分,

如图三和图四所示,分两个数组维护这两部分的二维差分数组,

分别按列/按(1,-2)方向,求得一维差分数组,

再按行求一遍前缀和,即得到原数组

题解2

将第三个式子化简,有2u+v<2s+t+2*m,相当于有三维权值

即对于每个点(u,v,w)来说,只统计s<=u且t<=v且w>2u+v的点(u,v,w)

而对于棋子(u,v,w)来说,其权值w=2*u+v+2*m

类似一个三维数点问题,控制i这一维本身自增,

剩下的开二维线段树来维护,这里二维树状数组常数相对小一些

代码1(二维差分)

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e3+10,M=2*N,K=1e4+10;
int n,m,q,x,y,ver[N][K],diag[N][K],ans[N][K];
char s[N];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;++i){
        scanf("%s",s);
        for(int j=0;j<n;++j){
            if(s[j]=='O'){
                ver[i][j]++;
                if(i+m<N)ver[i+m][j]--;
                diag[i][j+2*m]--;
                if(i+m<N)diag[i+m][j]++;
            }
        }
    }
    for(int i=1;i<N;++i){// 竖向前缀和 斜向前缀和
        for(int j=0;j<K;++j){
            ver[i][j]+=ver[i-1][j];
            if(j+2<K)diag[i][j]+=diag[i-1][j+2];
        }
    }
    for(int i=0;i<N;++i){
        for(int j=0;j<K;++j){
            ans[i][j]=ver[i][j]+diag[i][j];
        }
    }
    for(int i=0;i<N;++i){// 横向前缀和
        for(int j=1;j<K;++j){
            ans[i][j]+=ans[i][j-1];
        }
    }
    scanf("%d",&q);
    while(q--){
        scanf("%d%d",&x,&y);x--;y--;
        printf("%d\n",ans[x][y]);
    }
    return 0;
}

代码2(二维树状数组)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//2*u+v<2*M+2*s+t
const int N=2e3+10,M=2*N,K=2*M+3*N;
int n,m,q,x,y,res[N][N];
char s[N][N];
struct BIT{
	int n,m,tr[N][K];
	void init(int _n,int _m){
		n=_n;m=_m;
		memset(tr,0,sizeof tr);
	}
	void add(int x,int y,int v){
		for(int i=x;i<=n;i+=i&-i){
            for(int j=y;j<=m;j+=j&-j){
                tr[i][j]+=v;
            }
        }
	}
	int sum(int x,int y){
		int ans=0; 
		for(int i=x;i;i-=i&-i){
            for(int j=y;j;j-=j&-j){
                ans+=tr[i][j];
            }
        }
		return ans;
	}
}tr;
int main(){
    scanf("%d%d",&n,&m);
    tr.init(n,2*m+3*n);
    for(int i=1;i<=n;++i){
        scanf("%s",s[i]+1);
        for(int j=1;j<=n;++j){
            if(s[i][j]=='O'){
                tr.add(j,2*m+2*i+j,1);
            }
            //printf("i:%d j:%d sum2:%d sum:%d\n",i,j,tr.sum(j,2*m+3*n),tr.sum(j,2*i+j));
            res[i][j]=tr.sum(j,2*m+3*n)-tr.sum(j,2*i+j);
        }
    }
    scanf("%d",&q);
    while(q--){
        scanf("%d%d",&x,&y);
        printf("%d\n",res[x][y]);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何给在 SAP Business Application Studio 里开发的 OData 服务准备测试数据试读版

在开始本步骤的学习之前&#xff0c;请大家务必完成前一步骤1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务的学习。换言之&#xff0c;大家已经在 SAP Business Technology Platform 上的 Business Application Studio 里&#xff0c;创建…

Python实现基于Optuna超参数自动优化的xgboost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Optuna是一个开源的超参数优化(HPO)框架&#xff0c;用于自动执行超参数的搜索空间。 为了找到最佳的超…

docker 部署多个前端vue项目

文章目录一、docker 部署前端项目方案1. 方案12. 方案2二、Nginx配置运行2.1. 拉取nginx镜像2.2. 创建配置目录2.3. 创建Nginx容器三、部署前端项目3.1. 压缩3.2. 上传3.3. 验证附录index.html50x.htmlnginx.conf一、docker 部署前端项目方案 1. 方案1 一个docker容器对应一个…

java中“冷门”工具类的总结

文章目录前言一些不常用的工具类不可变集合多值MapTable表Lists、Maps、Sets字符串操作BagLazyList双向Map并发集合小总结CopyOnWriteArrayListConcurrentHashMap前言 最近挖掘了一些在项目中不常用的工具类&#xff0c;有些实用性还是很高的&#xff0c;特此总结一下。 另外又…

mysql中的这些日志,你都知道吗 2?

上一篇文章&#xff0c;我们介绍了binlog和redo log这两种日志&#xff0c;对这两种日志不熟悉的老铁可以看下"mysql中的这些日志&#xff0c;你都知道吗",在上篇文章的末尾&#xff0c;作者还留了一个问题&#xff1a;binlog 和 redo log两个相互独立的日志模块&…

kube-ovn安装与卸载

1.环境准备 Kube-OVN 是一个符合 CNI 规范的网络组件&#xff0c;其运行需要依赖 Kubernetes 环境及对应的内核网络模块。 以下是通过测试的操作系统和软件版本&#xff0c;环境配置和所需要开放的端口信息。1.1 软件版本 Kubernetes > 1.16 且 < 1.24&#xff0c;推荐…

RK3568平台开发系列讲解(音频篇)Android AudioRecord 采集音频

🚀返回专栏总目录 文章目录 一、Android 平台的音频采集技术选型1.1、SDK 层提供的采集方法1.2、NDK 层提供的采集方法二、AudioRecord 采集音频沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Android 平台音频采集的技术选型,在 SDK 层和 NDK 层各有两套音频采集…

【MySQL】MySQL参数调优与实战详解(调优篇)(实战篇)(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

dataloader重构与keras入门体验

原创文章第117篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 北京疫情昨天突破4000&#xff0c;社会面800。看来三天的预期过于乐观了&#xff0c;不知道如何发展。如同资本市场的短期走势&#xff0c;没有人可以预测。但往前看三年&am…

Python性能优化

正文 python为什么性能差&#xff1a; 当我们提到一门编程语言的效率时&#xff1a;通常有两层意思&#xff0c;第一是开发效率&#xff0c;这是对程序员而言&#xff0c;完成编码所需要的时间&#xff1b;另一个是运行效率&#xff0c;这是对计算机而言&#xff0c;完成计算任…

Elasticsearch 8.X DSL 如何优化更有助于提升检索性能?

1、企业级实战 DSL&#xff08;数据已经脱敏&#xff09; 2、大家可以看一下&#xff0c;能发现哪些问题&#xff1f; 根据我的实战和咨询经验&#xff0c;我发现如下几个问题。当然&#xff0c;这是在和球友交流确认问题之后总结出来的。2.1 问题1&#xff1a;bool 组合嵌套过…

动态加载布局的技巧

文章目录动态加载布局的技巧使用限定符使用最小宽度限定符动态加载布局的技巧 使用限定符 在平板上面大多数时候采用的双页的模式,程序会在左侧列表上显示一个包含子项列表,右侧的面版会显示详细的内容的因为平板具有足够大的屏幕.完全能够显示两页的内容.但是在手机上手机只能…

事业编招聘:雄安新区公开选聘专业骨干人才

河北雄安新区公开选聘专业骨干人才公告 根据河北雄安新区建设发展工作需要&#xff0c;决定面向全国机关、企事业单位选聘部分专业骨干人才&#xff0c;现将有关事项公告如下&#xff1a; 一、选聘计划 共选聘20名专业骨干人才。 二、选聘范围 全国机关和企事业单位工作人员。…

Java包装类

为什么有包装类&#xff1f; 在Java中&#xff0c;基本数据类型不是继承自Object&#xff0c;为了在泛型中可以支持基本数据类型&#xff0c;Java给每个基本数据类型都对应了一个包装类。【基本数据类型不符合面向对象思想&#xff0c;基本类型不是对象&#xff0c;从而基本数据…

机器学习中的数学原理——梯度下降法(最速下降法)

好久没更新了&#xff0c;确实是有点懒了&#xff0c;主要是这两天返乡在隔离&#xff08;借口&#xff09;。这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff0…

开放一批PCB资源(二)

这些板卡&#xff0c;都已经停产&#xff0c;现其PCB和原理图对外开放&#xff0c;都是cadence格式。 有需要的加我微信联系。&#xff08;微信&#xff1a;18633364981&#xff09; 这是开放的第二批&#xff0c;后续还有。这一批的价格象征性的收费每个 2000元。 这些板卡…

【操作系统基础】系统接口与系统调用

本文参考MOOC哈工大操作系统课程与课件 主要基于Linux 0.11系统展开 ”Author&#xff1a;Mayiming“ 文章目录一、操作系统接口1. 什么是操作系统接口&#xff1f;2. 操作系统接口体现在哪&#xff1f;3. 命令行是怎么执行代码的&#xff1f;4. 图形界面是怎么执行代码的&…

【Pytorch】Anaconda安装Pytorch详解教程(踩坑经验)

文章目录1、查看本机的CUDA版本2、更新NVIDIA驱动程序3、创建并激活Anaconda虚拟环境4、安装Pytorch5、安装过程中的错误6、检验安装结果未来可期1、查看本机的CUDA版本 cmd命令行输入nvidia-smi 2、更新NVIDIA驱动程序 NVIDIA官网&#xff1a;https://www.nvidia.cn/ 根据…

12、Mybatis搭建流程

Mybatis搭建流程 第一步&#xff1a;引入jar包依赖 第二步&#xff1a;搭建mybatis核心配置文件mybatis-config.xml 一般就四个配置 <properties<typeAliases<Environments<mappers里面内容&#xff1a; mybatis核心配置文件的标签顺序 "(properties?,s…

什么是网站权重?网站权重查询方法有哪些?

什么是网站权重&#xff1f;网站权重查询方法有哪些&#xff1f; 什么是网站权重&#xff1f; 网站权重是搜索引擎给网站赋予的权威值。 网站权重不等于网站排名&#xff0c;但是影响网站排名。 网站权重查询的方法&#xff1a; 方法一&#xff1a;用SEO查询工具。 具体操作如下…