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
- hdu5412
- hdu5412
- hdu5412--CRB and Queries(整体二分)
- 整体二分 hdu5412 CRB and Queries
- hdu5412 CRB and Queries (整体二分)
- hdu5412——CRB and Queries
- hdu5412:CRB and Queries (整体二分+树状数组)
- bzoj1901[Zju2112] Dynamic Rankings / hdu5412 CRB and Queries 整体二分基础摸板
- 【HDU5412】CRB and Queries-整体二分:带修改区间第K小
- 在Linux下卸载Oracle 11g
- Android LayoutInflater的到View后丢失LayoutParam信息的问题
- 从Log4j迁移到LogBack的理由
- LeetCode(41)First Missing Positive
- VMware Workstation下VMnet1等虚拟网卡与主机网卡之间的关系
- hdu5412
- hdoj 4324 Triangle Love
- 【组合数学】【prufer数列】【HNOI 2004】【bzoj 1211】树的计数
- CSS 选择器及各样式引用方式
- OrCAD DSN文件无故消失解决办法
- Android IPC 进程间通信实现理解
- 【使用JSOUP实现网络爬虫】从元素抽取属性,文本和HTML
- Oracle Database 12cRelease 安装
- SQL计算百分比