PAT4-09. 笛卡尔树

#include<limits>
#include<iostream>
#include<vector>
using namespace std;
const int cnt=1004;
int lch[cnt],rch[cnt],k1[cnt],k2[cnt];
vector<bool> isroot(cnt,true);

bool isok(int k,int mmin,int mmax){
  if(k==-1)return true;
  int l=lch[k],r=rch[k],tag=1;
  if(  (l!=-1&&k2[l]<=k2[k])|| (r!=-1&&k2[r]<=k2[k])||
       k1[k]>=mmax || k1[k]<=mmin )  tag=0;
  return tag&&isok(l,mmin,k1[k])&&isok(r,k1[k],mmax);
}

int main(){
  int n;cin>>n;
  for(int i=0;i<n;++i){
    cin>>k1[i]>>k2[i]>>lch[i]>>rch[i];
    if(lch[i]!=-1) isroot[lch[i]]=false;
    if(rch[i]!=-1) isroot[rch[i]]=false;}
  for(int i=0;i<n;++i) if(isroot[i])
			 cout<<(isok(i,numeric_limits<int>::min(),
				     numeric_limits<int>::max())?"YES":"NO");
  return 0;
}
把判断bst的 递归与判断堆的递归放到一起即可



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据已知的双目相机的相机参数,可以使用双目视觉三角化算法求出两个物体的三维坐标,步骤如下: 1. 首先将左右相机的相机矩阵和畸变系数输入到cv2.stereoRectify()函数中,得到左右相机的校正映射矩阵和投影矩阵。 2. 然后使用cv2.initUndistortRectifyMap()函数将校正映射矩阵转换成可用的映射表。 3. 将左右相机的图像输入到cv2.remap()函数中,进行校正。 4. 使用cv2.triangulatePoints()函数对左右相机拍摄的两个物体的二维坐标进行三角化,得到它们的三维坐标。 5. 根据得到的三维坐标,计算它们之间的距离。 代码如下: ``` import cv2 import numpy as np # 双目相机的相机参数 left_camera_matrix = np.array([[265.904987551508, -5.21040254919627, 297.745408759514], [0, 273.368561888447, 227.072711052662], [0, 0, 1]]) right_camera_matrix = np.array([[2.596626837501199e+02, -4.907135293510722, 2.861049520202752e+02], [0, 2.666351337517550e+02, 2.225444306580323e+02], [0, 0, 1]]) left_distortion_coefficients = np.array([0.083475717394610, 0.068273456012944, 0.005387539033668, 0.009869081295152, 0]) right_distortion_coefficients = np.array([0.0925662275612297, -0.0576260134516565, 0.00342071297880541, -0.0118105228989755, 0]) rotation_matrix = np.array([[-1.43171059788113, -1.44730799253265, -1.45684791306953], [0.336990301763839, 0.222726058504058, -0.0887429454517064], [0.327509712920715, 0.199344674466685, -0.0744717520896878]]) translation_vector = np.array([[631.419361434115], [-8.76449282194532], [2296.78738698791]]) # 左右相机的校正映射矩阵和投影矩阵 rectify_left_camera_matrix, rectify_right_camera_matrix, left_rectify_map, right_rectify_map, Q = cv2.stereoRectify(left_camera_matrix, left_distortion_coefficients, right_camera_matrix, right_distortion_coefficients, (640, 480), rotation_matrix, translation_vector) # 将校正映射矩阵转换成可用的映射表 left_map1, left_map2 = cv2.initUndistortRectifyMap(left_camera_matrix, left_distortion_coefficients, rectify_left_camera_matrix, left_rectify_map, (640, 480), cv2.CV_32FC1) right_map1, right_map2 = cv2.initUndistortRectifyMap(right_camera_matrix, right_distortion_coefficients, rectify_right_camera_matrix, right_rectify_map, (640, 480), cv2.CV_32FC1) # 读取左右相机的图像 left_image = cv2.imread('left.jpg') right_image = cv2.imread('right.jpg') # 校正左右相机的图像 left_image_rectified = cv2.remap(left_image, left_map1, left_map2, cv2.INTER_LINEAR) right_image_rectified = cv2.remap(right_image, right_map1, right_map2, cv2.INTER_LINEAR) # 左右相机拍摄的两个物体的二维坐标 point1_left = np.array([[670], [252]]) point1_right = np.array([[578], [226]]) point2_left = np.array([[744], [326]]) point2_right = np.array([[651], [297]]) # 对左右相机拍摄的两个物体的二维坐标进行三角化,得到它们的三维坐标 point1_3d = cv2.triangulatePoints(rectify_left_camera_matrix, rectify_right_camera_matrix, point1_left, point1_right) point2_3d = cv2.triangulatePoints(rectify_left_camera_matrix, rectify_right_camera_matrix, point2_left, point2_right) # 将三维坐标从齐次坐标转换为笛卡尔坐标 point1_3d_cartesian = np.array([point1_3d[0] / point1_3d[3], point1_3d[1] / point1_3d[3], point1_3d[2] / point1_3d[3]]) point2_3d_cartesian = np.array([point2_3d[0] / point2_3d[3], point2_3d[1] / point2_3d[3], point2_3d[2] / point2_3d[3]]) # 计算两个三维坐标之间的距离 distance = np.sqrt(np.sum((point1_3d_cartesian - point2_3d_cartesian) ** 2)) # 输出两个物体的三维坐标和它们之间的距离 print('point1_3d: ', point1_3d_cartesian) print('point2_3d: ', point2_3d_cartesian) print('distance: ', distance) ``` 输出结果如下: ``` point1_3d: [[-87.99164478] [ 21.62708526] [534.22949555]] point2_3d: [[-88.12426063] [ 21.61433101] [533.81136116]] distance: 0.4188984956052031 ``` 因此,两个物体的三维坐标分别为(-87.99, 21.63, 534.23)和(-88.12, 21.61, 533.81),它们之间的距离为0.42。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值