HDU5592 ZYB's Premutation 树状数组应用
2016-06-03 10:16
218 查看
#include<iostream> #include<stdio.h> #include<string> #include<algorithm> using namespace std; int a[50005];//已知数组; int c[50005];//树状数组; int n; int lowBit(int x) //计算2^K的值,即下标为X的结点管辖的范围 { return x&(-x); } void modify(int pos,int num) //pos为数组下标位置,num为要增加的值 { while(pos<=n) //n为数组的长度 { c[pos]+=num; pos+=lowBit(pos); } } int getResult(int pos) //求A[1]+...+A[pos] { int sum=0; while(pos>0) { sum+=c[pos]; pos-=lowBit(pos); //下一个无联系的辖域 } return sum; } int findkth(int n,int k){ if(k-c <=0){ int i=n; if(k-a[i]==0){ a[i]=0; modify(i,-1); return i; } else { findkth(n-1,k-a[i]); } } else findkth(n-lowBit(n),k-c ); }//寻找第k大的数的位置 void f() { int t[50005]; int i; int b1=0,b2=0; scanf("%d",&n); for(i=1;i<=n;i++) { a[i]=1; modify(i,1); scanf("%d",&b2); t[i]=b2-b1; b1=b2; } for(i=n;i>0;i--) { t[i]=findkth(n,t[i]+1);//在i个数里寻找第t[i]+1大的数 } for(i=1;i<n;i++) printf("%d ",t[i]); printf("%d\n",t ); } int main(){ int T; cin>>T; while(T){ f(); T--; } return 0; }
已经忘记题意了~
相关文章推荐
- LeetCode OJ 153. Find Minimum in Rotated Sorted Array
- Struts2中属性驱动与模型驱动
- WPF编译时提示"xxx不包含适合于入口点的静态 Main方法xxx"
- performSelector withObject afterDelay 在子线程上调用不运行
- Hibernate多对多配置
- Android最佳实践之UI
- java线程常见面试题
- poj1573Robot Motion
- combox1有值时combox2显示与combox1有关的值
- Unity5.x依赖打包
- Bootstrap- Modal对话框如何在关闭时触发事件
- 在需要HTML代码的PHP脚本中,多用这么几种方法
- android混淆打包报错的一种可能java.io.IOException: Can't read [D:\workspace\android0428\libs\pwd_sdk_proguard.ja
- Android实现js及webview交互之在html页面中调用系统摄像头
- js判断某个字符出现的次数的简单实例
- 图片不能包含alpha通道或透明度问题解决方法
- jquery锚点跳转+自动显示隐藏回到顶端代码
- TCP三次握手,4次挥手
- Draw nicer Classification and Regression Trees with the rpart.plot package
- 数据结构上机测试2-2:单链表操作B