poj 2229 Ultra-QuickSort(树状数组)

来源:互联网 发布:跳跃网络次元大作战 编辑:程序博客网 时间:2024/05/16 17:19

题目链接:点击打开链接


树状数组模板题

本题的数字每个都是不同的所以可以从大到小排,再边插入边查询。如果有重复的数字,需要从小到大排,然后每次res+=N-query(pos)

结果会超int


代码:

#include <cstdio>#include <iostream>#include <cstring>#define ll long long#include <algorithm>using namespace std;int c[500010];struct node{    int id;    ll num;}a[500010];int N;bool cmp(node a,node b){    return a.num>b.num;}int lowbit(int n){    return n&(-n);}void add(int p,int n){    while(p<=N){        c[p]+=n;        p+=lowbit(p);    }}int query(int p){    int res=0;    while(p>0){        res+=c[p];        p-=lowbit(p);    }    return res;}int main(){    while(~scanf("%d",&N)){        memset(c,0,sizeof(c));        if(!N) break;        for(int i=1;i<=N;i++){                scanf("%I64d",&a[i].num);                a[i].id=i;        }        sort(a+1,a+N+1,cmp);        ll res=0;        for(int i=1;i<=N;i++){            res+=query(a[i].id);            add(a[i].id,1);        }        printf("%I64d\n",res);    }    return 0;}


0 0
原创粉丝点击