SPOJ 227 Ordering the Soldiers (树状数组)
来源:互联网 发布:靠谱的韩国代购淘宝店 编辑:程序博客网 时间:2024/04/29 08:19
思路:与杭电2852相似,只不过倒着求而已。对于每个给出的数组w,i从n到1逆向,查找当前存在的,且前i个数中sum(i)+w[i==i,sum(i)表示包括i在内的,比i小的数的总个数,w[i]就是前i个数中比i大的数的总和,当然,暴力应该会超时,所以用二分优化一下。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define LL int#define maxn 200005LL c[maxn];int n,a[maxn];bool vis[maxn];void add(int x,int val){ for(; x<=n; x+=(x&-x)) c[x]+=val;}int sum(int x){ int s=0; for(; x>0; x-=(x&-x)) s+=c[x]; return s;}int main(){ int t,i,l,r,mid,ans; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(c,0,sizeof(c)); memset(vis,0,sizeof(vis)); for(i=1; i<=n; ++i) { scanf("%d",&a[i]); add(i,1); } for(i=n; i>=1; --i) { l=1,r=n,ans=1; while(r>=l) { mid=(l+r)>>1; if(sum(mid)+a[i]>=i) { if(!vis[mid]) ans=mid; r=mid-1; } else l=mid+1; } a[i]=ans; add(ans,-1); vis[ans]=1; } for(i=1; i<=n; ++i) if(i==1) printf("%d",a[i]); else printf(" %d",a[i]); printf("\n"); } return 0;}
- SPOJ 227 Ordering the Soldiers (树状数组)
- SPOJ 227 Ordering the Soldiers
- SPOJ 227 Ordering the Soldiers
- 倒推序列,如b[i]0 1 0(前面有几个数比b[i] 大)推a[i]2 1 3 ,树状数组 SPOJ 227 Ordering the Soldiers
- 树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)
- spoj227. Ordering the Soldiers
- SPOJ 227 树状数组
- Coder Ratings+SPOJ+树状数组
- SPOJ-1029-二维树状数组
- spoj 1029. Matrix Summation(二维树状数组)
- SPOJ DQUERY D-query 树状数组离线
- SPOJ NWERC11C Movie collection 树状数组,线段树
- SPOJ 3267 DQUERY(主席树在线|树状数组离线)
- 统计矩阵和 二维树状数组 SPOJ 1029 Matrix Summation
- SPOJ DQUERY树状数组离线or主席树
- 【SPOJ-INVCNT】Inversion Count【树状数组】【逆序对】
- SPOJ DQUUERY (在线主席树 | 离线树状数组)
- [SPOJ 3267] D-query (离线询问+树状数组)
- 威威猫系列故事——吃鸡腿(3月25号腾讯编程马拉松大赛 )
- 0、交叉编译gtk+库(序)
- HDOJ-2544最短路
- JS操作DIV全属性
- HDU1024——Max Sum Plus Plus(DP)
- SPOJ 227 Ordering the Soldiers (树状数组)
- HDU 3006 The Number of set
- 用EditPlus查看xml文件
- libxml2的使用总结
- 协同过滤推荐算法
- UVA 10036 Divisibility【补充分析】
- 安卓(Android)环境搭建配置全解
- [C#]ADO访问多数据库的C#库
- js:window.showModalDialog模态窗口小小的用一下