HDU-5862-Counting Intersections(树状数组+离散化+扫描线)

链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5862

题意:给出与坐标轴平行的线段,求所有线段的交点个数

题解:先将数据离散化,将两类线段分开存放;考虑横向线段的左右端点,将y值计数,只需将竖向线段扫描一遍,统计y1与y2之间的线段个数,维护bit就好。

CODE:

#include 
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define bug cout<<"bug"< p;
long long sum[MAXN];
void add(int i, int x)
{
    while(i<=MAXN)
    {
        sum[i]+=x;
        i+=i&-i;
    }
}
long long get_sum(int i)
{
    long long ans=0;
    while(i>0)
    {
        ans+=sum[i];
        i-=i&-i;
    }
    return ans;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        p.clear();
        int x1,x2,y1,y2;
        scanf("%d",&n);
        int cnt1=0,cnt2=0;
        for(int i=0; iline[i].x2)swap(line[i].x1,line[i].x2);
            if(line[i].y1>line[i].y2)swap(line[i].y1,line[i].y2);
            p.push_back(line[i].x1);
            p.push_back(line[i].x2);
            p.push_back(line[i].y1);
            p.push_back(line[i].y2);
        }
        sort(p.begin(),p.end());
        p.resize(unique(p.begin(),p.end())-p.begin());
        for(int i=0; i


你可能感兴趣的:(HDU,树)