静态主席树_POJ 3784

写在前面

最近在看动态修改的主席树,但是因为学校选修算法课,(等于白拿学分)所以做了几个题,突然看到一个十分熟悉的身影,哈哈,但是还是wa了一遍格式错误,这个就是一个裸的静态主席树

静态主席树的详解参见:https://blog.csdn.net/li1615882553/article/details/80941342

程序

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 0x3f3f3f3f
const int maxn = 10000;

using namespace std;
int t,n,cnt;
struct Node
{
    int l,r,sum;
}T[maxn*40];
vector<int> v;
int root[maxn],a[maxn];
int get_id(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}
void Init()
{
    cnt = 0;
    v.clear();
    memset(root,0,sizeof(root));
}
void Update(int l,int r,int &x,int y,int pos)
{
    T[++cnt] = T[y];
    T[cnt].sum++;
    x = cnt;
    if(l == r) return ;
    int mid = (l+r)>>1;
    if(mid >= pos) Update(l,mid,T[x].l,T[y].l,pos);
    else Update(mid+1,r,T[x].r,T[y].r,pos);
}
int Query(int l,int r,int y,int k)
{
    if(l == r) return l;
    int mid = (l+r) >> 1;
    int sum = T[T[y].l].sum;
    if(sum >= k) return Query(l,mid,T[y].l,k);
    else Query(mid+1,r,T[y].r,k-sum);
}
int main()
{
    int temp;
    scanf("%d",&t);
    while(t--)
    {
        Init();
        scanf("%d%d",&temp,&n);
        for(int i = 1;i <= n;i ++)
            scanf("%d",&a[i]),v.push_back(a[i]);
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());

        for(int i = 1;i <= n;i ++)
            Update(1,n,root[i],root[i-1],get_id(a[i]));
        printf("%d %d\n",temp,(n+1)/2);
        bool falg = false;
        for(int i = 1;i <= n;i ++)
        {
            if(i % 2 == 1)
            {

                if(!falg) {printf("%d",v[Query(1,n,root[i],(i+1)/2)-1]);falg = true;}
                else printf(" %d",v[Query(1,n,root[i],(i+1)/2)-1]);
                if(i%20 == 19) falg = false,printf("\n");
            }
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/li1615882553/article/details/81020867
今日推荐