hdu5412

来源:互联网 发布:仙桃广电网络客服电话 编辑:程序博客网 时间:2024/04/29 01:53

这道题是待修改的求区间k小值,本来是想用树状数组+主席树,结果超时,用整体二分,结果因为数组开小了,一直wr,(再一次警告自己:wr有可能是数组开小了,但是小的又不是很多时,有可能是wr,而不是re发火

代码参考:http://blog.csdn.net/hdu2014/article/details/47834431

(感觉草莓味的软糖比草莓好吃!)

2015.8.29:

回想了一遍整体二分的过程,看到这里对自己的警告,只能说,亲爱的自己,没过几天,又犯了这个毛病,而且找了好久才发现,有待提高骂人

#include<stdio.h>#include<string.h>#include<iostream>#include<vector>#include<algorithm>using namespace std;#define N 100010int ty[3*N],qr[3*N],ql[3*N],qk[3*N],ans[3*N];int num[N];int newid[2*N];//因为开小了,所以一直wrint L[4*N],R[4*N];int c[N];int mark[N];vector<int> dp[4*N];//vector<int> v;int nid;int n;int nowloca;void lisanhua(){    sort(newid,newid+nid);    nid=unique(newid,newid+nid)-newid;    /*sort(v.begin(),v.end());    v.erase(unique(v.begin(),v.end()),v.end());*/}int numhash(int x){    return lower_bound(newid,newid+nid,x)-newid+1;    //return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}int lowbit(int x){    return ((~x)+1)&x;}void change(int x,int cou){    while(x<=n){        //printf("%d ",x);        if(mark[x]!=nowloca){            mark[x]=nowloca;            c[x]=0;        }        c[x]+=cou;        x=x+lowbit(x);    }}int sum(int x){    int ans=0;    while(x>0){        if(mark[x]==nowloca){           ans+=c[x];        }        x=x-lowbit(x);    }    return ans;}int main(){    int q;    int qid;    int nextloca;    while(scanf("%d",&n)!=EOF){        qid=0;        nid=0;        //v.clear();        dp[0].clear();        for(int i=1;i<=n;i++){            scanf("%d",&num[i]);            newid[nid++]=num[i];            //v.push_back(num[i]);            ty[qid]=1;            ql[qid]=i;            qr[qid]=num[i];            dp[0].push_back(qid++);        }        scanf("%d",&q);        for(int i=0;i<q;i++){            scanf("%d%d%d",&ty[qid],&ql[qid],&qr[qid]);            if(ty[qid]==2){                scanf("%d",&qk[qid]);            }            else{                dp[0].push_back(qid++);                ty[qid]=-1;                ql[qid]=ql[qid-1];                qr[qid]=num[ql[qid]];                num[ql[qid]]=qr[qid-1];                newid[nid++]=qr[qid-1];                //v.push_back(qr[qid-1]);            }            dp[0].push_back(qid++);        }        /*for(int i=0;i<qid;i++){            printf("%d %d\n",i,ql[i]);        }*/        lisanhua();        for(int i=0;i<qid;i++){            if(ty[i]!=2){                qr[i]=numhash(qr[i]);            }        }        nowloca=0;nextloca=1;        L[0]=1;R[0]=nid/*v.size()*/;        memset(c,0,sizeof(c));        memset(mark,0,sizeof(mark));        while(nowloca<nextloca){            if(L[nowloca]==R[nowloca]){                for(int i=0;i<dp[nowloca].size();i++){                    int u=dp[nowloca][i];                    if(ty[u]==2){                        ans[u]=newid[L[nowloca]-1];                    }                }            }            else{                int l=nextloca++;                int r=nextloca++;                int middle=(L[nowloca]+R[nowloca])>>1;                L[l]=L[nowloca];                R[l]=middle;                L[r]=middle+1;                R[r]=R[nowloca];                dp[l].clear();                dp[r].clear();                //memset(c,0,sizeof(c));//这样会超时                for(int i=0;i<dp[nowloca].size();i++){                    int u=dp[nowloca][i];                    if(ty[u]==2){                        int cnt=sum(qr[u])-sum(ql[u]-1);                        //printf("%d %d\n",cnt,u);                        if(qk[u]<=cnt){                            dp[l].push_back(u);                        }                        else{                            qk[u]-=cnt;                            dp[r].push_back(u);                        }                    }                    else{                        if(qr[u]>middle){                            dp[r].push_back(u);                        }                        else{                            //printf("%d %dha ",u,ql[u]);                            change(ql[u],ty[u]);//调错:在change这个函数这里没有返回来了                            dp[l].push_back(u);                        }                    }                }            }            nowloca++;//printf("wo shi da hao ren\n");        }        for(int i=0;i<qid;i++){            if(ty[i]==2){                printf("%d\n",ans[i]);            }        }    }    return 0;}


0 0
原创粉丝点击