首页 > 编程语言 >算法随笔——扫描线

算法随笔——扫描线

时间:2024-07-23 20:51:56浏览次数:11  
标签:begin end int len 算法 扫描线 随笔 define

https://www.acwing.com/solution/content/135911/

放个模板先

P5490 【模板】扫描线

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define re register
#define int ll
#define PII pair<int,int>
int read()
{
	int f=1,k=0;char c = getchar();
	while(c <'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();
	return k*f;
}

const int N = 8e5+5; //数组尽量开大点 16倍

int n;
vector<int> v;
struct node
{
	int x,y1,y2,k; //存储一条竖着的边
}a[N];
struct tree
{
	int len = 0,cnt = 0;
}t[N];
bool cmp(node a,node b)
{
	return a.x < b.x;
}
int tot;
int find(int x)
{
	return lower_bound(v.begin(),v.end(),x) - v.begin() + 1;
}
void pushup(int k ,int l,int r)
{
	if (t[k].cnt) t[k].len = v[r+1 - 1] - v[l - 1]; // cnt > 0表示该区间已完全覆盖,len改为区间长度
	else  t[k].len = t[k<<1].len + t[k<<1|1].len; //没有完全覆盖则从子节点获取len
}
void modify(int k,int l,int r,int x,int y,int v)
{
	if (x > r || y < l) return;
	if (x <= l && r <= y)
	{
		t[k].cnt += v;
		pushup(k,l,r); //当cnt变化时,len也会变, 因此这里也需要pushup
		return;
	}
	int mid = (l +r) >> 1;
	modify(k<<1,l,mid,x,y,v);
	modify(k<<1|1,mid + 1,r,x,y,v);
	pushup(k,l,r); // 正常pushup
}


signed main()
{
	cin >> n;

	for (int i  = 1;i <= n;i++)
	{
		int x1 = read(),y1 = read(),x2 = read(),y2 = read();
		a[++tot] = {x1,y1,y2,1}; //入边 -> 1
		a[++tot] = {x2,y1,y2,-1};//出边 -> -1
		v.push_back(y1);v.push_back(y2);
	}
	sort(v.begin(),v.end());
	sort(a + 1,a + tot + 1,cmp);
	v.erase(unique(v.begin(),v.end()),v.end()); //离散化
	int ans = 0;
	for (int i = 1;i <= tot;i++)
	{
		ans += (a[i].x-a[i-1].x) * t[1].len; //长 x 宽
		modify(1,1,v.size(),find(a[i].y1),find(a[i].y2)-1,a[i].k);//r-1是因为对应的区间下标少1
	}
	cout << ans << endl;
	return 0;
}

标签:begin,end,int,len,算法,扫描线,随笔,define
From: https://www.cnblogs.com/codwarm/p/18318874

相关文章

  • Aquila优化算法(基本原理+matlab源代码)—— 基于Aquila Optimizer原始论文分析
    Matlab源代码位于:AquilaOptimizer:Ameta-heuristicoptimizationalgorithm-FileExchange-MATLABCentral(mathworks.cn)1Aquila优化算法AO是一种基于种群优化方法,受启发于Aquila捕获猎物的方式。Aquila捕获猎物的方式主要有四种:(1)有垂直弯曲的高空翱翔(2)用短......
  • 大佬算法解题笔记--01
    分享一些大佬刷算法思路    资料来源于网络,侵删 ......
  • 图论基础与遍历算法
    图的逻辑结构及其实现图是由节点和边构成的,边分为有向边和无向边,对应有向图和无向图,逻辑结构如下:根据这个逻辑结构,我们可以实现每个节点: //节点需要存储自身的值,也需要存储与其邻接的节点 structVertex{   intval;//自身值 vector<Vertex*>neighbors;/......
  • XGBoost、RF随机森林算法MATLAB实现
    %加载并预处理训练数据opts1=detectImportOptions('附件一AE.xlsx','PreserveVariableNames',true);train_data=readtable('附件一AE.xlsx',opts1);train_data.Time=datetime(train_data.time,'InputFormat','yyyy-MM-ddHH:mm:s......
  • 代码随想录算法训练营Day7 | Leetcode 454 四数相加Ⅱ Leetcode 383 赎金信 Leetcode
    前言今天的四道题目稍稍有点难度,需要理解和反复记忆才行。四数相加类比于两数之和,赎金信类比于异位词,三数之和和四数之和自成体系,可以推广到n数之和。Leetcode454四数相加Ⅱ题目链接:454.四数相加II-力扣(LeetCode)代码随想录题解:代码随想录(programmercarl.com)思路:......
  • 代码随想录算法训练营Day5、6 | Leetcode 242 有效字母的异位词 Leetcode 349 两个数
    前言因为昨天休息所以把两天合并成一天来写,昨天把上周的题又重写了一遍,发现一些细节还是要注意。今天的题目都是查找,也涉及到了最近正在学的STL。Leetcode242有效字母的异位词 题目链接:https://leetcode.cn/problems/valid-anagram/description/代码随想录题解:代码随想......
  • 代码随想录算法训练营第四天 | Leetcode 24 两两交换链表中的节点 Leetcode 19 删除链
    前言今天链表的内容突出一个注意细节,判空条件,头节点是否为空等等。采用虚拟头节点可以方便链表进行更改,还需要学会使用临时变量。 Leetcode24两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/代码随想录题解:代码随想录(programmercarl.......
  • 代码随想录算法训练营第三天 | Leetcode 203 移除链表元素 Leetcode 206 翻转链表
    前言今天的两道题目都不难,但细节需要注意。如移除链表元素用到的虚拟头节点,翻转链表的思路。翻转链表真是写了忘,忘了写,希望这次能记住。除此之外我决定每天的记录里面增加一个总结八股的部分,将来二刷再翻看文章的时候顺便也能复习八股知识点。Leetcode203移除链表元素题目......
  • C++3算法比较第一期
    目录1.递推(Iteration)2.递归(Recursion)3.动态规划(DynamicProgramming,DP)递推、递归与动态规划的区别在C++编程中,递推、递归和动态规划是三种重要的算法思想,它们在解决复杂问题时各有特色。下面将分别介绍这三种算法思想,并探讨它们之间的区别。1.递推(Iteration)定义......
  • KMP算法中next数组以及nextval的求解(简单,通俗易懂版)
    以一个题为例:计算上图中next[j]以及nextval[j]的值。【本文中j的下标从1开始。】最长公共前后缀:···前缀:不包含最后一个字符的所有以第一个字符开头的连续子串。···后缀:不包含第一个字符的所有以最后一个字符结尾的连续子串。先看next[j],(1)j的下标......