hdu4417

这道题,一开始想到了用主席树,但是后来又觉得,不必这么大动干戈,是不是自己想复杂了,但是因为暂时没有别的想法,所以试着写了一下,wr了,瞬间感觉好像找对方向了,但是接下来就一直卡在了wr上,不得已找了个kuangbin的模板,修改了一下,交上去,结果ac了,有对照着找了一下错,结果发现是关于全局变量与递归的问题(已在代码中标出)。

(昨天吃了酸辣粉,一开始吃着不酸,不好吃,后来多加了醋,味道才稍微出来点,从来没有觉得醋这么神奇过!疑问

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010

struct querynode{
    int l;
    int r;
    int h;
};

querynode query[N];
int croot[40*N],lson[40*N],rson[40*N];
int Tree[N];
int num[N];
int newid[2*N];
int cou;
int ncou;

void lisanhua(){
    sort(newid+1,newid+ncou+1);
    ncou=unique(newid+1,newid+ncou+1)-(newid+1);

    return;
}

int getid(int x){
    return lower_bound(newid+1,newid+ncou+1,x)-newid;
}

int build(int l,int r){
    int root=cou++;
    croot[root]=0;

    if(l<r){
        int middle=(l+r)>>1;

        lson[root]=build(l,middle);//因为这里要递归,递归中用到cou,所以cou的值会改变,lson[cou-1]中的cou不确定会不会变,但是rson[cou-1]中的cou一定会随着递归的变化而变化。
        rson[root]=build(middle+1,r);
    }

    return root;
}

int insert(int froroot,int x){//已验证,正确
    croot[cou++]=croot[froroot]+1;
    int temproot=cou-1,rroot=cou-1;
    int l=1,r=ncou;

    while(l<r){
        int middle=(l+r)>>1;
        if(x<=middle){
            r=middle;
            lson[temproot]=cou++;
            rson[temproot]=rson[froroot];
            temproot=lson[temproot];
            froroot=lson[froroot];
        }
        else{
            l=middle+1;
            lson[temproot]=lson[froroot];
            rson[temproot]=cou++;
            temproot=rson[temproot];
            froroot=rson[froroot];
        }
        croot[temproot]=croot[froroot]+1;
    }

    return rroot;
}

int squery(int temproot,int l,int r,int x){//已验证,正确
    //printf("%d %d %d\n",l,r,x);

    if(l==r){
        return croot[temproot];
    }
    else{
        int middle=(l+r)>>1;

        if(x<=middle){
            return squery(lson[temproot],l,middle,x);
        }
        else if(x>middle){
            return croot[lson[temproot]]+squery(rson[temproot],middle+1,r,x);
        }
    }
}

int fquery(int v,int x){
    return squery(Tree[v],1,ncou,x);
}

int main(){
    int t;
    int n,m;

    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++){
        scanf("%d%d",&n,&m);
        cou=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&num[i]);
            newid[i]=num[i];
        }
        ncou=n;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].h);
            newid[++ncou]=query[i].h;
        }
        lisanhua();
        for(int i=0;i<m;i++){
            query[i].l++;
            query[i].r++;
            query[i].h=getid(query[i].h);
        }
        
        Tree[0]=build(1,ncou);
        for(int i=1;i<=n;i++){
            Tree[i]=insert(Tree[i-1],getid(num[i]));
        }
        
        printf("Case %d:\n",cas);
        for(int i=0;i<m;i++){
            printf("%d\n",(fquery(query[i].r,query[i].h)-fquery(query[i].l-1,query[i].h)));
        }
    }
}


posted @ 2015-09-05 09:26  buzhidaohahaha  阅读(128)  评论(0编辑  收藏  举报