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;
}