首页 > 代码库 > ZOJ 3635 树状数组+二分
ZOJ 3635 树状数组+二分
这题那时怎么想就是想不出来……而且今晚没有多大状态,自己都晕了……一题没做出来……
baoge解释好久才懂……唉……线段树,树状数组用得还是不够熟啊……
WA了二发,才知道二分错了,二分好久不用,老是出错了现在……
#include<iostream> #include<cstring> #include<string> #include<cstdio> #define sca(a) scanf("%d",&a) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int c[50005],a[50005],b,n; void update(int x,int num) { for(int i=x; i<=n; i+=i&(-i)) c[i]+=num; } int sum(int x) { int ans=0; for(int i=x; i>=1; i-=i&(-i)) ans+=c[i]; return ans; } int main() { int i,j,m; while(~sca(n)) { mem(c,0); for(i=1; i<=n; i++) update(i,1); for(i=1; i<=n; i++) { sca(m); int l=1,r=n; while(l<=r) { int mid=(l+r)/2,s=sum(mid); if(s>=m) r=mid-1; else l=mid+1; } a[i]=l; update(l,-1); } sca(m); for(i=0; i<m-1; i++) { sca(b); printf("%d ",a[b]); } sca(b); printf("%d\n",a[b]); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。