基础算法题——牛牛种花(高效、降维、离散化、树状数组)

2023-10-29

牛牛种花

题目链接
题目1
题目2
这道题还是挺有意思的,呵呵。


解题思路

①、高效:利用结构体存储数据。

struct node{
    int x,y,id;
}a[N<<1];

利用 id 来记录每个节点是查询或是种树,若为查询则给予编号(从 1 开始编号),否则置为 0。

②、降维
对存储数据的结构体数组 a 以第一关键字:x 第二关键字:y,进行从小到大的排序,从而达到避免考虑 x 的变化的效果 。

bool cmp(node a,node b){
	if(a.x==b.x)
		return a.y<b.y;
	else
		return a.x<b.x; 
}

③、离散化
通过降维,我们只要考虑变量 yi 的区间和。但题目中数据范围太大,-109<= yi <=109。若直接用数组把对应 yi 下标进行标记,那肯定是会溢出。离散化能够 yi 的规模缩小并存储起来。

④、树状数组
维护 yi 的区间和。这里我们注意运用树状数组的起始下标必须为 1,不可从 0 开始维护。

ps:Y,s 的数组大小需要开到 2e5 以上,因为最大需要存储 n+m 个元素。


实现代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int Y[N], ans[N];
int s[N]={0}, cnt;

struct node{
	int x, y, id;
}a[N];

bool cmp(node a, node b){
	if(a.x==b.x) 
		return a.y<b.y;
	return a.x<b.x;
}

int lowbit(int x){
	return x&(-x);
}

void add(int k){
	for(; k<=cnt; k+=lowbit(k))
		s[k]++;
	return;
}

int sum(int k){
	int x=0;
	for(; k>0; k-=lowbit(k))
		x += s[k];
	return x;
}

int main(){
	int n, m;
	scanf("%d%d", &n, &m);
	for(int i=1; i<=n+m; i++){
		scanf("%d%d", &a[i].x, &a[i].y);
		Y[i] = a[i].y;
		if(i>n)
			a[i].id=i-n;
		else
			a[i].id=0;
	}
	
	sort(a+1, a+n+m+1, cmp);
	sort(Y+1, Y+n+m+1);
	cnt = unique(Y+1, Y+n+m+1)-Y-1;
	
	for(int i=1; i<=n+m; i++){
		int p = lower_bound(Y+1, Y+cnt+1, a[i].y)-Y;
		if(a[i].id)
			ans[a[i].id] = sum(p);
		else
			add(p);
	}
	
	for(int i=1; i<=m; i++)
		printf("%d\n", ans[i]);
	
	return 0;
}

文章对你有帮助,请留个赞鼓励鼓励我吧:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础算法题——牛牛种花(高效、降维、离散化、树状数组) 的相关文章

随机推荐

  • 有哪些前端可以做的性能优化点

    前端性能优化是一个广泛的主题 涉及许多不同的技术和策略 以下是一些常见的前端性能优化点 资源压缩和最小化 使用工具如Terser来压缩和最小化JavaScript代码 使用CSS压缩工具如CSSNano 压缩HTML内容 图片优化 使用适当
  • Java垃圾回收机制

    一 如何确定某个对象是 垃圾 既然垃圾收集器的任务是回收垃圾对象所占的空间供新的对象使用 那么垃圾收集器如何确定某个对象是 垃圾 以及通过什么方法判断一个对象可以被回收了 在java中是通过引用来和对象进行关联的 也就是说如果要操作对象 必
  • 开放本地数据库局域网共享

    1 先进去我们的本地数据库 mysql u root p 进入我们的数据库 会提示让你输入密码 输入你本地的数据库密码 然后进入 2 use mysql 自带的数据库 select host user from user 3 你可以看到 每
  • Ubuntu下安装Kdevelop IDE和使用教程

    一 在终端输入下面指令安装Kdevelop 要连接网络 先安装cmake sudo apt get install cmake 安装kdevelop sudo apt get install kdevelop 二 新建工程 安装好之后 在搜
  • Tomcat配置问题:Warning:The selected directory is not a TomEE home

    问题描述 在使用IDEA进行Tomcat配置时 发生如下警告 提示 因为是警告就没太在意 配置完成后进行启动 发现变成了 错误 原因分析 产生这个的原因其实是因为自己的一个小疏忽 在配置Tomcat的时候 选择了TomEE Server 解
  • python爬虫实战(1)--爬取新闻数据

    想要每天看到新闻数据又不想占用太多时间去整理 萌生自己抓取新闻网站的想法 1 准备工作 使用python语言可以快速实现 调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install Beautiful
  • 责任链模式二

    本文以创建商品案例来讲解责任链模式 假设创建商品逻辑分为 1 创建商品 2 检验商品 3 保存商品 第二步中校验商品又分为多种情况 必填字段校验 规格校验 价格校验 库存校验等等 伪代码如下 public Result createProc
  • 值不值

    Hi 我是小小 今天是本周的第五篇 主要内容是jpa的入门 现在开始今日内容 数据准备 数据库使用的数据表设计如下 建表语句如下 SET NAMES utf8mb4 SET FOREIGN KEY CHECKS 0 Table struct
  • 初学Qt之--带参数的信号和槽的实现(入门级)

    初次接触Qt 由于只有C语言的基础 弄起来很是头疼 下面这个Qt带参数的信号与槽的实例仅供入门之用 高手免观 Qt 4 4 0 实现 废话不多说 直接上代码 MyMainWindows h ifndef MYMAINWINDOWS H de
  • MATLAB实现TopSis优劣解距离法——分析《世界征服者3》将领排名

    问题背景 世界征服者3游戏中有150 的将领角色 每个将领都有自己的兵种优势 军阶 技能等不同的属性 如何教务客观 综合全面地选拔出其中排名前50的将领 基于TOPSIS优劣解距离法以及聚类算法 给出大家较为客观的排名 一 问题描述 在世界
  • 自定义TableViewCell的使用方法

    新建TableViewCell类 继承父类为UITableViewCell 1 1 TableCell h import
  • Android 内存优化技术点

    致敬前辈 砥砺前行
  • ir2104s的自举电容_IR2104s半桥驱动芯片使用经验及注意事项

    多次使用IR2104s 每次的调试都有种让人吐血的冲动 现在将使用过程遇到的错误给大家分享一下 方便大家找到思路 一 自举电容部分 关键 1 听说自举电路必须要安装场效应管 于是我在使用过程中 安装了只半桥的高端场效应管 结果 高端驱动HO
  • 被广泛应用的水分含量传感器工作原理

    水分含量传感器由电源模块 变送模块 漂零及温度补偿模块 数据处理模块等组成 采用FDR频域法 可以实时准确测定各种土壤不同剖面的水分含量 传感器内置信号采样及放大 零点漂移及温度补偿功能 用户接口简洁 方便 外型小巧轻便 便于携带和连接 功
  • 招聘方眼里的猎聘和Boss直聘直观对比

    最近为了招聘 公司HR给开通了猎聘和Boss直聘的账户 对比两个招聘渠道的使用 有着截然不同的效果 功能上 两者相差不多 简历上 相对来说猎聘的更高端一些 可能有 猎 的字眼 来看我们发布的职位的不少是海归 不过对我们纯本土的企业来说 英语
  • 基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平教程

    详情点击链接 基于ArcGIS ENVI InVEST FRAGSTATS等多技术融合提升环境 生态 水文 土地 土壤 农业 大气等领域的数据分析能力与项目科研水平教程 一 空间数据获取与制图 1 1 软件安装与应用 1 2 空间数据 1
  • 【django】APPEND_SLASH 路由末尾的斜杠问题

    url路由末尾是否加斜杠的规范 加斜杠 表示是目录 不加斜杠 表示是文件 在django中的setting中 默认APPEND SLASH True 即当请求的路由末尾没有加斜杠 如果尝试加上斜杠后 能在后端路由里匹配到 则会自动加上斜杠
  • 2023/09/15 qt day1

    代码实现图形化界面 include denglu h include ui denglu h include
  • 题13:字符串匹配之KMP

    kmp算法是一种改进的字符串匹配算法 由D E Knuth与V R Pratt和J H Morris同时发现 因此人们称它为克努特 莫里斯 普拉特操作 简称KMP算法 KMP算法的关键是根据给定的模式串W1 m 定义一个next函数 nex
  • 基础算法题——牛牛种花(高效、降维、离散化、树状数组)

    牛牛种花 题目链接 这道题还是挺有意思的 呵呵 解题思路 高效 利用结构体存储数据 struct node int x y id a N lt lt 1 利用 id 来记录每个节点是查询或是种树 若为查询则给予编号 从 1 开始编号 否则置