标签:
题意:
给了很多星星的坐标,星星的特征值是不比他自己本身高而且不在它右边的星星数。
给定的输入数据是按照y升序排序的,y相同的情况下按照x排列,x和y都是介于0和32000之间的整数。每个坐标最多有一个星星。
思路:
这题给的输入数据很祥和,间接提示思路了。
用x作为树状数组的区间,然后按照输入的顺序不断查找在包括自己的位置以及左边的星星数。
细节是x可能是0,这是树状数组不能接受的,需要对输入的x数据进行加一操作。
从这题可以看出树状数组最直白的作用就是求从1开始到某个点的某个区间的数量。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int tree[33000]; int ans[16000],n; int findans(int tar) { int sum=0; while(tar>0) { sum+=tree[tar]; tar-=tar&(-tar); } return sum; } void updat(int tar) { while(tar<=32001) { tree[tar]++; tar+=tar&(-tar); } } int main() { memset(ans,0,sizeof(ans)); memset(tree,0,sizeof(tree)); int a,b; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&a,&b); a++; //printf("%d\n",findans(a)); ans[findans(a)]++; updat(a); } for(int i=0;i<n;i++) { printf("%d\n",ans[i]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/tun117/p/4965136.html