poj 1442 Black Box (treap树入门题)

 1 /****************************************************
 2 题目: Black Box(poj 1442)
 3 链接: http://poj.org/problem?id=1442
 4 题意: 给n个数,m个询问,对第i数个询问前Xi个数中第
 5         i小的是那个数。
 6 算法: treap树
 7 *****************************************************/
 8 #include<iostream>
 9 #include<algorithm>
10 #include<cstdio>
11 #include<cstring>
12 #include<cstdlib>
13 using namespace std;
14
15 typedef struct Node
16 {
17     Node *l,*r;
18     int val,pri;   ///val当前节点的值,pri当前节点的优先级
19     int sz;        ///子树的节点数
20     Node(int x)    ///构造函数初始化
21     {
22         l=r=NULL;
23         pri=rand();
24         val=x;
25         sz=1;
26     }
27 }Node;
28 Node *root;   ///根节点
29
30 int getsz(Node *T)   ///求子树的节点数
31 {
32     if (T==NULL) return 0;
33     return T->sz;
34 }
35
36 Node *L_rotate(Node *T) ///右节点的优先级大于当前节点,进行左旋转
37 {
38     Node *A=T->r;
39     T->r=A->l;
40     A->l=T;
41     A->sz=T->sz;
42     T->sz=getsz(T->l)+getsz(T->r)+1; ///T->l可能为空,要用getsz函数
43     return A;
44 }
45 Node *R_rotate(Node *T)   ///左节点的优先级大于当前节点,进行右旋转
46 {
47     Node *A=T->l;
48     T->l=A->r;
49     A->r=T;
50     A->sz=T->sz;
51     T->sz=getsz(T->l)+getsz(T->r)+1;
52     return A;
53 }
54 void inser(Node *&T,int val) ///插入函数,和二叉排序树差不多,多了个优先级的改变
55 {
56     if (T==NULL)
57     {
58         T=new Node(val);
59         return ;
60     }
61     T->sz++;
62     if (T->val>=val)
63     {
64         inser(T->l,val);
65         if ((T->l->pri)<(T->pri)) T=R_rotate(T); ///判断优先级并旋转
66     }
67     else
68     {
69         inser(T->r,val);
70         if ((T->r->sz)<(T->pri)) T=L_rotate(T);
71     }
72 }
73 int Find(Node *T,int k)  ///查找函数
74 {
75     int temp=getsz(T->l)+1;
76     if (temp==k) return T->val;
77     if (temp>k) return Find(T->l,k);
78     return Find(T->r,k-temp);
79 }
80
81 int a[100005];
82
83 int main()
84 {
85      int n,m;
86      root=NULL;
87      scanf("%d%d",&n,&m);
88      for (int i=1;i<=n;i++) scanf("%d",&a[i]);
89      int j=1;
90      for (int i=1;i<=m;i++)
91      {
92          int x;
93          scanf("%d",&x);
94          for (;j<=x;j++) inser(root,a[j]);
95          printf("%d\n",Find(root,i));
96      }
97 }
时间: 2024-12-26 09:27:49

poj 1442 Black Box (treap树入门题)的相关文章

POJ 1442 Black Box treap求区间第k大

题目来源:POJ 1442 Black Box 题意:输入xi 输出前xi个数的第i大的数 思路:试了下自己的treap模版 #include <cstdio> #include <cstring> #include <cstdlib> #include <ctime> using namespace std; struct Node { Node *ch[2]; int r; int v; int s; Node(){} Node(int v): v(v)

POJ 1442 Black Box(treap树)

题目链接:点击打开链接 思路:treap树模板题, 可以动态维护一个有序表, 支持在O(logN)的时间内完成插入.删除一个元素和查找第K大元素的任务. 当然, treap树能做到的还远远不止这些, 常常与其他数据结构嵌套. treap树是一种平衡二叉搜索树, 既满足堆的条件, 又满足排序二叉树的条件. 细节参见代码: #include <cstdio> #include <cstring> #include <algorithm> #include <iostr

POJ 1442 Black Box(优先队列)

题目地址:POJ 1442 这题是用了两个优先队列,其中一个是较大优先,另一个是较小优先.让较大优先的队列保持k个.每次输出较大优先队列的队头. 每次取出一个数之后,都要先进行判断,如果这个数比较大优先的队列的队头要小,就让它加入这个队列,队列头移到较小优先的队列中.然后当较大优先的数不足k个的时候,就让较小优先的队列的队头移到较大优先的队头中. 代码如下: #include <iostream> #include <cstdio> #include <string>

poj 1442 -- Black Box

Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7183   Accepted: 2920 Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empt

[ACM] POJ 1442 Black Box (堆,优先队列)

Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7099   Accepted: 2888 Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empt

poj 2182 Lost Cows(线段树经典题)

题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9152   Accepted: 5879 Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, th

poj 3841 Double Queue (AVL树入门)

1 /****************************************************************** 2 题目: Double Queue(poj 3481) 3 链接: http://poj.org/problem?id=3481 4 算法: avl树(入门) 5 *******************************************************************/ 6 #include<cstdio> 7 #inclu

POJ - 1469 COURSES (匈牙利算法入门题)

题意: P门课程,N个学生.给出每门课程的选课学生,求是否可以给每门课程选出一个课代表.课代表必须是选了该课的学生且每个学生只能当一门课程的. 题解: 匈牙利算法的入门题. #include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; const int maxn = 1005; int t; int k, s; int flag

Poj 2104 K-th Number 主席树模版题

题意:离线询问[l,r]区间第k大 题解:模版题,入门题 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map> #include <queue> #include <vector> #include <cstring> #include <iomanip> #include