树状数组的应用

来源:互联网 发布:淘宝开黑车 编辑:程序博客网 时间:2024/05/16 14:23
SonochiSonochi,明年再一起看烟花。——WashioSumiWashioSumi

为了实现和SonochiSonochi的约定,WashiWashi必须要打败眼前强大的怪物。
怪物分布在二维平面上,
某个怪物的rankrank被定义为xx坐标不大于其xx坐标,且yy坐标不大于其yy坐标的怪物的数量。(不含其自身)
WashiWashi要你输出nn行,每行一个整数,分别代表rankrank00~n1n−1的怪物数量。

Input

输入第一行为一个正整数nn
接下来nn行,第ii行两个整数xixiyiyi,表示一个怪物的坐标。
保证输入的坐标两两不同。

Output

包含nn行,每行一个整数,第ii行的数代表rankranki1i−1的怪物数量。

思路:以X为首要优先级,Y为次要优先级sort排序后,对于i的来说xj<=xi(j<=i)的,只需要知道小于等于yi的个数。

#include <iostream>#include <stdio.h>#include <map>#include <algorithm>#include <string.h>using namespace std;const int AX = 1e5+666;int rankkk[AX];const int n = AX;struct Node{int x;int y;}node[AX];bool cmp(const Node &a,const Node &b){if(a.x!=b.x){return a.x<b.x;}else{return a.y<b.y;}}int v[AX];int lowbit(int x){return x&(-x);}void update(int value,int site){while(site<AX){v[site] += value;site += lowbit(site);}}int getsum(int i){int sum = 0;while(i>=1){sum += v[i];i -= lowbit(i);}return sum;}int main(){memset(rankkk,0,sizeof(rankkk));int m;cin>>m;for(int i=0;i<m;i++){scanf("%d%d",&node[i].x,&node[i].y);}sort(node,node+m,cmp);for(int i=0;i<m;i++){rankkk[getsum(node[i].y)]++;update(1,node[i].y);}for(int i=0;i<m;i++){printf("%d\n",rankkk[i]);}return 0;}


原创粉丝点击