首页 > 其他分享 >扫描线【模板】

扫描线【模板】

时间:2023-05-03 09:55:04浏览次数:42  
标签:rt cnt tr mid 扫描线 模板

扫描线

用离散线段树实现
时间复杂度\(O(n \log n)\)

P5490 【模板】扫描线

题目描述

代码

#include <bits/stdc++.h>
using namespace std;
#define mid (l+r)/2
#define lson l,mid,rt<<1
#define rson mid,r,rt<<1|1
#define int long long

const int maxn=2e5+10;
int n,y[maxn*2],ans;
struct tree{
  int l,r,len,cnt=0;
}tr[maxn*8];//pushup会多一层 
struct Line{
  int x,y1,y2,flag;
  bool operator <(const Line &rhs) const{
    return x<rhs.x; 
  }
}L[maxn*2];

void pushup(int rt){
  if(tr[rt].cnt>0) tr[rt].len=tr[rt].r-tr[rt].l;
  else tr[rt].len=tr[rt<<1].len+tr[rt<<1|1].len;
}

void build(int l,int r,int rt){
  tr[rt].l=y[l],tr[rt].r=y[r];
  if(r==l+1) return ;//叶子结点长度是2
  build(lson);build(rson); 
}

void update(int rt,int a,int b,int cnt){
  if(a>=tr[rt].r||b<=tr[rt].l) return;
  if(a<=tr[rt].l&&b>=tr[rt].r){
  	tr[rt].cnt+=cnt;pushup(rt);
  	return;
  }
  update(rt<<1,a,b,cnt);update(rt<<1|1,a,b,cnt);
  pushup(rt);
}

signed main(){
  /*2023.5.3 hewanying P5490 【模板】扫描线 扫描线*/ 
  scanf("%lld",&n);
  for(int i=1;i<=n;i++){
  	int X1,X2,Y1,Y2;
  	scanf("%lld%lld%lld%lld",&X1,&Y1,&X2,&Y2);
  	L[i]=(Line){X1,Y1,Y2,1};L[i+n]=(Line){X2,Y1,Y2,-1};
  	y[i]=Y1;y[i+n]=Y2;
  }
  n*=2;
  sort(L+1,L+n+1);sort(y+1,y+n+1);
  build(1,n,1);
  for(int i=1;i<n;i++){
  	update(1,L[i].y1,L[i].y2,L[i].flag);
  	ans+=(L[i+1].x-L[i].x)*tr[1].len;
  }
  printf("%lld\n",ans);
  return 0;
} 

标签:rt,cnt,tr,mid,扫描线,模板
From: https://www.cnblogs.com/hewanying0622/p/17368701.html

相关文章

  • django模板语法
    django模板语法代码{%loadstatic%}<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title>{#<linkrel="stylesheet"href="/static/plugins/b......
  • 【模板】快读快写
    快读inlineintread(){ intx=0;boolf=1;chars=getchar(); while(s<'0'||s>'9'){if(s=='-')f=0;s=getchar();} while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^48);s=getchar();} retur......
  • 可持久化字典树【模板】
    可持久化字典树P4735最大异或和#include<bits/stdc++.h>usingnamespacestd;constintmaxn=6e5+10;intn,m,sum[maxn],x,l,r,cnt=0;intch[maxn*25][2],ver[maxn*25],root[maxn];//ch表示字典树数组,ver表示每个接节点的版本(第几个字典树),root表示每个点所在的那个字典......
  • Django - json_script 模板语言,将queryset转换为前端json数据
     models.pyclassUser(models.Model):name=models.CharField(verbose_name="Name",max_length=64) serializer.pyclassUserSerializer(serializers.ModelSerializer):classMeta:model=Userfields=["name",......
  • Angular4_下拉框多选(支持响应式表单验证和模板驱动表单验证)
    支持Angular的响应式表单验证和模板驱动表单验证效果图:UsingwithTemplatedrivenFormsSkills*requiredAngularNameEmailAddress*requiredSubmitName [email protected]{"name":"","email&qu......
  • 区间不同数的个数 二维数点 扫描线 可持久化线段树
    二维数点,对于询问的\([l,r]\)区间我们只需要统计有多少个数上一次出现的位置\(pos\)满足\(pos\leql\),即可。template<classT>structBIT{Tc[N];intsize;voidresize(ints){size=s;}Tquery(intx){//1...xassert(x<=size);......
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有......
  • 第四篇:白话tornado源码之褪去模板外衣的前戏
    原笔记博客链接:https://www.cnblogs.com/wupeiqi/p/4592637.html 执行字符串表示的函数,并为该函数提供全局变量本篇的内容从题目中就可以看出来,就是为之后剖析tornado模板做准备,也是由于该知识点使用的巧妙,所有就单独用一篇来介绍了。废话不多说,直接上代码:#!u......
  • P7603 [THUPC2021] 鬼街(减半警报器模板)
    P7603[THUPC2021]鬼街(减半警报器模板)前言这是一个由lxl大佬提出的神奇trick,第一次省选集训的时候有点颓,听完了没写。刚好明天又要讲这个不如写篇题解。还是,我太弱了;所以又是研究一晚上才写出来,所以还是吧我对这道题的理解讲讲。正文何为折半报警器按照lxl的ppt上的......
  • 有序数组(类模板)
    一、问题描述:实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。每行输入的第一个数字为0,1,2或3:为0时表示输入结束;为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的......