HDU5775(树状数组)
2017-07-24 19:50
225 查看
分析:由冒泡算法可知,一个数是先往右移,再往左移。所有从后往前扫,看每一个数右边有几个比他大的数,那么就知道要往右边移动几次,左边的话,就看现在的位置和他本身的大小,谁小就在哪
。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<string> #define nl n<<1 #define nr (n<<1)1 #define hash Hash using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int>P; const int INF=0x3f3f3f3f; const ll INFF=0x3f3f3f3f3f3f3f3f; const ull seed=1e8+7; const ll mod=1e9+7; const double pi=acos(-1.0); const double eps=1e-9; int bit[100010]; int a[100010]; int ans[100010]; int n; int sum(int i) { int ans=0; while(i) { ans+=bit[i]; i-=(i&-i); } return ans; } void add(int i,int x) { while(i<=n) { bit[i]+=x; i+=i&(-i); } } int main() { int t; scanf("%d",&t); for(int v=1;v<=t;v++) { memset(bit,0,sizeof(bit)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=n;i>=1;i--) { int l=min(i,a[i]); int r=i+sum(a[i]); add(a[i],1); ans[a[i]]=r-l; } printf("Case #%d:",v); for(int i=1;i<=n;i++) printf(" %d",ans[i]); printf("\n"); } return 0; }
。
相关文章推荐
- HDU5775 Bubble Sort(树状数组求逆序数)
- hdu5775(思维题&树状数组)
- 【HDU5775】【树状数组】Bubble Sort 题解
- nyoj 士兵杀敌(四) 123 (线段树&&树状数组) 更新区间值求特定位置的值
- 【专题】树状数组
- uvalive 4329 Ping Pong(树状数组)
- UVALive - 3942 Remember the Word[树状数组]
- 【树状数组】 HDOJ 5032 Always Cook Mushroom
- [BZOJ3585&3339][Rmq Problem][莫队+二分+树状数组]
- POJ 2352 Stars(树状数组)
- bzoj3155: Preprefix sum(树状数组)
- PKU 1195 二维树状数组
- Codeforces 276E(树状数组)
- POJ 2155 Matrix <树状数组 + 矩阵翻转>
- POJ 2299 Ultra-QuickSort(树状数组)
- BZOJ 2738 子矩阵第k大 | 二维树状数组 整体二分 分治
- 树状数组详解
- 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
- Fruit Ninja(树状数组+思维)
- Problem M (树状数组)