您的位置:首页 > 其它

hdu4417

2015-09-05 09:26 393 查看
这道题,一开始想到了用主席树,但是后来又觉得,不必这么大动干戈,是不是自己想复杂了,但是因为暂时没有别的想法,所以试着写了一下,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
;
int croot[40*N],lson[40*N],rson[40*N];
int Tree
;
int num
;
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)));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: