zoukankan      html  css  js  c++  java
  • POJ2761---Feed the dogs (Treap求区间第k大)

    题意 就是求区间第k大,区间 不互相包含。

    尝试用treap解决一下 第k大的问题。

      1 #include <set>
      2 #include <map>
      3 #include <cmath>
      4 #include <ctime>
      5 #include <queue>
      6 #include <stack>
      7 #include <cstdio>
      8 #include <string>
      9 #include <vector>
     10 #include <cstdlib>
     11 #include <cstring>
     12 #include <iostream>
     13 #include <algorithm>
     14 using namespace std;
     15 typedef unsigned long long ull;
     16 typedef long long ll;
     17 const int inf = 0x3f3f3f3f;
     18 const double eps = 1e-8;
     19 const int maxn = 1e5+10;
     20 struct Node
     21 {
     22     Node *ch[2];
     23     int key, siz, r;
     24     Node (int val)
     25     {
     26         ch[0] = ch[1] = NULL;
     27         siz = 1;
     28         key = val;
     29         r = rand();
     30     }
     31     bool operator < (const Node &rhs)const
     32     {
     33         return r < rhs.r;
     34     }
     35     int cmp(int x)const
     36     {
     37         if (key == x)
     38             return -1;
     39         return key > x ? 0 : 1;
     40     }
     41     void maintain()
     42     {
     43         siz = 1;
     44         if (ch[0] != NULL)
     45             siz += ch[0] -> siz;
     46         if (ch[1] != NULL)
     47             siz += ch[1] -> siz;
     48     }
     49 };
     50 void rotate(Node* &root, int d)
     51 {
     52     Node *tmp = root -> ch[d^1];
     53     root -> ch[d^1] = tmp -> ch[d];
     54     tmp -> ch[d] = root;
     55     root -> maintain();
     56     tmp -> maintain();
     57     root = tmp;
     58 }
     59 void insert (Node* &root, int x)
     60 {
     61     if (root == NULL)
     62         root = new Node (x);
     63     else
     64     {
     65         int d = x < root -> key ? 0 : 1;
     66         insert(root -> ch[d], x);
     67         if (root -> ch[d] -> r > root -> r)
     68             rotate(root, d^1);
     69     }
     70     root -> maintain();
     71 }
     72 void dele(Node* &root, int x)
     73 {
     74     int d = root -> cmp(x);
     75     if (d == -1)
     76     {
     77         Node* tmp = root;
     78         if (root -> ch[0] != NULL && root -> ch[1] != NULL)
     79         {
     80             int d1 = (root -> ch[0] -> r > root -> ch[1] -> r  ? 1 : 0);
     81             rotate(root, d1);
     82             dele(root -> ch[d1], x);
     83         }
     84         else
     85         {
     86             if (root -> ch[0] == NULL)
     87                 root = root -> ch[1];
     88             else
     89                 root = root -> ch[0];
     90             delete tmp;
     91         }
     92     }
     93     else
     94         dele(root -> ch[d], x);
     95     if (root != NULL)
     96         root -> maintain();
     97 }
     98 int Get_kth(Node* root,int k)
     99 {
    100     if (root == NULL || k <= 0 || k > root -> siz)
    101         return 0;
    102     int s = (root -> ch[0] == NULL ? 0 : root -> ch[0] ->siz);
    103     if (s + 1 == k)
    104         return root -> key;
    105     else if (s >= k)
    106         return Get_kth(root -> ch[0], k);
    107     else
    108         return Get_kth(root -> ch[1], k - s -1);
    109 }
    110 struct Query
    111 {
    112     int l, r, k,idx;
    113     bool operator < (const Query &rhs)const
    114     {
    115         return r < rhs.r;
    116         //return l < rhs.l || (l == rhs.l&&r < rhs.r);
    117     }
    118 }Q[50005];
    119 int a[100005], ans[50005];
    120 Node* treap;
    121 int main()
    122 {
    123     #ifndef ONLINE_JUDGE
    124         freopen("in.txt","r",stdin);
    125     #endif
    126     int n, m;
    127     while  (~scanf ("%d%d",&n, &m))
    128     {
    129         for (int i = 0; i < n; i++)
    130             scanf ("%d", a+i+1);
    131         for (int i = 0; i < m; i++)
    132         {
    133             scanf ("%d%d%d",&Q[i].l, &Q[i].r, &Q[i].k);
    134             Q[i].idx = i;
    135             if (Q[i].l > Q[i].r)
    136                 swap(Q[i].l,Q[i].r);
    137         }
    138         sort (Q, Q+m);
    139         int index = Q[0].l, lidx = 0;
    140         for (int i = 0; i < m; i++)
    141         {
    142             for (int j = lidx; j && j < min(Q[i].l, Q[i-1].r+1); j++)
    143                 dele(treap, a[j]);
    144             lidx = Q[i].l;
    145             for (int j = max(Q[i].l,index); j <= Q[i].r; j++)
    146             {
    147                 insert(treap, a[j]);
    148             }
    149             index = Q[i].r+1;
    150             ans[Q[i].idx] = Get_kth(treap, Q[i].k);
    151 
    152         }
    153         for (int i = 0; i < m; i++)
    154         {
    155             printf("%d
    ",ans[i]);
    156         }
    157     }
    158     return 0;
    159 }
  • 相关阅读:
    iOS MVC <模型-视图-控制器>
    iOS interface building 大纲视图内容
    循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理 (转载)
    循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储(转载)
    ABP框架中一对多,多对多关系的处理以及功能界面的处理(2)(转载)
    ABP框架中一对多,多对多关系的处理以及功能界面的处理(1)(转载)
    电商商品数据库的设计和功能界面的处理 (转载)
    循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)(转载)
    循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)(转载)
    循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理(转载)
  • 原文地址:https://www.cnblogs.com/oneshot/p/4324763.html
Copyright © 2011-2022 走看看