代码源 扫描线权值线段树 板子

news2024/11/23 10:47:35

矩形面积并(存档) 

矩形面积并 - 题目 - Daimayuan Online Judge

题意:

Code(存档,还没写完):

#include <bits/stdc++.h>

#define y1 Y1
#define int long long

using namespace std;

const int mxn=2e5+10;
const int mxe=2e5+10;
const int mod=1e9+7;

struct info{
	int minv,mincnt;
};

info operator+(const info &l,const info &r){
	info res;
	res.minv=min(l.minv,r.minv);
	if(l.minv==r.minv) res.mincnt=l.mincnt+r.mincnt;
	else if(l.minv<r.minv) res.mincnt=l.mincnt;
	else res.mincnt=r.mincnt;
	return res;
}

struct Segtree{
	int t;
	info val;
}tree[mxe<<4];

vector<int> Vx;
vector<array<int,4> > V;

int N;
int x1,x2,y1,y2;

void pushup(int rt){
	tree[rt].val=tree[rt<<1].val+tree[rt<<1|1].val;
}
void build(int rt,int l,int r){
	if(l==r){
		tree[rt]={0,Vx[r]-Vx[r-1]};
		return;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	pushup(rt);
}
void settag(int rt,int tag){
	tree[rt].val.minv=tree[rt].val.minv+tag;
	tree[rt].t=tree[rt].t+tag;
}
void pushdown(int rt){
	if(tree[rt].t){
		settag(rt<<1,tree[rt<<1].t);
		settag(rt<<1|1,tree[rt<<1|1].t);
		tree[rt].t=0;
	}
}
void modify(int rt,int l,int r,int x,int y,int k){
	if(x<=l&&r<=y){
		tree[rt].t+=k;
		tree[rt].val.mincnt+=(r-l+1)*k;
		return;
	}
	pushdown(rt);
	int mid=l+r>>1;
	if(x<=mid) modify(rt<<1,l,mid,x,y,k);
	if(y>mid) modify(rt<<1|1,mid+1,r,x,y,k);
	pushup(rt);
}
void solve(){
	cin>>N;
	for(int i=1;i<=N;i++){
		cin>>x1>>x2>>y1>>y2;
		Vx.push_back(x1);
		Vx.push_back(x2);
		V.push_back({y1,1,x1,x2});
		V.push_back({y2,-1,x1,x2});
	}
	sort(V.begin(),V.end());
	sort(Vx.begin(),Vx.end());
	Vx.erase(unique(Vx.begin(),Vx.end()),Vx.end());
	int m=Vx.size()-1;
	int last=0;
	build(1,1,m);
	int totlen=tree[1].val.mincnt;
	int ans=0;
	for(auto it:V){
		int cov=totlen;
		if(tree[1].val.minv==0){
			cov=totlen-tree[1].val.mincnt;
		}
		ans+=(it[0]-last)*cov;
		last=it[0];
		int x1=lower_bound(Vx.begin(),Vx.end(),it[2])-Vx.begin()+1;
		int x2=lower_bound(Vx.begin(),Vx.end(),it[3])-Vx.begin();
		if(x1>x2) continue;
		modify(1,1,N,x1,x2,it[1]);
	}
	cout<<ans<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
	while(__--)solve();return 0;
}

二维数点

题意:

思路:

二维数点本质上也是扫描线,即枚举一个指针,去枚举一棵线段树

在这里,枚举纵坐标,线段树维护一个横坐标区间内有多少点

这道题也用了离线的思想,将询问排序,在维护线段树的同时维护答案数组

具体的看代码就懂

Code:

#include <bits/stdc++.h>

#define y1 Y1
#define low(x) (x&(-x))
#define int long long

using namespace std;

const int mxn=2e5+10;
const int mxe=2e5+10;
const int mod=1e9+7;

vector<int> Vx;
vector<array<int,4> > V;

int N,Q,x,y;
int x1,x2,y1,y2;
int ans[mxn],tr[mxn];

void add(int x,int k){
	for(int i=x;i<=N;i+=low(i)) tr[i]+=k;
}
int sum(int x){
	int res=0;
	for(int i=x;i;i-=low(i)) res+=tr[i];
	return res;
}
void solve(){
	cin>>N>>Q;
	for(int i=1;i<=N;i++){
		cin>>x>>y;
		Vx.push_back(x);
		V.push_back({y,0,x});
	}
	for(int i=1;i<=Q;i++){
		cin>>x1>>x2>>y1>>y2;
		V.push_back({y1-1,2,x1-1,i});
		V.push_back({y2,2,x2,i});
		V.push_back({y2,1,x1-1,i});
		V.push_back({y1-1,1,x2,i});
	}
	sort(V.begin(),V.end());
	sort(Vx.begin(),Vx.end());
	Vx.erase(unique(Vx.begin(),Vx.end()),Vx.end());
	for(auto it:V){
		if(it[1]==0){
			int xx=lower_bound(Vx.begin(),Vx.end(),it[2])-Vx.begin()+1;
			add(xx,1);
		}else{
			int xx=upper_bound(Vx.begin(),Vx.end(),it[2])-Vx.begin()+1-1;
			int t=sum(xx);
			if(it[1]==1) ans[it[3]]-=t;
			else ans[it[3]]+=t;
		}
	}
	for(int i=1;i<=Q;i++) cout<<ans[i]<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
	while(__--)solve();return 0;
}

区间不同数之和

题意:

 

思路:

枚举一个指针,单独考虑每个元素的贡献

对于每个元素都去每个区间更新贡献,这些区间指的是a[r]只出现一次的所有区间,同时维护离线了的答案区间

枚举+序列DS=扫描线

 Code:

#include <bits/stdc++.h>

#define low(x) (x&(-x))
#define int long long

using namespace std;

const int mxn=2e5+10;
const int mxe=2e5+10;
const int mod=1e9+7;

vector<pair<int,int> > V[mxn];

int N,Q,l,r;
int tr[mxn];
int a[mxn],pre[mxn],ans[mxn];

void add(int x,int k){
	for(int i=x;i<=N;i+=low(i)) tr[i]+=k;
}
int sum(int x){
	int res=0;
	for(int i=x;i;i-=low(i)) res+=tr[i];
	return res;
}
void solve(){
	cin>>N>>Q;
	for(int i=1;i<=N;i++){
		cin>>a[i];
	}
	for(int i=1;i<=Q;i++){
		cin>>l>>r;
		V[r].push_back({l,i});
	}
	//枚举一个指针,单独考虑每个元素的贡献
	//对于每个元素都去每个区间更新贡献,这些区间指的是a[r]只出现一次的所有区间,同时维护离线了的答案区间
	//枚举+序列DS=扫描线
	for(int r=1;r<=N;r++){
		int p=pre[a[r]];
		add(p+1,a[r]);
		add(r+1,-a[r]);
		pre[a[r]]=r;
		for(auto it:V[r]) ans[it.second]=sum(it.first);
	}
	for(int i=1;i<=Q;i++) cout<<ans[i]<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
	while(__--)solve();return 0;
}

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

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

相关文章

k8s的资源配置清单的管理操作

目录 一、资源配置清单1.1 初步认识资源清单中svc的重要配置项1.2 手动编写 svc资源配置1.3 手动生成模板&#xff0c;再编写资源清单1.4 写yaml太累怎么办&#xff1f;1.5 官网下载资源模板 一、资源配置清单 Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#…

HOT45-二叉树的右视图

leetcode原题链接&#xff1a;二叉树的右视图 题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,n…

django celery简单 例子

django celery简单 例子 https://docs.celeryq.dev/en/latest/django/first-steps-with-django.html pip list pip install Django4.2.3 pip install redis4.6.0 pip install celery5.3.1 pip install SQLAlchemy2.0.17 source demo1_venv/bin/activate django-admin start…

激光雷达在ADAS测试中的应用与方案

在科技高速发展的今天&#xff0c;汽车智能化已是必然的趋势&#xff0c;且自动驾驶汽车的研究也在世界范围内进行得如火如荼。而在ADAS测试与开发中&#xff0c;激光雷达以其高性能和高精度占据着非常重要的地位&#xff0c;它是ADAS测试与开发中不可缺少的组成。 一 激光雷达…

sendRedirect进行页面重定向无反应

问题 sendRedirect进行页面重定向无反应 详细问题 笔者使用ServletJSP作为技术框架&#xff0c;使用AJAX进行数据请求&#xff0c;后程序运行完成 response.sendRedirect("请求链接");并没有按照笔者预期&#xff0c;进行页面重定向 请求端核心代码 $.ajax({url…

nginx报403 Forbidden错误

nginx是以root启动的&#xff0c;将 "user nobody" 改为 "user root" 刷新一下配置&#xff1a; /usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload

PCL点云处理之细小空洞填补 (一百九十八)

PCL点云处理之细小空洞填补 (一百九十八) 一、算法介绍二、具体实现1.代码2.结果一、算法介绍 点云扫描过程中,由于遮挡或其他原因,可能存在一些细小空洞,有可能造成数据处理上一些问题,这里介绍一种填补细小空洞的方法。具体方法和效果如下所示 二、具体实现 1.代码…

SpringBoot3【⑤ 核心原理】

1. 事件和监听器 1. 生命周期监听 场景&#xff1a;监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件&#xff1b; 1.1. 编写SpringApplicationRunListener 这个接口的实现类 1.2. 在 META-INF/spring.factories …

前端Vue组件Mixin技术

前端vue组件开发的一大优势在于可以提高代码的复用性。极大的提升开发效率&#xff0c;通过Mixin技术&#xff0c;我们可以实现类似继承的效果&#xff0c;组件的复用性可以得到加强。 当我们开发前端项目时&#xff0c;可能会定义非常多的组件&#xff0c;这些组件中可能有部…

SpringBoot3【⑥ 场景整合:①NoSQL:Redis】

0. Docker安装 输入如下参数 sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.reposudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo syst…

Jupyter Notebook的内核添加新的虚拟环境

最近&#xff0c;在搭建环境的时候发现 Jupyter Notebook 的内核只有基础的python和pytorch&#xff0c;现在我想要在 Jupyter Notebook 中使用新的虚拟环境。 下面是解决的方法&#xff1a; &#xff08;1&#xff09;首先在Anaconda Prompt中激活虚拟环境&#xff0c;比如我…

Android TV:自定义Leanback的VideoDetailsFragment

在Android studio新建TV项目的demo上做修改,实现一下需求: 1、去掉顶部背景区域 2、修改中间详情区域高度 3、修改整体背景界面 效果如图: 搜遍全网,没有找到一个解决方案。只能考自己看代码来自定义实现了。 1、去掉顶部背景区域: VideoDetailsFragment中重写setupD…

SpringBoot 的 概念、创建和运行

目录 1.什么是Spring Boot&#xff1f; 为什么要学Spring Boot&#xff1f; SpringBoot的优点 Spring Boot 项目创建 前置工作&#xff1a;配置国内源 使用 idea 创建 Spring Boot 项目 网页版创建&#xff08;了解&#xff09; 拓展&#xff1a;删除 项目中无用的目录和…

Matlab学习-轨迹热力图绘制

Matlab学习-轨迹热力图绘制 参考链接&#xff1a; MathWork-scatter函数使用 问题需求&#xff1a; 需要将轨迹上的点另一维信息同时显示在图上&#xff0c;比如横纵向误差等&#xff0c;这个时候画轨迹与误差的热力图就能很好同时反应位置和定位误差之间的关系&#xff1b;…

缓冲流~~

1&#xff1a;概述 缓冲流也称高效流&#xff0c;或者高级流。之前学习的字节流可以称为原始流。作用&#xff1a;缓冲流自带缓冲区&#xff0c;可以提高原始字节流&#xff0c;字符流读写数据的性能。 可以提高读写数据的效率。它通过在内存中创建缓冲区来减少对底层数据源的…

MATLAB图像处理实现高光抑制

下面是的几个用MATLAB进行高光抑制的处理例子。 1. 基于最大值滤波的亮光抑制方法 原理是用某像素周围一定大小的邻域中的最大值减去该像素值&#xff0c;可达到亮光抑制的效果。在MATLAB中&#xff0c;可以使用mat2gray函数将图像归一化后&#xff0c;再使用imextendedmax函…

Android Stuido Proguard Retrace Unscrambler直接reProguard反混淆retrace日志

Android Stuido Proguard Retrace Unscrambler直接reProguard反混淆retrace日志 &#xff08;1&#xff09;如果Android Studio里面没有安装下列插件之一的&#xff0c;在Settings的Plugins里面安装其中一个&#xff1a; &#xff08;2&#xff09;菜单栏中的code里面找到反混…

sphinx pdoc 生成API文档

文章目录 sphinxinstall pdoc sphinx install pip install sphinx sphinx_rtd_theme sphinx-autobuild pip install recommonmark sphinx_markdown_tables sphinx-quickstart 选 y Project language [en]: zh_CN conf.py: import sys sys.path.append(..)extensions [sph…

Word公式大括号左对齐

1、大括号公式如下&#xff1a; 2、依次选中每一行&#xff0c;然后在开头输入一个&&#xff0c;然后回车&#xff1a; 3、当最后一行输入完立马可以发现左对齐了&#xff1a; The higher I got, the more amazed I was by the view.

docker安装maven私服nexus及其配置使用

目录 docker搭建nexus登录私服管理后台重置admin密码 配置仓库 docker搭建nexus 下载 Nexus3 镜像 docker pull sonatype/nexus3创建宿主机挂载目录 mkdir –vp /usr/local/nexus-data记得修改权限 chmod 775 /usr/local/nexus-data创建 Nexus3 容器 docker run --privile…