笛卡尔

【UOJ424】count

北城以北 提交于 2020-01-16 17:52:06
题面 UOJ 题解 \(m>n\) 显然无解。 建出这个序列的笛卡尔树(如果大小相同则取最左的点),那么一颗笛卡尔数对应且只对应一种序列。 考虑这棵笛卡尔树的性质,就是往左儿子走它的数的大小必然减小至少 \(1\) ,而往右走是不一定减一的。 那么这棵笛卡尔树必须要满足从根往叶子节点走,向左走的次数 \(\leq m\) 。 考虑这个笛卡尔树的括号序列,就是说一个点每往左走就打一个 ( 然后回溯回来就打一个 ) ,向右儿子走则不管,注意一个点如果没有左儿子的话就直接上一个 () 。 设'('权值为 \(1\) ,')'权值为 \(-1\) ,那么这个括号序列需要满足的要求有: \(0\leq\) 前缀和 \(\leq m\) 。 将这个转成格路问题,就是从 \((0,0)\) 走整点到 \((n,n)\) ,其中每一步只能向右或向上走一格,且不能碰到直线 \(A:y=x+1,B:y=x-m-1\) ,问方案数。 将连续碰到一条直线看作一次碰撞(例如 \(ABBAAB\) 看作 \(ABAB\) ),那么可以枚举一次碰到什么直线,容斥计数即可。 代码 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm>

笛卡尔哲学世界里的理工科学习思想

社会主义新天地 提交于 2019-12-08 13:52:47
北京林业大学计算机类18-2 连月菡(181002222) 摘要: 笔者根据上课所学内容,以及笛卡尔哲学作品中汲取部分与理工科学习有着直接或间接关系的内容,既包含对人生的思考片段,也重新对理工科学习的思维方法进行了审视。由此文对笛卡尔的部分哲学理论的解释与总结——“理工科学生大多是笛卡尔主义者”这句话在四百多年前的笛卡尔哲学理论著作中得到了赫然的应验。 正文: 理工科不仅仅是以数理知识为基础的学科类别,研究数理工学,一方面有人热衷其与其他学科互相应和的契合奥妙,例如向日葵的花盘里的种子排列恰好符合斐波那契数列的规律。另一方面,它的确是被看作生产力的象征,直接或间接影响着科学技术的发展。而科学技术,毋庸置疑,在这个时代中是国家间用以抗衡的软实力。不仅仅有美丽的自圆其说的定理证明,还有人抱着实现某个科幻性设想去研究其应用。那么本来也就是数学家的笛卡尔究竟是如何与一代又一代的理工科学生在哲学上产生了勾连呢? 首先,理学工学并不是缥缈的玄学,也不是精炼的哲学。它是人们掌握正确的方法进行直观与演绎的综合结果。理工科学习像是在其上模拟前辈的操作,再按照同样的指导准则有所研究发展。笛卡尔提到下述要求,便符合理工科学习的特质。 在《个人思考》中,它提出六个指导心灵的规则,在此总结为: 1. 方法,对于探求事物真理是(绝对)必要的。 2. 应仅仅考察凭我们的心灵有完全把握的那些对象。 3.

[算法模版]笛卡尔树

旧街凉风 提交于 2019-12-04 04:31:43
[算法模版]笛卡尔树 本文全文引自OI-WIKI 具体链接见文末 本文介绍一种不太常用,但是与大家熟知的平衡树与堆密切相关的数据结构——笛卡尔树。 笛卡尔树是一种二叉树,每一个结点由一个键值二元组 \((k,w)\) 构成。要求 \(k\) 满足二叉搜索树的性质,而 \(w\) 满足堆的性质。一个有趣的事实是,如果笛卡尔树的 \(k,w\) 键值确定,且 \(k\) 互不相同, \(w\) 互不相同,那么这个笛卡尔树的结构是唯一的。上图: (图源自维基百科) 上面这棵笛卡尔树相当于把数组元素值当作键值 \(w\) ,而把数组下标当作键值 \(k\) 。显然可以发现,这棵树的键值 \(k\) 满足二叉搜索树的性质,而键值 \(w\) 满足小根堆的性质。 其实图中的笛卡尔树是一种特殊的情况,因为二元组的键值 \(k\) 恰好对应数组下标,这种特殊的笛卡尔树有一个性质,就是一棵子树内的下标是连续的一个区间(这样才能满足二叉搜索树的性质)。更一般的情况则是任意二元组构建的笛卡尔树。 构建 栈构建 我们考虑将元素按照键值 \(k\) 排序。然后一个一个插入到当前的笛卡尔树中。那么每次我们插入的元素必然在这个树的右链(右链:即从根结点一直往右子树走,经过的结点形成的链)的末端。于是我们执行这样一个过程,从下往上比较右链结点与当前结点 \(u\) 的 \(w\) ,如果找到了一个右链上的结点 \

形象化理解笛卡尔坐标系和极坐标系

自古美人都是妖i 提交于 2019-12-03 09:33:18
本文转载于: 猿2048 网站▷ https://www.mk2048.com/blog/blog.php?id=iahi22cbkj 在学些 OpenGL 的 Shader 绘图时,有两个坐标体系是绕不开的,而传统的二维坐标系(笛卡尔坐标系)并不能承载「环绕闭环」的图形(如星星、花朵、雪花等),它们最大的特点就是围绕一个中心点做图形循环,这就是极坐标系能够轻而易举做到的事情。 为了能够更好的理解极坐标系,我自己脑补了一个可视化的坐标系变换过程,能够更好的帮助大家理解。下面我通过手绘的方式来呈现这个过程: 为了验证上图第三个步骤是否正确,这里通过实际代码来绘画: 稍微修饰下,让花瓣更好看: 基于这种想象模式,我们还可以脑补出很多其他在笛卡尔坐标系中表现平平的图形,在极坐标系中出乎意料的样式: 来源: https://www.cnblogs.com/jiangshangbulao/p/11785561.html

Matlab中坐标系之间的转换

匿名 (未验证) 提交于 2019-12-03 00:26:01
pol2cart [x,y] = pol2cart(theta,rho) [x,y,z] = pol2cart(theta,rho,z) [x,y] = pol2cart(theta,rho) 将极坐标数组 theta 和 rho 的对应元素转换为二维笛卡尔坐标或 xy 坐标。 [x,y,z] = pol2cart(theta,rho,z) 将柱坐标数组 theta、rho 和 z 的对应元素转换为三维笛卡尔坐标或 xyz 坐标。 将矩阵 theta 和 rho 中对应条目定义的极坐标转换为二维笛卡尔坐标 x 和 y。 theta = [0 pi/4 pi/2 pi] theta = 0 0.7854 1.5708 3.1416 rho = [5 5 10 10] rho = 5 5 10 10 [x,y] = pol2cart(theta,rho) x = 5.0000 3.5355 0.0000 -10.0000 y = 0 3.5355 10.0000 0.0000 将矩阵 theta、rho 和 z 中对应条目定义的柱坐标转换为三维笛卡尔坐标 x、y 和 z。 theta = [0 pi/4 pi/2 pi]’ theta = 0 0.7854 1.5708 3.1416 rho = [1 3 4 5]’ rho = 1 3 4 5 z = [7 8 9 10]’ z =

POJ 2201 Cartesian Tree 【笛卡尔树】

放肆的年华 提交于 2019-11-30 10:02:40
构造笛卡尔树。 我用的是 排序+左旋 的方式,这种方式并不是最好的构造方式,先写出来再说,今天不行了,改天在学习其他的算法。 构树技巧:增加一个虚拟的根节点,根节点的value优先级最高,可以保证此节点一直是根节点。 这道题目的数据有点……,所以不需要判断不合法的,所有的数据都可以构成笛卡尔树,所以判断NO的就可以省了。。。。⊙﹏⊙b汗 排序+左旋: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int key, value, idx, lson, rson, fa; } a[50005]; struct renode { int fa, lson, rson, idx; } b[50005]; int n; bool cmp_key(const node &x, const node &y) { return x.key < y.key; } bool cmp_value(const node &x, const node &y) { return x.value < y.value; } void Insert(int now) { int j = now - 1; while (a[j].value > a[now].value) j =

poj 2201 Cartesian Tree 笛卡尔树

瘦欲@ 提交于 2019-11-30 10:02:05
→ 题目链接 ← 【想说的话】 谁能告诉我笛卡尔树有什么妙的用处啊.... 【题解】 裸笛卡尔树 笛卡尔树的定义题中已经说的挺完整的了 建树时,先把所有的点以key从小到大排序,然后从前往后插入到树中 具体实现方法为:从根节点开始扫,当找到一个点满足val[x]大于val[now]并且val[x的右儿子]小于val[now](假设我们维护的是大根堆)时,就把【now】的父亲设为【x】,【x】的右儿子设为【now】,【原x的右儿子】的父亲设为【now】,【now】的左儿子设为【原x的右儿子】,这样搞完之后的树依然满足笛卡尔树的性质 但是如果每次都从根节点开始扫的话,显然时间复杂度会被卡成O(n^2),这时候这时候我们发现为了满足笛卡尔树的性质,这个点插入到树中之后一定是在右链的最末端,并且之前下面的点都不会再访问了,因为每次我们只需要扫右链上的点就好了。 这样的话我们就可以用栈来维护现在右链的状态,从最下面往上扫,可以非常简单的想出,复杂度就变成了O(n)的了 【代码】 #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #define MAXN 50050 using namespace std; inline int rd(){ int x=0,y=1

POJ-2201 Cartesian Tree(笛卡尔树)

萝らか妹 提交于 2019-11-30 10:00:03
笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value。光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大;光看value的话,笛卡尔树有点类似堆,根节点的value是最小(或者最大)的,每个节点的value都比它的子树要大。 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <stack> #include <queue> #define maxn 50005 #define INF 1e9 typedef long long ll; using namespace std ; struct Node{ int l1, r1, pre, p, l2, r2; int k, v; }node[maxn]; int n, Stack[maxn]; void Build(){ Stack[ 1 ] = 1 ; int t = 1 ; for ( int i = 2 ; i <= n; i++){ while (t > 0 && node[Stack[t]].v > node[i].v) t--; if (t){ int d = Stack[t]; node[i].l1

POJ - 2201 Cartesian Tree(笛卡尔树-单调栈/暴跳父亲)

穿精又带淫゛_ 提交于 2019-11-25 22:19:49
题目链接: 点击查看 题目大意:给出n个节点的key和val,构造出其笛卡尔树的原型 笛卡尔树的定义: 所谓笛卡尔树,就是将给定的n个二元组(key,val)建成一棵树。使得: 如果只关注key,那么这是一棵二叉搜索树 如果只关注val,那么这是一个堆 对于任意三个节点fa,ls,rs,满足: key[ls]<key[fa]<key[rs] val[fa]>=max(val[ls],val[rs]) 题目分析:首先我们需要先知道怎么建立笛卡尔树,我们可以按照key进行排序,经过排序之后,在最右边的树链上操作,对于每一个节点的val寻找一下该节点需要插入的位置,需要满足的条件是当前节点插入后的val值满足条件比其上面的节点要大,比起下面的节点要小,找到合适的位置后,将原本的链断开,将x插入,并将原本x之下的那条链连接到x的左子树上,这样我们就成功插入一个节点x了 先说一下为什么要这样插点,因为我们需要满足二叉搜索树的条件并且已经提前按照key值非降排好序了,所以在插入节点x之前,树中的所有key值都比节点x的key值要小,若我们只关注key的话,那么直接把点x插入到主根root节点向右遍历最下面的那个节点的右儿子即可,也就是最右端树链的末端,因为同时需要满足对于val值建立小顶堆的条件,所以我们需要在最右端的树链上寻找一个合适的位置插入节点x,当找到合适的位置后