CDOJ 数据结构训练F 树状数组

来源:互联网 发布:钢铁侠反应堆淘宝 编辑:程序博客网 时间:2024/06/07 19:56
#include <map>#include <set>#include <list>#include <cmath>#include<cctype>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cstdio>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626#define MAXN 100005using namespace std;int gcd(int a, int b){return a % b == 0 ? b : gcd(b, a % b);}int input[MAXN];LL N;LL C[MAXN];LL ans[MAXN];struct node{    LL x,y;    friend bool operator <(const node &a,const node &b)    {        if (a.y==b.y)        {            return a.x<b.x;        }        else return a.y<b.y;    }}tree[MAXN];void update(LL pos,LL val){while (pos<=MAXN) //MAXN为总长度{C[pos]+=val;pos+=pos&-pos;}}int read(int pos){int ans=0;while (pos>0){ans+=C[pos];pos-=pos&-pos;}return ans;}void show(){    for (int i=0;i<N;i++)        printf("%lld %lld\n",tree[i].x,tree[i].y);}void init(){    memset(C,0,sizeof(C));    memset(ans,0,sizeof(ans));    for (LL i=0;i<N;i++)    {        scanf("%lld%lld",&tree[i].x,&tree[i].y);        tree[i].x++;tree[i].y++;    }    sort(tree,tree+N);   //show();}void slove(){    init();    for (LL i=0;i<N;i++)    {        ans[read(tree[i].x)]++;        update(tree[i].x,1);    }    for (int i=0;i<N;i++)    {        printf("%lld\n",ans[i]);    }}int main(){    while (scanf("%lld",&N)==1)    {        slove();    }    return 0;}

0 0
原创粉丝点击