摘要:线段树,主要考虑要用线段树查询
#include <iostream>
#include <stdio.h>
using namespace std;
const int size = 320000;
const int N = 150000;
typedef struct Node{
int left;
int right;
int nums;
Node * left_child;
Node * right_child;
void Construct(int, int);
void Insert(int);
int Calculate(int);
}Node;
Node sTree[size*3];
Node *root = &sTree[0];
int len = 1;
int per_count[N] = {0};
void Node::Construct(int l, int r)
{
left = l;
right = r;
nums = 0;
if(left == right){
left_child = right_child = NULL;
return;
}
left_child = &sTree[len++];
right_child = &sTree[len++];
int mid = (l + r) >> 1;
left_child->Construct(l, mid);
right_child->Construct(mid+1, r);
}
void Node::Insert(int value)
{
nums++;
if( left == right ){
return;
}
int mid = (left + right) >> 1;
if( value <= mid ){
left_child->Insert(value);
}else{
right_child->Insert(value);
}
}
int Node::Calculate(int value)
{
if( right <= value ){
return nums;
}
int mid = (left + right) >> 1;
if(value <= mid){
return left_child->Calculate(value);
}else{
return left_child->nums + right_child->Calculate(value);
}
}
int main()
{
len = 1;
root->Construct(0, 32000);
int n;
scanf("%d", &n);
for(int i=1; i<=n; i++){
int x, y;
scanf("%d%d", &x, &y);
int level = root->Calculate(x);
per_count[level] += 1;
root->Insert(x);
}
for(int i=0; i<n; i++){
printf("%d/n", per_count[i]);
}
return 0;
}