首页 > 其他分享 >线段树&树状数组

线段树&树状数组

时间:2023-08-16 22:35:19浏览次数:29  
标签:连通性 在线 树状 线段 然后 数组 考虑 强制

P4246

首先注意到两个点应该怎么联通,有可能直接走进去对吧,也有可能是绕一圈走过去,我们考虑整个在求连通性的时候最重要的是哪些点,是左上角,左下角,右上角和右下角,所以我们考虑维护他们之间的连通性。

然后连通性很好合并,所以我我们可以把这个东西搬上线段树维护一大段区间的四个角互相是否可达。

然后绕路的怎么办呢,对于前缀问能不能到达相邻点,再做往后的处理,先考虑绕左边再考虑绕到另一边去,两边连通性都出来了再考虑比较重要的两个点(起点和终点各自的相邻点)是否再能可达。

然后因为可达性的维护很容易,所以这个题实际上也是函数码出来了就基本上写完了。

CF757G

大码量狗屎

首先考虑不强制在线,不作修改应该怎么操作。

实际上这个题就是LCA那个题,可以直接离线掉做。

然后现在强制在线,怎么办呢,套主席树。

然后现在还要相邻的数交换,怎么办呢,考虑交换只会影响到这两个点,后面的取前缀和不关心顺序不变,前面的也不变,所以之际诶交换暴力重构主席树就行了。

不优美,时间复杂度是nlog2n的。

CF543E

考虑不强制在线怎么做,询问以权值排序,然后考虑排个序把点线段树上加进去就行了,像个弱智。

然后强制在线,套个主席树。

然后你看到这个畜生一样的空限。

你考虑优化,首先来个标记永久化,还不够,三个这么大的数组开不下。

然后这个题是怎么解决的呢。。。

你考虑lson和rson的数据范围大概是1<<23级别的,tag的数据范围大概是2e5级别的,我们认为他是1<<18级别的,然后我们发现这三个数可以拼成一个ULL,然后做法就是每个主席树节点有一个ULL,然后空间分成三份交给tag和lson和rson。

然后就卡过去了。

据说这题出题人非常想卡主席树但是还是没卡成,我决定还是。。。

写官方解法,不想拆位吃屎。

P4198

容易发现这玩意就是要求你斜率递增的情况下能取就取拿出来的长度。

首先考虑把所有楼房的斜率存下来,然后考虑合并区间实际上就是在一个区间里面二分出最近的不被拿下的斜率,然后从这个开始往后嗯找找到的最长的长度,如果对于每个都维护一个这个的话应该做一次合并是O(len)的。

的不需要每个都处理好,可以在pushup的时候直接调用query实现问询答案。

标签:连通性,在线,树状,线段,然后,数组,考虑,强制
From: https://www.cnblogs.com/kisara-no-inu/p/17636375.html

相关文章

  • 线段树
    线段树\(1.0\)线段树\(1.0\)可以实现对区间内的数加减,查询区间和的操作。例题【模板】线段树1原理定义l,r:分别表示节点表示的区间的左端点与右端点。sum:节点表示的区间\([l,r]\)内数组元素之和。add:lazy标记,表示这个节点以下的所有子节点中的叶子表示的数......
  • 差值数组不同的字符串
    给你一个字符串数组words,每一个字符串长度都相同,令所有字符串的长度都为n。每个字符串words[i]可以被转化为一个长度为n-1的差值整数数组difference[i],其中对于0<=j<=n-2有difference[i][j]=words[i][j+1]-words[i][j]。注意两个字母的差值定义为它们......
  • 线段树进阶-分裂合并
    前置知识动态开点权值线段树相信各位都会线段树合并我们考虑对于两棵权值线段树,由于动态开点的缘故,这两棵树都是不满的我们考虑能不能把这两棵树所保存的信息合并在一起我们考虑这么一件事就是说,由于树不满,我们可以暴力扫分为三种情况(设把\(b\)所在树并到\(a\)内,\(a\)......
  • 稀疏数组
    稀疏数组条件-需求:编写五子棋游戏中,有存盘退出和续上盘的功能-分析:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据-解决:稀疏数组稀疏数组介绍-当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组-稀疏数组的处......
  • 数组使用
    数组使用For-Each循环数组做方法入参数组做返回值publicclassDemo{//打印数组元素publicstaticvoidprintArray(int[]arrays){for(inti=0;i<arrays.length;i++){System.out.println(arrays[i]+"");}}//......
  • 数组的四个基本特点
    数组的四个基本特点-数组长度是确定的,数组一旦被创建,它的大小就是不可改变-其元素必须是相同类型,不允许出现混合类型-数组中的元素可以是任何数据类型,包括基本类型和引用类型-数组变量属引用类型,数组也可以看成对象,数组中的每个元素相当于该对象的成员变量-数......
  • 数组三种初始化
    三种初始化-静态初始化int[]a={1,2,3};Man[]mans={newMan(1,1),newMan(2,2)};-动态初始化int[]a=newint[2];a[0]=1;a[1]=2;-数组的默认初始化-数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个......
  • 把数组对象最外层某个属性的值赋值给子集
    /**功能需求:把数组对象最外层某个属性的值赋值给子集*arr:要操作的数组对象*propertyName:要操作的属性名*value:用来保存最外层对象属性的值*/functionassignValueToChildren(arr,propertyName,value)......
  • 存图之边集数组
    边集数组核心思想使用结构体存储图的起来点终点以及边权,同时也是用了深度搜索。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=100;intm,n,a,b,c;intvis[N];structen{ intu,v,w;}e[N];//边集voiddfs(intu){ vis[u]=true; for(inti=1......
  • 2.1 C++ STL 数组向量容器
    Vector容器是C++STL中的一个动态数组容器,可以在运行时动态地增加或减少其大小,存储相同数据类型的元素,提供了快速的随机访问和在末尾插入或删除元素的功能。该容器可以方便、灵活地代替数组,容器可以实现动态对数组扩容删除等各种复杂操作,其时间复杂度O(l)常数阶,其他元素的插入和删......