题目:
在平面内有一条长度为n的线段(不计入答案),可以对进行以下2种操作:
1、把从x到y的再加一条线段
2、查询从x到x+1有多少条线段
输入:
第一行输入n,m
第2~m+1行,每行2个数x,y,表示从x到y再加一条线段
最后一行输入2个数,为x和x+1,查询x到x+1的线段数目
输出:
输出x到x+1的线段数目
样例输入:
7 2
2 5
3 6
4 5
样例输出:
2
思路:
线段树…
直接统计线段覆盖
CodeCodeCode:
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,x,y,ans;
struct Tree
{
int l,r,cover;
}tree[10000001];
void build_tree (int dep,int l,int r)//建树
{
int mid = (l + r) >> 1;
tree[dep].l = l, tree[dep].r = r;
if(l + 1 >= r) return;
build_tree (dep * 2,l,mid);
build_tree (dep * 2 + 1,mid,r);
}
int answer (int dep)//求ans
{
while(dep)
{
ans += tree[dep].cover;
dep /= 2;
}
return ans;
}
void charu (int dep,int l,int r)//插入
{
int mid = (tree[dep].l + tree[dep].r) >> 1;
if (l == r || !tree[dep].l) return;
if (tree[dep].l == l && tree[dep].r == r)
{
tree[dep].cover++;
return;
}
if (r <= mid) charu(dep * 2,l,r);
else if (l >= mid) charu(dep * 2 + 1,l,r);
else
{
charu(dep * 2,l,mid);
charu(dep * 2 + 1,mid,r);
}
}
int tongji (int dep,int l,int r)//统计
{
int mid = (tree[dep].l + tree[dep].r) >> 1;
if (tree[dep].r == r && tree[dep].l == l) return answer(dep);
if (r <= mid) tongji (dep * 2,l,r);else
if (l >= mid) tongji (dep * 2 + 1,l,r);else
{
tongji (dep * 2,l,mid);
tongji (dep * 2 + 1,mid,r);
}
}
int main ()
{
scanf ("%d%d",&n,&m);
build_tree(1,1,n);
for (int i = 1; i <= m; ++i)
{
scanf ("%d%d",&x,&y);
charu (1, x, y);
}
scanf ("%d%d",&x,&y);
printf ("%d",tongji(1,x,y));
}