hdu5412
2015-08-26 17:31
260 查看
这道题是待修改的求区间k小值,本来是想用树状数组+主席树,结果超时,用整体二分,结果因为数组开小了,一直wr,(再一次警告自己:wr有可能是数组开小了,但是小的又不是很多时,有可能是wr,而不是re
)
代码参考:http://blog.csdn.net/hdu2014/article/details/47834431
(感觉草莓味的软糖比草莓好吃!)
2015.8.29:
回想了一遍整体二分的过程,看到这里对自己的警告,只能说,亲爱的自己,没过几天,又犯了这个毛病,而且找了好久才发现,有待提高
)
代码参考: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 100010 int ty[3*N],qr[3*N],ql[3*N],qk[3*N],ans[3*N]; int num ; int newid[2*N];//因为开小了,所以一直wr int L[4*N],R[4*N]; int c ; int mark ; 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; }
相关文章推荐
- 在ARC下引用第三方库等使用MRC 设置 -fno-objc-arc无效
- Struts2传值的背后机制:Value Stack(值栈)
- CSS 选择器及各样式引用方式
- leetcode: Binary Tree Postorder Traversal
- LeetCode(41)First Missing Positive
- 【组合数学】【prufer数列】【HNOI 2004】【bzoj 1211】树的计数
- OrCAD DSN文件无故消失解决办法
- VMware Workstation下VMnet1等虚拟网卡与主机网卡之间的关系
- VMware Workstation下VMnet1等虚拟网卡与主机网卡之间的关系
- 什么是Platform Services Controller
- hdu5412
- LeetCode(41)First Missing Positive
- 从Log4j迁移到LogBack的理由
- BaseSpider在scrapy中的使用
- 在Linux下卸载Oracle 11g
- 安卓adapter子项动态设置控件宽度以及扩展动画
- 基于Netty5.0入门案例一之NettyServer
- Android的Configuration
- 自定义事件(不带参数实现)
- Delphi控件的显示内容与显示边框是两回事