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))); } } }