【模板】 扫描线

模糊综合评价模型 一.引子 1.数学归纳法:同高中知识 2.秃子悖论:秃子悖论 这俩个例子都是类似于“量变引起质变”的道理,而在数学中我们把这类问题的性质叫做“模糊性”,在生活中我们也经常能遇到一些模糊的概念,比如年轻、帅、很少很多… 二.概述 模糊综合评价法是一种基于模糊数学的综合评价方法。该综合评价法根据模糊数学的隶属度理论把定性评价转化为定量评价,即用模糊数学对受到多种因素制约的事物或对象做出一个总体的评价。它具有结果清晰,系统性强的特点,能较好地解决模糊的、难以量化的问题,适合各种非确定性问题的解决。——来自百度百 阅读详情

模板题:https://www.luogu.org/problem/P5490 与 http://poj.org/problem?id=1151


扫描线从左向右扫,rwa[]数组表示整数值 i  对应的原始 y 坐标值。 c[i] 记录扫描线上第 i 段覆盖的次数,ans 每次累加上 len*(x2-x1)即可 ,朴素做法O(n^2) ,用线段树维护 c 数组后复杂度 O(n*longn)


//#include <bits/stdc++.h>
#include <iostream> 
#include <vector>
#include <algorithm>
#include <iomanip>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
const ll maxn = 1e6+100;

ll n,num,c[maxn];
ll x1[maxn],x2[maxn],y1[maxn],y2[maxn],raw[maxn];

struct sgt
{
	ll l,r,cnt;
	ll len;
}tree[maxn<<2];

struct node
{
	ll x,y1,y2;
	ll k;
	ll valy1,valy2;
}arr[maxn*2];

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

void build(ll now,ll l,ll r)
{
	tree[now].cnt = tree[now].len = 0;
	tree[now].l = l,tree[now].r = r;
	
	if(l == r)
		return ;
	
	ll mid = (l+r)/2;
	
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	return ;
}

void push(sgt &now,sgt &lt,sgt &rt)
{
	if(now.cnt > 0)
		now.len = raw[now.r+1] - raw[now.l];
	else
		now.len = lt.len + rt.len;
	return ;
}

void add(ll now,ll l,ll r,ll val)
{
	if(l <= tree[now].l && r >= tree[now].r)
	{
		tree[now].cnt += val;
		push(tree[now],tree[now*2],tree[now*2+1]);
		return ;
	}
	
	ll mid = (tree[now].l + tree[now].r)/2;
	
	if(l <= mid)
		add(now*2,l,r,val);
	if(r >= mid+1)
		add(now*2+1,l,r,val);
	
	push(tree[now],tree[now*2],tree[now*2+1]);
	return ;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
	
	while(cin >> n && n)
	{
		ll ans = 0;
		for(ll i = 1; i < maxn; i++)
		{
			c[i] = 0;
			raw[i] = 0;
		}
		
		ll len = 0;
		vector<ll>ty;
		for(ll i = 1; i <= n; i++)
		{
			cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
			ty.push_back(y1[i]);
			ty.push_back(y2[i]);
			
			arr[++len].k = 1;
			arr[len].x = x1[i];
			arr[len].y1 = y1[i];
			arr[len].y2 = y2[i];
			
			arr[++len].k = -1;
			arr[len].x = x2[i];
			arr[len].y1 = y1[i];
			arr[len].y2 = y2[i];
			
		}
		sort(ty.begin(),ty.end());
		ty.erase(unique(ty.begin(),ty.end()),ty.end());
		sort(arr+1,arr+1+len,cmp);
		
		for(ll i = 1; i <= len; i++)
		{
			arr[i].valy1 = lower_bound(ty.begin(),ty.end(),arr[i].y1) - ty.begin()+1;
			arr[i].valy2 = lower_bound(ty.begin(),ty.end(),arr[i].y2) - ty.begin()+1;
			raw[ arr[i].valy1 ] = arr[i].y1;
			raw[ arr[i].valy2 ] = arr[i].y2;
		}
		
		build(1,1,ty.size()-1);
		
		for(ll i = 1; i <= len; i++)
		{
			if(i > 1)
				ans += (arr[i].x-arr[i-1].x)*tree[1].len;
			
			ll low = arr[i].valy1,high = arr[i].valy2-1;
			add(1,low,high,arr[i].k);
		}
		
		num++;
		cout  << ans << endl;
	} 
	
    return 0;
}

O(n^2)代码

//#include <bits/stdc++.h>
#include <iostream> 
#include <vector>
#include <algorithm>
#include <iomanip>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
const ll maxn = 1e5+100;

ll n,num,c[maxn];
ld x1[maxn],x2[maxn],y1[maxn],y2[maxn],raw[maxn];

struct node
{
	ld x,y1,y2;
	ll k;
	ll valy1,valy2;
}arr[maxn*2];

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

int main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0),cout.tie(0);
	
	while(cin >> n && n)
	{
		ld ans = 0;
		for(ll i = 1; i < maxn; i++)
		{
			c[i] = 0;
			raw[i] = 0;
		}
		
		ll len = 0;
		vector<ld>ty;
		for(ll i = 1; i <= n; i++)
		{
			cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
			ty.push_back(y1[i]);
			ty.push_back(y2[i]);
			
			arr[++len].k = 1;
			arr[len].x = x1[i];
			arr[len].y1 = y1[i];
			arr[len].y2 = y2[i];
			
			arr[++len].k = -1;
			arr[len].x = x2[i];
			arr[len].y1 = y1[i];
			arr[len].y2 = y2[i];
			
		}
		sort(ty.begin(),ty.end());
		ty.erase(unique(ty.begin(),ty.end()),ty.end());
		sort(arr+1,arr+1+len,cmp);
		
		for(ll i = 1; i <= len; i++)
		{
			arr[i].valy1 = lower_bound(ty.begin(),ty.end(),arr[i].y1) - ty.begin()+1;
			arr[i].valy2 = lower_bound(ty.begin(),ty.end(),arr[i].y2) - ty.begin()+1;
			raw[ arr[i].valy1 ] = arr[i].y1;
			raw[ arr[i].valy2 ] = arr[i].y2;
		}
		
		for(ll i = 1; i <= len; i++)
		{
			if(i > 1)
			{
				ld h = 0;
				for(ll j = 1; j < ty.size(); j++)
				{
					if(c[j] > 0)
						h += (raw[j+1]-raw[j]);
				}
				ans += (arr[i].x - arr[i-1].x)*h;
				
				//cout << "答案 " << h << " " << ans << endl;
			}
			
			ll low = arr[i].valy1,high = arr[i].valy2-1;
			for(ll j = low; j <= high; j++)
			{
				c[j] += arr[i].k;	
			}			
		}
								
		num++;
		cout << "Test case #" << num << endl;
		cout << "Total explored area: " << fixed << setprecision(2) << ans << endl;
		cout << endl;
	} 
	
	
	
    return 0;
}

 

LiteratureReading:[2022] Reformer: The Efficient Transformer 所属机构:加州大学伯克利分校(U.C. Berkeley)和谷歌研究(Google Research)。电子邮件:kitaev@cs.berkeley.edu所属机构:谷歌研究(Google Research)。电子邮件:lukaszkaiser@google.com所属机构:谷歌研究(Google Research)。电子邮件:levskaya@google.com大型Transformer模型在许多任务上通常能够达到最先进的结果,但训练这些模型可能非常昂贵,尤其是在处理长序列时。 阅读详情

相关推荐

一阶电路基础知识

一阶电路(First-order circuit)是指由一个电感(L)或一个电容(C)和一个电阻(R)组成的电路。根据电感或电容的位置,一阶电路可以分为RC电路、RL电路、LC电路、RLC电路。一阶电路常用于滤波、放大、时序控制等各种电子设备和系统中。通过调整电阻、电容或电感的数值,可以改变电路的频率响应、滞后/提前相位等特性,实现不同的功能和性能一阶、二阶电路区别一阶电路由一个电容或一个电感与一个电阻组成,而二阶电路则由两个电容或两个电感与一个电阻组成。

weixin_45365488的博客 1万+

扫描线模板题

Atlantis There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your friend Bill ha

DaoCaoRen___的博客 521

用豆包+Skill从零制作AI漫剧:分镜、画面、配音到成片全流程

AI漫剧作为一种新兴内容形态,结合AI绘画与AI视频生成技术,正在改变短视频创作方式。其核心原理是利用提示词工程,将创意转化为结构化分镜脚本,再通过豆包等AI助手的Skill能力,将重复的脚本生成和分镜拆解流程固化为可复用的指令模板,从而大幅降低从构思到成品的生产门槛。这种模式无需剧组、演员和实景拍摄,让个人创作者也能借助图像生成、TTS配音与剪辑合成工具,批量化地生产剧情短片,适用于短视频平台连载、商业定制与个人IP打造。围绕豆包+Skill这条主线,从选题、剧本写作、分镜表设计,到画面提示词生成、视频片

weixin_29048309的博客 1531

Atlantis 【POJ - 1151】【扫描线模板题+线段树更新】

题目链接   是一道扫描线的模板题,也是我的第一道扫描线的题了,对扫描线也算是有了第一次的理解,无非就是更新新的向上的区间长度,然后去查询就是了,而查询是O(1)的,因为可以通过树的最上根节点得到的。 #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cmath&gt; #include &lt;string&gt;...

既然弱小,就只顾变强就是了 471

视觉SLAM十四讲--第13讲 实践:设计SLAM系统(最详细的代码调试运行步骤)

最详细的代码调试运行避坑说明,也包含了我自己对代码的理解,如有理解错误的地方,欢迎指正交流。

记录和分享 1万+

全栈开发指南:从前端到后端的全面掌握

全栈开发人员(Full Stack Developer)是指能够处理前端和后端开发工作的开发人员。他们需要掌握各种技术和工具,能够独立完成从需求分析、设计、开发到部署的整个流程。这篇博客将详细介绍全栈开发涉及的各个方面,为您提供从入门到进阶的指导。

Where there is a will, there is a way ! 3453

【模板】扫描线

主要讲一个关于计算几何的扫描线算法。。 基础算法:动态开点 + 离散化 你考虑面积求交转化成线段求交即可。 #include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define fi first #define se second #define db double using namespace std; const int Maxn=2e5+5; int n,rt,tot,cnt,cnt2,n

cqbzlydd的博客 179

嵌入式开发避坑指南:手把手教你用STM32CubeMX配置W9825G6KH SDRAM(含时序参数详解)

本文详细介绍了如何使用STM32CubeMX配置W9825G6KH SDRAM,包括硬件连接检查、CubeMX初始化步骤、时序参数优化及稳定性问题排查。通过实测波形分析和案例分享,帮助开发者避免常见配置错误,提升嵌入式系统性能与稳定性。

weixin_42542669的博客 197

[模板] 扫描线

一、扫描线求矩形面积并 如图所示 总矩形面积并等于每两根蓝线间的面积和。 考虑将矩形按x轴排序,只需要知道每个离散的x点上被矩形覆盖的长度, 和下一条扫描线的x轴可知之间面积为 所以只需要维护每一条扫描线的长度即可,线段树暴力维护 题目链接https://vjudge.net/problem/POJ-1151 线段树维护 const int MAXN = 1e6 + 1...

Zeolim的博客 626

27、单阶段目标检测算法(SSD):原理、训练与实战

本文详细介绍了单阶段目标检测算法SSD的原理、训练方法与实战应用。内容涵盖SSD的核心机制,如特征图离散化、边界框预测、损失函数设计及难负样本挖掘,并通过使用dlib车辆数据集从零开始训练SSD模型的完整流程展示了实际操作步骤。文章还讨论了训练中的关键问题,如边界框坐标处理和‘忽略区域’缺失的影响,提供了模型评估与优化策略,包括超参数调整、基础网络替换和数据增强。最后总结了SSD的优势与局限性,并展望了未来目标检测技术的发展方向。

nice1的博客 505

【YOLOv11多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1968

[luoguP5490] 【模板】扫描线

Title

Nowed 182

binning模式下和normal模式下相同曝光参数相同场景加权亮度差异消除方案优化(一)

摘要:针对ISP参数设置中浮点权重系数需转换为整数的问题,提出整数邻域搜索方案。该方法在浮点最优解附近(±1/±2)进行局部搜索,通过逐阶微调找到误差最小的整数权重组合,避免直接取整导致的误差反弹(误差从0.8%降至0.35%)。方案结合范围约束(1~15)和单调性约束(暗端递减、亮端递增),兼顾计算效率(单图耗时<10ms)与硬件兼容性,显著优于暴力搜索和简单取整,满足工程落地需求。

大熊 97

扫描线(模板向)

关于计算几何中的扫描线 推荐这篇大佬的博客和这篇 此篇博客仅作为个人的整理 扫描线一般适用于求几个矩形(有重叠)面积和或者周长和。 我们的办法类似这张图 PS:空间要开的足够大,我们这里的线段树跟普通线段是有差异,空间最好开8倍 。 求面积和模板(带离散化的版本): //本模板是从坐往右扫的,从下往上扫同理 #define ls (rt<<1) #define rs (rt<<1|1) LL cover[N*8];//存放i节点对应区间覆盖情况的值 LL n; LL len

ojzha的博客 445

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

扫描线线段树模板

#include<cstring> #include<algorithm> #include<cstdio> #include<cstdlib> #define lson rt<<1 #define rson rt<<1|1 #define fmid (tree[rt].l + tree[rt].r)>>1 us...

天道酬勤 265

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

扫描线模板

转自洛谷dalao NCC79601 扫描线: 扫描线:假设有一条扫描线从一个图形的下方扫向上方(或者左方扫到右方),那么通过分析扫描线被图形截得的线段就能获得所要的结果。该过程可以用线段树进行加速。 面积并: P5490 【模板】扫描线 由于都是矩形,因此运用扫描线以后,面积的求法其实可以简化为 \sum∑截线段长度\times×扫过的高度。这也是扫描线算法最基础的应用。 考虑以下这个简单的例子...

dajiangyou123456的博客 643

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【代码】扫描线模板

线段树,扫描线,区间并

Isaac Regulus的博客 171

扫描线 模板小记

扫描线(Scanline)模板小记扫描线(Scanline)模板小记扫描线(Scanline)模板小记 Algorithm:ScanlineAlgorithm:ScanlineAlgorithm:Scanline 扫描线算法 可以计算几何中图形并交问题 ProblemProblemProblem linklinklink 本质上是线段树 Tips:Tips:Tips: 横坐标需记录 注意分别是(i×2−1)(i\times 2-1)(i×2−1)和(i×2)(i\times 2)(i×2) 因为一条线段

绫 230

hdu 1828 Picture【扫描线求周长模板题】

上周在做ac自动机+dp这种混合的题时,就超不爽的,这周居然要做线段树+几何的题,我的内心上崩溃的o(>﹏既然不是自己做的,总还是要讲讲扫描线是个什么玩意== 扫描线,顾名思义,就是用一条线捋着各个边从下到上过一遍,每遍历一个高度的边,累加长度:点击打开链接 计算横线部分的方法:现在这次总区间被覆盖的长度和上一次总区间被覆盖的长度的差的绝对值:fabs(a[1].len - pre) 计算竖

MissZhou要努力 706

线段树扫描线模板及感悟

线段树扫描线模板及感悟 扫描线问题算是一个线段树问题的简单变种。模型是在一个平面内给n个有重叠部分的矩形,求其覆盖的面积。思路是将矩形的上下边界看作扫描线,同时离散化x坐标用线段树维护,维护的是离散后的每个区间不是离散后的点,是(n-1)个!!!!! 维护两个值,一个是cnt即覆盖在其上方的矩阵数量(可通过扫描线是矩形的上边界还是下边界,从而+1/-1来判断),另一个是sum即每个区间内被覆盖的长度。而每次增加的面积就是sum[1]乘以两条扫描线之间的高度差。 需要注意的是,因为我们每次只需要的是sum[1

qq_43412251的博客 205

扫描线「模板」

扫描线模板

qq_53504307的博客 432

模板:扫描线

矩形有重叠,求总面积。横纵两条扫描线:#include&lt;bits/stdc++.h&gt; using namespace std; double x[2002],y[2002];//最多100个矩形,所以最多只有200条横线或纵线 double a[1002][4];//矩形实际坐标,分别是左下角横、纵,右下角横、纵 bool cover[2002][2002]; c...

智浩的博客 587

P5490 【模板】扫描线

题解 学习博客↓ 题解 P5490 【【模板】扫描线】 【学习笔记】扫描线 扫描线建议纸上模拟一遍,这样才更加清晰 记几个重点: 假设从下往上扫描, 每条边按照 yyy 值坐标从小到大排序,标记其是矩形的上底(标记为+1),还是下底(标记为-1) 这样,对于每个矩形,扫描线总是会先碰到下边,然后再碰到上边 建立一棵线段树,其每个端点维护一条线段(也就是一个区间)的信息: 1.该线段被覆盖了多少次(...

Yubing792289314的博客 361

【扫描线】【模板】

Luogu P5490 洛谷终于没有板子题卡板子了,好感动 扫描线 常用来求矩形面积并(似乎还有周长并? ) 主要思想 将每个矩形看做两条线段,利用差分思想,一条+1,一条-1 将每个矩形这样转换后,X轴从左往右依次扫过去,维护在Y轴存在的线段 用线段树维护,其中一维离散 就是这样喵!复杂度O(nlogn)O(nlog_n)O(nlogn​) 具体还是看代码吧。。。(这个似乎是板子库的来着。。。还...

ygmjsjdboy的博客 184
上一篇: 【并查集+组合数】2019牛客暑期多校训练营(第九场) E All men are brothers
下一篇: 【PAM】回文自动机 && 回文树
Whyckck
博客等级 码龄9年 6粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值