首页 > TAG信息列表 > rson

CodeForces-1671E Preorder

Preorder 树型 dp + 思维 \(dp[i]\) 表示以 \(i\) 为根的子树通过变换有多少种不同的先序遍历 状态转移方程: 当左右子树不同,两个子树交换位置之后,没有重复的出现:\(dp[x] = dp[lson] * dp[rson] * 2\) 当左右子树相同时,两个子树交换位置后,会有相同的出现:\(dp[x] = dp[lson] * d

重探线段树

方差 题意 \(1e5\) 范围处理区间加,区间平均数,区间方差。 做时思路 明显区间方差是这道题目的关键,其他两个与模板并无不同。 这里我们思考一下如何处理区间方差。 方差的计算公式向下推就完事儿了。 令其中有 \(k=r-l+1\) 个元素。 \(s^2=\frac{\sum\limits ^r_{i=l} (\bar{x}-x_i)

转存

#include <bits/stdc++.h> #define endl putchar('\n') #define lson(x) tree[x].ch[0] #define rson(x) tree[x].ch[1] #define siz(x) tree[x].size #define fa(x) tree[x].fa #define lazy(rt) tree[rt].lazy #define sum(x) tree[x].sum #define val(x)

【考试总结】2022-05-01

a 观察能构成合法区间的条件就是奇数成对,同时每对奇数之间没有 \(0\) 使用一类线段树维护历史信息的手段来解决本题,为了规避麻烦的标记下放,可以将每个 “偶数个奇数” 的出现区间左右端点刻画出来并使用 \(r-l+1\) 来计算 同时在每个节点要支持 \(01\) 翻转的部分维护 “对未翻转

CF380C Sereja and Brackets

洛谷题面 线段树模板题。 题目分析 给定一个括号串和 \(m\) 次操作,每次操作求区间 \([l,r]\) 内最长合法括号子序列的长度。 题目分析 我们可以在普通线段树上再记录两个变量 \(lnum,rnum\),分别表示区间内未匹配的左括号的数量和未匹配的右括号的数量。 于是有: inline void pushup

HOTEL 旅馆

HOTEL 旅馆 这其实就是一个简单版的山海经(也就花了一晚上而已) 虽然暴力也能过,但是还是写个线段树更好一些,锻炼一下自己的能力 题目描述 OIER最近的旅游计划,是到长春净月潭,享受那里的湖光山色,以及明媚的阳光。作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿

CodeForces 1616H Keep XOR Low {a^b≤x} / CodeForces gym102331 Bitwise Xor {a^b≥x}(trie树 + 计数)

文章目录 CodeForces 1616H Keep XOR Lowproblemsolutioncode CodeForces gym102331 Bitwise Xorproblemsolutioncode CodeForces 1616H Keep XOR Low problem 洛谷链接 solution 虽然选的是一个子集,但本质还是二元限制。 这非常类似以前做过的题目,已知

LeetCode 236二叉树的最近公共祖先

菜鸡学习记录 题目链接:236. 二叉树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com) 这道题目是使用回溯的方法做的,感觉二叉树一般就是用回溯的方法去做。 找公共祖先,对于某一个节点来说,用lson和rson分别表示其左子树和右子树。 思路是先判断其左子树、右子树是否有p、q,如果有的

cf1010 D. Mars rover(树)

题意: 有一棵逻辑运算树,叶子节点为输入节点(IN),取值0/1;其他节点有AND/OR/XOR/NOT四种类型,并根据儿子节点取不同的值。输出为根节点的值。 初始每个输入节点的值给定(因此所有节点的值确定)。问单独改变每个输入节点的值而保持其他输入节点不变,输出是多少 思路: 二叉树,每个节点存储节

CF666E Forensic Examination(后缀自动机,可持久化线段树合并)

给你一个串\(S\),以及一个字符串数组\(T_{1,2,...m}\),\(q\)次询问,每次问\(S\)的子串\(S[p_l,...p_r]\)在\(T_{l...r}\)中的哪个串的出现次数最多,并输出出现次数。 做法: 对串\(S\)和数组\(T\)建立后缀自动机。 在后缀自动机上找到\(S[l,r]\)这个子串对应的节点u,这是一个经典操作。

初学 笛卡尔树

表示之前没见过这种东西。 概念 Link 构造 知乎 以下均假设原序列元素两两不相同。 从左至右依次加入元素,维护当前笛卡尔树的右耳子链 \[root\to rson\to rson.rson\to rson.rson.rson\dots \]至一个栈内。 设加入的节点为 \(x\),\(t\) 为当前笛卡尔树。 找到栈中最靠顶部的节点

线段树代码模板 → 点更新、区间查询

【算法代码】 #include<bits/stdc++.h> using namespace std; const int maxn=100005; const int inf=0x3f3f3f3f; int a[maxn]; struct node { int le,ri,mx; //mx represents the maximum value of interval [le,ri] } tree[maxn*4]; //Segment tree needs 4 times th

YBTOJ 取模问题

一道特别水的线段树基础题。 不过发生了一些有意思的事情: 我最开始没算复杂度,就直接去想怎么对区间取模操作写懒标记和pushdown。 其实因为取模不会进行太多次,而且在中间可以特判结束向下递归,因此直接单点修改即可。 #include<bits/stdc++.h> using namespace std; #define mid

P3332 - K大数查询 题解

好像是经典题(?),那就写一波题解罢。 BIT 套动态开点线段树 考虑查询,集合里的元素每个有两个指标:所在集合编号和自身权值,那么查询容易想到二分,二分的 chk 其实就是个二维数点。是动态的(实际上这个修改比动态加点强),二分的 chk 这玩意可以看作半在线,就暂时考虑在线动态维护二维数点了吧

P3224 [HNOI2012]永无乡(线段树合并)

支持加边和询问连通块第k大点权。 线段树合并即可。 //线段树合并 //每次合并两个连通块的权值线段树 //询问第k大 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int M=maxn*100; int c[M],lson[M],rson[M],T[maxn],tot; void pushup (int newRo

luogu P4719 【模板】动态 DP (LCT版)

方法二:LCT+矩阵乘法 上文中,我们用线段树来维护重链上的各种矩阵转移. 第二种方法是将树链剖分替换为动态树. 我们知道,矩阵乘法 $\begin{bmatrix} F_{u,0} & F_{u,0}\\ F_{u,1}  & -\infty \end{bmatrix}\times\begin{bmatrix} F_{i,0}\\F_{i,1} \end{bmatrix}=\begin{bmatrix} F

CF343D Water Tree

\(Solution:\) 树链剖分模板题,分两种问题维护 区间覆盖+单点查询 路径覆盖 \(Code:\) #include<bits/stdc++.h> #define int long long #define lson p<<1 #define rson (p<<1)|1 using namespace std; inline int read() { int x=0,f=1;char c=getchar(); while(c<

黑暗爆炸 - 4695 最假女选手 - 吉老师线段树

传送门 给一个区间[L,R] 加上一个数x 把一个区间[L,R] 里小于x 的数变成x 把一个区间[L,R] 里大于x 的数变成x 求区间[L,R] 的和 求区间[L,R] 的最大值 求区间[L,R] 的最小值 由吉老师线段树基础进阶。增加了区间加操作 但对于同时进行23操作的话,也多了一个特判,就是最大值修改时

hdu5306 Gorgeous Sequence - 吉老师线段树 区间取min操作

传送门 [l,r] 区间,把大于x的变成x 求区间最大值 求区间和 普通线段树不能做到区间取min操作,但是吉老师提出了一个方法传送门 在普通线段树基础上,每个结点维护的值有sum表示区间和,mx表示区间最大值,cnt表示区间最大值出现的次数,se表示区间次大值 其核心想法在于 当 \(m a \leq x

1479D.Odd Mineral Resource(可持久化线段树+树上差分+随机算法)

题意: 给出一棵树,每次询问两点之间是否存在一个l到r之间的数出现奇数次,找到这个数。 题解: 询问是否出现奇数次,用可持久化线段树套树上差分维护异或和。 找到这个数,不套随机数一直wa5,看了官方题解,里面有证明套随机数求解这个问题可以做到大概率正确。woc真的好难。 #include<bits/s

帆帆的 KD-Tree 全家桶

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1e5 + 50, INF = 0x3f3f3f3f; const double alpha = 0.75; inline int read () { register int x = 0, w = 1; registe

P2572 [SCOI2010]序列操作

写在前面 傻逼线段树题,码量第一次超 \(6.5k\) 因为不能考 \(NOIp\) 一气之下把它肝了(放屁,你是因为想看小说,而做数据结构不用脑子,好在DJ来的时候方便掩饰 个人感觉理解本题后会对线段树有更为深刻的理解,亦可增加对线段树的套路用法,了解各操作之间的优先级 本题解陈述尽量详细周全,若

P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 题解

Link P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 Solve 对于每个节点都减一颗权值线段树,然后再用差分的做法,最后统计答案的时候把线段树都合并起来,事实更新最优解 这道题主要是模板,细节蛮多的,要注意 Code #include<bits/stdc++.h> using namespace std; typedef long long

二叉树第k层节点数

1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef int ElemType; 4 5 typedef struct Node{ 6 ElemType data; 7 Node* lson; 8 Node* rson; 9 Node(ElemType data, Node* lson, Node* rson) { 10 this->data

联赛模拟测试21 表格

挺神仙的一道题,考场上打的30分的思路,作死没打线段树打的珂朵莉树,然后和暴力一个分......(其实考完后发现改过来也只得了十分,啊我内心平衡了.) 听说这道题四分树(二维线段树)可以得到不少的分,上一届学长不少都是\(O(n^2)\)碾过去的。 这里来说一下正解吧,个人感觉做这道题最起