0
点赞
收藏
分享

微信扫一扫

Cows(树状数组)

产品喵dandan米娜 2022-03-22 阅读 125
c++

​​​k树状数组简单易懂的详解_FlushHip的博客-CSDN博客_树状数组

可以参考以上文章先行理解树状数组。

描述:

Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good.

Farmer John has N cows (we number the cows from 1 to N). Each of Farmer John's N cows has a range of clover that she particularly likes (these ranges might overlap). The ranges are defined by a closed interval [S,E].

But some cows are strong and some are weak. Given two cows: cowi and cowj, their favourite clover range is [Si, Ei] and [Sj, Ej]. If Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj, we say that cowi is stronger than cowj.

For each cow, how many cows are stronger than her? Farmer John needs your help!

输入:

The input contains multiple test cases.
For each test case, the first line is an integer N (1 <= N <= 105), which is the number of cows. Then come N lines, the i-th of which contains two integers: S and E(0 <= S < E <= 105) specifying the start end location respectively of a range preferred by some cow. Locations are given as distance from the start of the ridge.

The end of the input contains a single 0.

输出:

For each test case, output one line containing n space-separated integers, the i-th of which specifying the number of cows that are stronger than cowi.

样例输入:

3
1 2
0 3
3 4
0

复制

样例输出:

1 0 0

复制

注释:

Huge input and output,scanf and printf is recommended.

#include<iostream>
#include<algorithm>
using namespace std;
int arr[500010];
int maxi=0;
int c[500010];
struct temp
{
	int a,b,point;
	bool operator <(const struct temp p)const
	{
		if(b==p.b)
		{
			return a<p.a;
		}
		else return b>p.b;
	}
}ui[500010];
int lowbit(int n)
{
	return n&(-n);
}
int getsum(int n)
{
	int sum=0;
	while(n>0)
	{
		sum+=c[n];
		n-=lowbit(n);
	}
	return sum;
}
void Update(int n,int m)
{
	while(n<=maxi)
	{
		c[n]+=m;
		n+=lowbit(n);
	}
	return ;
}
int main()
{
	int sum;
	while(cin>>sum)
	{
		if(sum==0)break;
		maxi=0;
		memset(c,0,sizeof(c));
	for(int n=1;n<=sum;n++)
	{
		cin>>ui[n].a>>ui[n].b;
		ui[n].a++;
		ui[n].b++;
		ui[n].point=n;
		maxi=max(maxi,ui[n].b);
	}
	sort(ui+1,ui+1+sum);
	for(int n=1;n<=sum;n++)
	{
		Update(ui[n].a,1);
		if(n==1)
		arr[ui[n].point]=getsum(ui[n].a)-1;
		else
		{
			if(ui[n].a==ui[n-1].a&&ui[n].b==ui[n-1].b){
				arr[ui[n].point]=arr[ui[n-1].point];
			}
			else arr[ui[n].point]=getsum(ui[n].a)-1;
		}
	}
	cout<<arr[1];
	for(int n=2;n<=sum;n++)
	{
		cout<<" "<<arr[n];
	}
	cout<<endl;
	}
	return 0;
}
举报

相关推荐

0 条评论