ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

poj 1151 (未完成) 扫描线 线段树 离散化

2019-03-21 21:37:53  阅读:226  来源: 互联网

标签:rt int double 1151 tree poj 扫描线 maxn include


#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
#define y1 y11
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
const int maxn=1e3+10;
double x1[maxn];
double y1[maxn];
double x2[maxn];
double y2[maxn];
vector<double> vx;
vector<double> vy;
double x[maxn];
double y[maxn];
struct node { int yl,yr,k; }pp[maxn];
vector<node> vxxx[maxn];
double tree[4*maxn];
double  ans[4*maxn];
int    lazy[4*maxn];

int tot=0;
void push_up(int rt) {  tree[rt]=tree[rt<<1]+tree[rt<<1|1]; }
//void push_down(int rt,int len) {  lazy[rt<<1]+=lazy[rt];  lazy[rt<<1|1]+=lazy[rt];  lazy[rt]=0; }
void build(int rt,int l,int r)
{
    if(l==r) {  tot++; tree[l]=vy[tot]-vy[tot-1]; return ; }
    int m=(l+r)>>1;   build(ls);  build(rs);push_up(rt);
}
void update(int p,int delta,int rt,int l,int r)
{
    if(l==r) { tree[rt]+=delta; return ; }
    int m=(l+r)>>1;
    if(p<=m)update(p,delta,ls);
    else update(p,delta,rs);
    push_up(rt);
}
void Update(int L,int R,int delta,int rt,int l,int r)
{
    if(L<=l&&r<=R) {  lazy[rt]+=delta; return ; }
    if(lazy[rt])  push_down(rt,r-l+1);
    int m=(l+r)>>1;
    if(L<=m)Update(L,R,delta,ls);
    if(R>m)Update(L,R,delta,rs);
    push_up(rt);
}
int main()
{
    int cnt=0;
    int n;
    while(1)
    {
        scanf("%d",&n);        if(n==0) break;
        for(int i=1;i<=n;i++)  scanf("%lf %lf %lf %lf",&x1[i],&y1[i],&x2[i],&y2[i]);
        for(int i=1;i<=n;i++)
        {
            vx.push_back(x1[i]);
            vx.push_back(x2[i]);
            vy.push_back(y1[i]);
            vy.push_back(y2[i]);
        }
        sort(vx.begin(),vx.end());  vx.erase(unique(vx.begin(),vx.end()),vx.end());
        for(int i=0;i<vx.size();i++) x[i]=vx[i];
        sort(vy.begin(),vy.end());  vy.erase(unique(vy.begin(),vy.end()),vy.end());
        for(int i=0;i<vy.size();i++) y[i]=vy[i];
        for(int i=1;i<=n;i++)
        {
            int k=lower_bound(vx.begin(),vx.end(),x1[i])-vx.begin();
            node p;    p.yl=y1[i]; p.yr=y2[i]; p.k=1;
            vxxx[k].push_back(p);
            k=lower_bound(vx.begin(),vx.end(),x2[i])-vx.begin();
            p.k=-1;
            vxxx[k].push_back(p);
        }
        int m=vy.size()-1;
        build(1,1,m);
        double ans=0;
        for(int i=0;i<vx.size();i++)
        {
               if(i==0)
               {
                   for(int j=0;j<=vxx[i].size();j++)
                   {
                       node p=vxxx[i][j];
                       int l=lower_bound(vy.begin(),vy.end(),p.yl)-vy.begin();
                       int r=lower_bound(vy.begin(),vy.end(),p.yr)-vy.begin();
                       update(l,r,p.k,1,1,m);
                   }
               }
        }
    }
}

 

标签:rt,int,double,1151,tree,poj,扫描线,maxn,include
来源: https://www.cnblogs.com/Andromeda-Galaxy/p/10574798.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有