复习一个简单的线段树题目
输入点已经按照y坐标递增的顺序排列,所以按照x区间就行
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
using namespace std;
///宏定义
const int INF = 20000000;
//const int maxn = 10010;
const int MAXN = 33010;
///全局变量 和 函数
struct node
{
int lc, rc;
int sum;
}tree[MAXN * 4];
int N;
int x, y;
int level[MAXN];
void buildtree(int l, int r, int pos)
{
if (l == r)
{
tree[pos].sum = 0;
tree[pos].lc = tree[pos].rc = l;
return;
}
int mid = (l + r) / 2;
tree[pos].sum = 0;
tree[pos].lc = l;
tree[pos].rc = r;
buildtree(l, mid, pos * 2);
buildtree(mid + 1, r, pos * 2 + 1);
}
int query(int l, int r, int pos)
{
if ((tree[pos].lc == l) && (tree[pos].rc == r)) //等号写成了赋值号
return tree[pos].sum;
int mid = (tree[pos].lc + tree[pos].rc) / 2;
if (l > mid)
return query(l, r, 2 * pos + 1);
else if (r <= mid)
return query(l, r, 2 * pos);
else
return query(l, mid, 2 * pos) + query(mid + 1, r, 2 * pos + 1);
}
void insert(int l, int r, int pos)
{
if ((l == tree[pos].lc) && (r == tree[pos].rc))
{
tree[pos].sum++;
return;
}
int mid = (tree[pos].lc + tree[pos].rc) / 2; //注意是tree[pos]的lc和rc
if (l > mid)
insert(l, r, 2 * pos + 1);
else if (r <= mid)
insert(l, r, 2 * pos);
else
{
insert(l, mid, 2 * pos);
insert(mid + 1, r, 2 * pos + 1);
}
tree[pos].sum = tree[pos * 2].sum + tree[pos * 2 + 1].sum; //计算关键部分
}
int main()
{
///变量定义
int i, j;
///
while (scanf("%d", &N) != EOF)
{
memset(level, 0, sizeof(level));
buildtree(0, MAXN, 1);
for (i = 0; i < N; i++)
{
scanf("%d%d", &x, &y);
level[query(0, x, 1)]++;
insert(x, x, 1);
}
for (i = 0; i < N; i++)
printf("%d\n", level[i]);
}
///结束
return 0;
}