题意 给定一个全排列\(a\). 定义子区间\([l,r]\),当且仅当\(a_l + a_r = Max[l,r]\). 求\(a\)序列中子区间的个数. 题解 笛卡尔树上的启发式合并. \(2000MS\)的时限,\(1965MS\)卡过.. 还可以不建树,直接枚举区间,就可以用数组维护了.这种做法比较快. 代码 #include <bits/stdc++.h> #define FOPI freopen("in.txt", "r", stdin) #…
思路:笛卡尔树?(好像并不一定要建出来,但是可以更好理解) 提交:2次 错因:没有判左右儿子是否为空来回溯导致它T了 题解: 建出笛卡尔树,考虑如何计算答案: 先预处理每一个值出现的位置 \(pos[]\): 对于每一个有左右儿子的点,设他在原序列中的值为 \(mx\),根据笛卡尔树的性质,他比自己的子树中的任何一个元素都大 .这样, 我们遍历他的轻儿子中的元素 \(vl\) ,查询 \(pos[mx-vl]\) 是否在重子树中. 其实可以不建树,直接求出每个点作为最大值能够向左右扩展的区间,枚…
E. Lomsat gelral Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/problem/E Description You are given a rooted tree with root in vertex 1. Each vertex is coloured in some colour. Let's call colour c dominating in the sub…
Codeforces 题面传送门 & 洛谷题面传送门 首先这个 if 与 end 配对的结构显然形成一个树形结构,考虑把这棵树建出来,于是这个程序的结构就变为,对树进行一遍 DFS,到达某个节点时,按照顺序遍历其所有儿子,如果儿子是叶子节点则执行赋值操作,否则进入到对应子树中执行相应操作,如果一个节点所有儿子对应的操作都被执行了就回溯,不难发现该过程与原程序等价. 考虑树形 dp.可以发现对于一棵非叶节点,在首次进入这棵子树时,程序中 \(x\) 的值已经确定了--就是 if v 中 \(v\)…
题目链接:https://codeforc.es/contest/1156/problem/E 题目大意: 在数组p中可以找到多少个不同的l,r满足. 思路: ST表+并查集. ST表还是需要的,因为nlongn的预处理就可以O(1)查询.枚举所有的区间也就O(n^2). 因为是输入固定1-n,所以我可以设一个y数组表示数组p的值所对应的下标. (习惯输入为x数组) 我们考虑一个区间[l,r]这个区间最大值为i.(这里用ST表可以找到) [l,r]对答案的贡献为最大值i左边找一个值a,右边找一个…
可以用单调栈直接维护出ai所能覆盖到的最大的左右范围是什么,然后我们可以用这个范围暴力的去查询这个区间的是否有满足的点对,一个小坑点,要对左右区间的大小进行判断,只需要去枚举距离i最近的一段区间去枚举即可,复杂度On,如果不判断可以退化成n^2. 10 1 2 3 4 5 6 7 8 9 10 // ——By DD_BOND //#include<bits/stdc++.h> #include<functional> #include<algorithm> #inclu…
题意: 给一个n的排列,求满足a[l]+a[r]=max(l,r)的(l,r)对数,max(l,r)指的是l到r之间的最大a[p] n<=2e5 思路: 先用单调栈处理出每个点能扩展的l[i],r[i] 搜索以每个点为最大值时的贡献,对每个点只搜索它左边部分或右边部分最小的那个 可以证明,每个点最多被搜到logn次,类似于启发式合并的思想, 复杂度为nlogn 代码: #include<iostream> #include<cstdio> #include<algori…
题目链接:http://codeforces.com/contest/600/problem/E 给你一棵树,告诉你每个节点的颜色,问你以每个节点为根的子树中出现颜色次数最多的颜色编号和是多少. 最容易想到的是n*n的暴力,但是会超时.所以这里用到类似并查集的合并,对于每个子树颜色种数少的合并到颜色种数大的当中. 不懂的看代码应该可以明白. //#pragma comment(linker, "/STACK:102400000, 102400000") #include <alg…
Peterson loves to learn new languages, but his favorite hobby is making new ones. Language is a set of words, and word is a sequence of lowercase Latin letters. Peterson makes new language every morning. It is difficult task to store the whole langua…
考虑建一棵小根堆笛卡尔树,即每次在当前区间中找到最小值,以最小值为界分割区间,由当前最小值所在位置向两边区间最小值所在位置连边,递归建树.那么该笛卡尔树中的一棵子树对应序列的一个连续区间,且根的权值是这段区间的最小值. 在笛卡尔树上跑树形dp.设f[i][j]为在i子树对应棋盘中放j个车的方案数,且棋盘中只考虑这段区间在根的父亲高度上方的部分.转移考虑合并两棵子树再在新增加的矩形部分放车即可,捣鼓一下组合数. #include<iostream> #include<cstdio>…
[BZOJ2616]SPOJ PERIODNI Description Input 第1行包括两个正整数N,K,表示了棋盘的列数和放的车数. 第2行包含N个正整数,表示了棋盘每列的高度. Output 包括一个非负整数,表示有多少种放置的方案,输出答案mod 1000000007后的结果即可. Sample Input 5 2 2 3 1 2 4 Sample Output 43 HINT 对于100%的数据,有 N≤500,K≤500,h[i] ≤1000000. 题解:一看题就感觉应该是单调…
题面 请务必不要吐槽我的标签 传送门 思路 一个很重要的结论:原序列的一组同构的解等价于同一棵拥有$n$个节点的笛卡尔树 注意笛卡尔树的定义:父亲节点是区间最值,并且分割区间为左右部分 所以如果两个序列的笛卡尔树同构,那么他们的每一个区间最小值位置相同,也就是原题目中的同构条件了 一个很重要的结论:定义笛卡尔树节点的深度为根到这个节点的路径上向左走的次数,那么合法序列的笛卡尔树所有节点深度不超过$m$ 首先,我们可以定义区间的父节点是所有最值中最靠左的,那么容易得到,节点的左儿子中的所有权值严格…
题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的高度乘上左右边界的宽度求最大值就行了. 也可以用笛卡尔树上dp的方法搞一搞,即用每个结点权值和所在子树的大小分别表示高度和宽度.(建笛卡尔树的过程也用到了单调栈,作用是维护右链) 单调栈做法: #include<bits/stdc++.h> using namespace std; typedef…
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506 如图,求最大的矩形面积 思路: 笛卡尔树:笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value.光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大:光看value的话,笛卡尔树有点类似堆,根节点的value是最小(或者最大)的,每个节点的value都比它的子树要小(或者大). 笛卡尔树的构造算法:从右链插入,同时维护右链的递增或递减序列…
正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 \(n\)个人,每个人有\(c_i\)和\(d_i\)分别表示这个人所在的队伍的最少/最多人数. 然后要求将这些人分成编号连续的若干队使得队伍最多,并且求分队方案数. \(1\leq n\leq 10^6\) 解题思路 阴间题目... 为了方便计算先定义一个结构体(包含答案和方案数)和加法运算表示取最大值/相同加方案数作为答案. 设\(f_i\)表示以第\(i\)个作为末尾的答案,首先\(d_i\)…
洛谷题面传送门 一道笛卡尔树的 hot tea. 首先我们考虑一个非常 naive 的区间 DP:\(dp_{l,r}\) 表示区间 \([l,r]\) 的答案,那么我们考虑求出 \([l,r]\) 中最大值的位置所在的位置 \(p\),那么如果我们选取的 meeting 的位置 \(\le p\),那么显然 \([p+1,r]\) 部分的贡献都是 \(a_p\),\([l,p]\) 部分的总共先最小是 \(dp_{l,p}\),最优代价为 \(dp_{l,p}+a_p·(r-p)\),否则 \…
D. Wizards and Roads 题目连接: http://www.codeforces.com/contest/167/problem/D Description In some country live wizards. They love to build cities and roads. The country used to have k cities, the j-th city (1 ≤ j ≤ k) was located at a point (xj, yj). It…
2178 表达式运算Cuties  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值 数据可能会出现括号情况 还有可能出现多余括号情况 数据保证不会出现>maxlongint的数据 数据可能回出现负数情况 输入描述 Input Description 仅一行,即为表达式 输出描述 Output Description 仅一…
[题目分析] 本来是单调栈的题目,用笛卡尔树可以快速的水过去. 把每一个矩阵看成一个二元组(出现的顺序,高度). 然后建造笛卡尔树. 神奇的发现,每一个节点的高度*该子树的大小,就是这一块最大的子矩阵的可能解. 用二元组的第一个下标来限制,使它们在一块儿,然后堆的性质又限制了宽度以及高度. 计算,取最值即可. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath&g…
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算. 现给定一个未完成的表达式,例如+(*_),请你在横线处填入数字0 或者1 ,请问有多少种填法可以使得表达式的值为0 . 输入输出格式 输入格式: 输入文件名为exp.in ,共 2 行. 第1 行为一个整数 L,表示给定的表达式中除去横线外的运…
将两张表的情况全部列举出来 结果表: 列= 原表列数相加 行= 原表行数相乘     CROSS JOIN连接用于生成两张表的笛卡尔集. 在sql中cross join的使用: 1.返回的记录数为两个表的记录数乘积. 2.将A表的所有行分别与B表的所有行进行连接. 例如: tableA r1 r2 A B C D tableB r3 r4 1 2 3 4 select * from tableA cross join tableB; return: r1 r2 r3 r4 r1 r2 1 2 r…
[题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论(最下面,中间,成为了新的树根) [代码] #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; struct nod…
本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路. 多表连接简介 在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常. 因此,连接(Join)就是一种把多个表连接成一个表的重要手段. 比如简单两个表连接学生表(Student)和班级(Class)表,如图: 进行连接后如图: 笛卡尔积 笛卡尔积在SQL中的实现方式既是交叉连接(Cr…
笛卡尔树: 每个节点有2个关键字key.value.从key的角度看,这是一颗二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大:从value的角度看,这是一个堆. 题意:以字符串为关键字key,数字为关键字value,构造一个二叉搜索大堆,最后按要求中序遍历 笛卡尔树的构造. 建立笛卡尔树的O(n)的算法: 从别人博客里拷贝过来的,这里给出链接:http://hi.baidu.com/yy17yy/item/cd4edcf963944f6a3d148553 首先按key关键字进行排序…
没有join条件导致笛卡尔乘积 学过线性代数的人都知道,笛卡尔乘积通俗的说,就是两个集合中的每一个成员,都与对方集合中的任意一个成员有关联.可以想象,在SQL查询中,如果对两张表join查询而没有join条件时,就会产生笛卡尔乘积.这就是我们的笛卡尔乘积导致的性能问题中最常见的案例:开发人员在写代码时遗漏了join条件. 发生笛卡尔乘积的sql: select sum(project_fj.danjia*project_fj.mianji) from project_fj,orderform w…
本系列文章由birdlove1987编写.转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24601215 1.3D数学是一门和计算机几何相关的学科.计算几何则是研究用数值方法解决几何问题的学科. 3D数学解说怎样在3D空间中准确度量位置.距离和角度. 2.在3D数学里使用最广泛的度量体系是笛卡尔坐标系统.(笛卡尔数学由法国数学家Rene Descartes发明,并以他的名字命名) 3.关于数的类型:实数包括有理数和…
1,正常的笛卡尔右手坐标系,以屏幕右方为+X轴,屏幕上方为+Y轴,垂直屏幕向外为+Z轴,如下图,xy轴组成的平面为屏幕面 但由于THREE里的相机并不总是从屏幕正前方视角,还可以设置坐标系任意一个轴为正上方(类似于旋转坐标系),所以不同的设置会导致视角不一样 三维坐标系里的点坐标格式为(x,y,z),因此,绘制xyz轴的直线可以由以下坐标构成 X轴:(0,0,0)-(100,0,0) Y轴:(0,0,0)-(0,100,0) Z轴:(0,0,0)-(0,0,100)   2,相机所在位置posi…
Time Limit: 10 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 4 8 3 6 4 7 Sample Output 45 56 10 56 3 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HINT Solution 先求出后缀数组,两个后缀的最长公共前缀是它们之间height的最小值,对height建笛卡尔树,树上维护最大最小值即可. Cod…
话说我noip之前为什么要学这种东西... 简介 笛卡尔树(Cartesian Tree) 是一种二叉树, 且同时具有以下两种性质: 父亲节点的值大于/小于子节点的值; 中序遍历的结果为原序列. 笛卡尔树可以实现 \(O(n)\) 预处理, 均摊 \(O(1)\) 查询的序列rmq操作. 建立 由于第2条性质, 插入的新节点一定在二叉树的右子树链上. 维护一个右子树链的栈, 进行以下操作: 插入一个新节点 \(p\) 如果栈顶元素 \(u\) 的值小于 \(p\), 弹出 \(u\), 并将其设…
BZOJ SPOJ 直观的想法是构建笛卡尔树(每次取最小值位置划分到两边),在树上DP,这样两个儿子的子树是互不影响的. 令\(f[i][j]\)表示第\(i\)个节点,放了\(j\)个车的方案数. 设\(v\)是\(i\)的一个儿子,对于子树部分的转移,有\[f'[i][j]=\sum_{k\leq j}f[v][j-k]f[i][k]\] 求完子树贡献后,对于\(i\)节点代表的矩形,设高度是\(h\)宽度是\(w\),有\[f'[i][j]=\sum_{k\leq j}f[i][j-k]\…