首页 > 其他分享 >【学习笔记】扫描线

【学习笔记】扫描线

时间:2022-11-10 09:11:52浏览次数:76  
标签:int void mid 笔记 学习 len 扫描线 build

备战 NOIP 2022 填坑ing...

扫描线

思想就是把横边从小到大sort,拿条线从下往上扫,扫到横边算一下长度,再乘上两条横边的高度差,因为要求 \(O(nlogn)\) 的时间复杂度所以用线段树实现(还要对横坐标进行离散化)

还有就是空间要开大一点,最好开8倍(板子题我开了16倍)

先贴个板子,这篇博客主要记录有关的题

void build(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	if(l==r) return ;
	int mid=(t[p].l+t[p].r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
}

void push_up(int p)
{
	if(t[p].cnt) t[p].len=(x[t[p].r+1]-x[t[p].l]);
	else t[p].len=t[p*2].len+t[p*2+1].len;
}

void update(int p,int l,int r,int val)
{
	if(x[t[p].r+1]<=l || x[t[p].l]>=r) return ;
	if(l<=x[t[p].l] && x[t[p].r+1]<=r)
	{
		t[p].cnt+=val;
		push_up(p);
		return ;
	}
	update(p*2,l,r,val);
	update(p*2+1,l,r,val);
	push_up(p);
}

void work()
{
	for(int i=1;i<=n;i++)
	{
		int x1,y1,x2,y2;
		x1=read(),y1=read();
		x2=read(),y2=read();
		if(y1>y2) swap(y1,y2);
		x[i*2-1]=x1,x[i*2]=x2;
		line[i*2-1]={x1,x2,y1,1};
		line[i*2]={x1,x2,y2,-1};
	}
	
	n<<=1;sort(x+1,x+n+1);
	sort(line+1,line+n+1,cmp);
	int num=unique(x+1,x+n+1)-x-1;
	
	build(1,1,num-1);int ans=0;

	for(int i=1;i<n;i++)
	{
		update(1,line[i].l,line[i].r,line[i].val);
		ans+=t[1].len*(line[i+1].h-line[i].h);
	}
	
	printf("%lld",ans);
}

[IOI 1998] Picture

求周长并板子题

标签:int,void,mid,笔记,学习,len,扫描线,build
From: https://www.cnblogs.com/SitoASK/p/16875916.html

相关文章

  • 新的学习历程-python2 print
    1print('helloworld!')2print('hello','world!')#逗号自动添加默认的分隔符:空格3print('hello'+'world!')#加号表示字符拼接4print('hello','world',sep='***')......
  • JUC学习笔记——进程与线程
    JUC学习笔记——进程与线程在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的进程与线程部分我们会分为以下几部分进行介绍:进程与线程并发与并行同步与异......
  • Mysq学习(字符串类型、日期类型)
    一、字符串类型的基本使用其细节utf8编码格式:三个字节表示一个字符;ctf8varchar(size)size=(65535-3)/3=21844;gbk编码格式:两个字节表示一个字符;gbkvarchar(size)si......
  • 数字电路学习
    2022.11.91.状态机的分类一段式:只有一个alwaysblock,把所有的逻辑(输入、输出、状态)都在一个alwaysblock的时序逻辑中实现。这种写法看起来很简洁,但是不利于维护......
  • 笔记本电脑的wifi列表无法正常展示时的解决方法(个人经验)
    方法一、把笔记本所有的外接数据线全部拔除,然后长按开机键强制关机,然后开机,就行了方法二、按以下步骤操作1、打开设置键2、打开网络3、进行网络重置,等5分钟电脑重启......
  • 瑞芯微 | 摄像头ov13850移植笔记
    《1.瑞芯微rk356x板子快速上手》《2.Linux驱动|瑞芯微rtc-hym8563移植笔记》《3.Linux驱动|Linux内核RTC时间架构-基于瑞芯微》0、环境soc:rk3568board:EVB......
  • 新的学习历程-python1 Hello World
    1print('helloworld!')2if2>0:3print('ok')4print('yes')56x=3;y=47print(x+y)学习资源来自:张志刚老师python百例 《例解Python:Pyth......
  • 2022-11-9学习内容
    1.案例-购物车-数据库准备1.1MyApplication.java改为内部存储私有空间//内部存储私有空间Stringdirectory=getFilesDir().toString()+File.separatorCh......
  • MySql - 基础学习5 - select
    一.分页和排序--分页limit和排序orderby--排序;升序ASC,降序--升序SELECTs.`id`,`name`,`paw`,`gradename`FROMstudentASsINNERJOINgradeAS......
  • luffy学习-05
    一、协同开发在公司中,都是多人共同开发同一个项目组长本地创建出空项目,底层代码写完——>提交到远程仓库和同事们张三李四王麻子都要共同开发这个项目我们要把代码clo......