zoukankan      html  css  js  c++  java
  • 扫描线

    poj1151

    https://blog.csdn.net/xianpingping/article/details/83032798

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<stack>
    #include<cstdlib>
    #include<queue>
    #include<set>
    #include<string.h>
    #include<vector>
    #include<deque>
    #include<map>
    using namespace std;
    #define INF 0x3f3f3f3f3f3f3f3f
    #define inf 0x3f3f3f3f
    #define eps 1e-4
    #define bug printf("*********
    ")
    #define debug(x) cout<<#x"=["<<x<<"]" <<endl
    typedef long long LL;
    typedef long long ll;
    const int maxn = 2e2 + 5;
    const int mod = 998244353;
    
    struct seg {
        double l,r,h;
        int d;
        seg(){}
        seg(double x1,double x2,double H,int c) : l(x1),r(x2),h(H),d(c){}
        bool operator < (const seg &a) const {
            return h < a.h;
        }
    }line[maxn << 2];
    double Hash[maxn << 2];
    double sum[maxn << 2];
    int cnt[maxn << 2];
    
    void init() {
        memset(cnt, 0, sizeof cnt);
        memset(sum, 0, sizeof sum);
    }
    
    void pushup(int o,int l,int r) {
        if(cnt[o]) sum[o] = Hash[r + 1] - Hash[l];
        else sum[o] = sum[o << 1] + sum[o << 1 | 1];
    }
    void update(int o,int l,int r,int ql,int qr,int v) {
        if(ql <= l && qr >= r) {
            cnt[o] += v;
            pushup(o,l,r);
            return;
        }
        int mid = (l + r) >> 1;
        if(ql <= mid) update(o << 1,l,mid,ql,qr,v);
        if(qr > mid) update(o << 1 | 1,mid + 1,r,ql,qr,v);
        pushup(o,l,r);
    }
    int main()
    {
        int n,_  =0;
        while(scanf("%d",&n) && n) {
            init();
            double x1,x2,y1,y2;
            int cnt1 = 0,cnt2 = 0;
            for(int i = 1; i <= n; ++i) {
                scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
                Hash[++cnt1] = x1;
                Hash[++cnt1] = x2;
                line[++cnt2] = seg(x1,x2,y1,1);
                line[++cnt2] = seg(x1,x2,y2,-1);
    
            }
            sort(Hash + 1, Hash + cnt1 + 1);
            sort(line + 1, line + cnt2 + 1);
            int k = unique(Hash + 1,Hash + 1 + cnt1) - Hash - 1;
            double ans = 0.0;
            for(int i = 1; i < cnt2; i++) {
                int l = lower_bound(Hash + 1,Hash + 1 + k,line[i].l) - Hash;
                int r = lower_bound(Hash + 1,Hash + 1 + k,line[i].r) - Hash - 1;
                if(l <= r)
                    update(1,1,k - 1,l,r,line[i].d);
                ans += sum[1] * (line[i + 1].h  - line[i].h);
            }
            printf("Test case #%d
    Total explored area: %.2f
    
    ",++_,ans);
        }
    }
    View Code
  • 相关阅读:
    ios开发之--把秒转换为天时分秒
    网络爬虫的类型
    网络爬虫的组成
    为什么要学网络爬虫
    什么是网络爬虫
    Windows 下安装 Python3
    Linux 下安装 Python3
    HTTP 代理
    HTTP Cookies
    爬虫的基本原理
  • 原文地址:https://www.cnblogs.com/smallhester/p/11404212.html
Copyright © 2011-2022 走看看