首页 > 其他分享 >双指针与扫描线

双指针与扫描线

时间:2023-01-15 10:11:06浏览次数:35  
标签:子串 boring sum 扫描线 矩形 leqslant 指针

概述

  • 先空着。

例题

UVA1608 不无聊的序列 Non-boring sequences

  • 题意:判断 \(S\) 是否 boring。所谓 boring,就是存在 \(S\) 的子串 \(s\) 满足 \(s\) 中不存在只出现一次的元素。

  • 数据范围:\(n\leqslant 2\times 10^5\)。

  • 注意到 \(\forall l\in (pre_i,i],r\in [i,nxt_i)\),区间 \([l,r]\) 合法,这里 \(pre_i,nxt_i\) 表示和 \(i\) 相同的前驱/后继位置,若不存在则赋极小/极大。

  • 于是考虑构建二维平面,\(l\) 为 \(x\) 轴,\(r\) 为 \(y\) 轴,对每个 \(i\),我们将其转化为一个矩形覆盖。最后问题就是矩形面积并是否等于 \(\dfrac{n(n+1)}{2}\)。

  • 显然树套树无意义也不划算,使用扫描线+差分实现,\(O(n\log n)\)。

P3246 [HNOI2016] 序列

  • 题意:给定序列 \(a_{1\sim n}\),\(Q\) 组询问,形如求子串 \([l,r]\) 的所有子串的最小值之和。形式化地,求 \(\sum\limits_{l=L}^R \sum\limits_{r=l}^R \min_{i=l}^r a_i\)。

  • 数据范围:\(n,Q\leqslant 10^5\)。

  • 考虑 \(l,r\) 二维平面,发现只有满足 \(x\leqslant y\) 的点 \((x,y)\) 有意义,即一个左上三角。

  • 注意到 \(\forall L\leqslant l\leqslant r\leqslant R\),\((L,R)\) 在矩形 \((1,n),(l,r)\) 中,换言之,包含子串 \((l,r)\) 的所有串恰为二维平面上 \((l,r)\) 的左上矩形。

  • 考虑扫描线,并使用线段树维护,线段树上的节点维护一个 \(sum\) 表示对应 \((l,r)\) 的所有子串的最小值之和,即题目所求。

  • 为了维护我们的递推性,我们只能从右向左扫或者从下向上扫。

  • 首先考虑从右向左扫,注意到此时 \(l\) 每左移 \(1\),线段树上的点 \(r\) 的 \(sum\) 要加上 \(\min_{i=l}^r a_i\),并不相同,于是还得维护 \(mn\) 表示 \(l\sim r\) 的最小值,实质上将问题转化为 \(chkmin\) 和历史版本和,这是经典的。

  • 容易发现从下向上扫和从左向右扫并没有本质区别。

标签:子串,boring,sum,扫描线,矩形,leqslant,指针
From: https://www.cnblogs.com/weixin2024/p/17053127.html

相关文章

  • 指针与动态内存申请
    指针与动态内存申请:数组长度固定是因为在栈空间中大小是确定的,要使用的空间大小不确定,就需要使用堆空间。#include<stdio.h>#include<stdlib.h>#include<string.h>int......
  • 简单的指针
    指针也是一种变量,它所表示的不是数据的值,而是存储着数据的内存的地址。通过使用指针,就可以对任意指定地址的数据进行读写。虽然前面所提到的假想内存IC中仅有10位地址信号,......
  • leetcode算法入门 Day5 双指针(四)
    876.链表的中间结点给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。输入:[1,2,3,4,5]输出:此列表中的结点3(序......
  • Kotlin 空指针检查
    可空类型系统Kotlin利用编译时判空检查的机制几乎杜绝了空指针异常。虽然编译时判空检查的机制有时候会导致代码变得比较难写,但是不用担心,Kotlin提供了一系列的辅助工具,让......
  • 用指针数组的形式来比较两个有序数组数据与排序方式是否完全相同
    1#include<iostream>2#include<vector>3usingnamespacestd;4intmain()5{6inta[5]={1,2,3,4,5};//定义两个数组7intb[5]={1,2......
  • 指针
    1.内存 1.1什么是内存 内存是一种存储器,用来存放数据,程序,所有的程序都是加载到内存中运行的 1.2内存结构 内存由两部分组成,存储单元地址,和存储空间组成......
  • 空指针
     1.int*p=10就是给p变量存放地址为10值,这个是在定义的时候是给p变量赋地址值2.*p=10,就是给p变量的地址所指向的空间赋值为10,这个是p变量值所指向的地址空间赋值......
  • day2-双指针-977--59
     暴力解法      螺旋矩阵,边界条件有点多,要好好分析才可以  classSolution{public:vector<vector<int>>generateMatrix(intn){......
  • C语言指针统览
    前言本文对C语言指针和指针使用时的问题做一个概览性的总结,并对一些值得探讨的问题进行讨论。阅读本文,读者能达到统览C语言指针的目的。以下的讨论只针对32/64位机器。指针......
  • 算法入门(第二天)---双指针977,189
    977.有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。输入:nums=[-4,-1,0,3,10]输出:[0,1,......