HDU5775(树状数组)

来源:互联网 发布:如何当淘宝模特 编辑:程序博客网 时间:2024/06/05 04:22
分析:由冒泡算法可知,一个数是先往右移,再往左移。所有从后往前扫,看每一个数右边有几个比他大的数,那么就知道要往右边移动几次,左边的话,就看现在的位置和他本身的大小,谁小就在哪
#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 Hashusing 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;}

原创粉丝点击