zoukankan      html  css  js  c++  java
  • 算法总结——主席树(poj2104)

    题目:

    Description

    You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in the array segment. 
    That is, given an array a[1...n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: "What would be the k-th number in a[i...j] segment, if this segment was sorted?" 
    For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2...5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.

    Input

    The first line of the input file contains n --- the size of the array, and m --- the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000). 
    The second line contains n different integer numbers not exceeding 109 by their absolute values --- the array for which the answers should be given. 
    The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).

    Output

    For each question output the answer to it --- the k-th number in sorted a[i...j] segment.

    Sample Input

    7 3
    1 5 2 6 3 7 4
    2 5 3
    4 4 1
    1 7 3

    Sample Output

    5
    6
    3

    Hint

    This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.

    Source

    Northeastern Europe 2004, Northern Subregion

    题解:

      主席树模板题,关于主席树的知识见下:

      

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<ctime>
    #include<cctype>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std;
    const int N=1e5+5;
    struct node
    {
      int l,r,sum;
    }tree[N*20];
    inline int R()
    { 
      char c;int f=0,i=1;
      for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
      if(c=='-') i=-1,c=getchar(); 
      for(;c<='9'&&c>='0';c=getchar())
        f=(f<<3)+(f<<1)+c-'0';
      return f*i;
    }
    int num[N],a[N],n,m,root[N],tot;
    inline void build(int v,int &k,int l,int r)
    {
      tree[++tot]=tree[k],k=tot;tree[k].sum+=1;
      if(l==r)  return;
      int mid=(l+r)/2;
      if(v<=mid)  build(v,tree[k].l,l,mid);
      else build(v,tree[k].r,mid+1,r);
    }
    inline int query(int t1,int t2,int l,int r,int k)
    {
      if(l==r)  return l;
      int mid=(l+r)/2,tot=tree[tree[t2].l].sum-tree[tree[t1].l].sum;
      if(k<=tot)  return query(tree[t1].l,tree[t2].l,l,mid,k);
      else return query(tree[t1].r,tree[t2].r,mid+1,r,k-tot);
    }
    int main()
    {
      //freopen("a.in","r",stdin);
      while(scanf("%d%d",&n,&m)!=EOF)
      {
        int p,q,k;tot=1;
        for(int i=1;i<=n;i++)
          num[i]=R(),a[i]=num[i];
        sort(a+1,a+n+1); 
        for(int i=1;i<=n;i++)
          num[i]=lower_bound(a+1,a+n+1,num[i])-a;
        for(int i=1;i<=n;i++)
        {
          root[i]=root[i-1];build(num[i],root[i],1,n);
        }
        for(int i=1;i<=m;i++)
        {
          p=R(),q=R(),k=R();
          cout<<a[query(root[p-1],root[q],1,n,k)]<<endl;
        }
      }
      return 0;
    }
  • 相关阅读:
    unity小记
    Animator 设置动画效果
    Animation(动画效果)
    蜜蜂游戏 小结
    unity 协同
    camera render texture 游戏里的监控视角
    Mybatis框架 第一天
    BOS项目 第12天(总结)
    BOS项目 第11天(activiti工作流第三天,流程实例管理、项目中的用户和角色同步到activiti的用户和组表、设计物流配送流程、启动物流配送流程、组任务操作(查询、拾取)、个人任务操作(查询、办理))
    BOS项目 第10天(activiti工作流第二天,流程变量、组任务、排他网关、spring整合activiti、项目中实现流程定义管理)
  • 原文地址:https://www.cnblogs.com/AseanA/p/7156269.html
Copyright © 2011-2022 走看看