zoukankan      html  css  js  c++  java
  • POJ-1151 Atlantis 矩形面积并

      题目链接:http://poj.org/problem?id=1151

      扫描线+离散+线段树,线段树每个节点保存的是离散后节点右边的线段。

      1 //STATUS:C++_AC_16MS_208KB
      2 #include <functional>
      3 #include <algorithm>
      4 #include <iostream>
      5 //#include <ext/rope>
      6 #include <fstream>
      7 #include <sstream>
      8 #include <iomanip>
      9 #include <numeric>
     10 #include <cstring>
     11 #include <cassert>
     12 #include <cstdio>
     13 #include <string>
     14 #include <vector>
     15 #include <bitset>
     16 #include <queue>
     17 #include <stack>
     18 #include <cmath>
     19 #include <ctime>
     20 #include <list>
     21 #include <set>
     22 #include <map>
     23 using namespace std;
     24 //using namespace __gnu_cxx;
     25 //define
     26 #define pii pair<int,int>
     27 #define mem(a,b) memset(a,b,sizeof(a))
     28 #define lson l,mid,rt<<1
     29 #define rson mid+1,r,rt<<1|1
     30 #define PI acos(-1.0)
     31 //typedef
     32 typedef __int64 LL;
     33 typedef unsigned __int64 ULL;
     34 //const
     35 const int N=210;
     36 const int INF=0x3f3f3f3f;
     37 const int MOD=100000,STA=8000010;
     38 const LL LNF=1LL<<60;
     39 const double EPS=1e-8;
     40 const double OO=1e15;
     41 const int dx[4]={-1,0,1,0};
     42 const int dy[4]={0,1,0,-1};
     43 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
     44 //Daily Use ...
     45 inline int sign(double x){return (x>EPS)-(x<-EPS);}
     46 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
     47 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
     48 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
     49 template<class T> inline T Min(T a,T b){return a<b?a:b;}
     50 template<class T> inline T Max(T a,T b){return a>b?a:b;}
     51 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
     52 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
     53 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
     54 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
     55 //End
     56 
     57 struct Seg{
     58     double y,x1,x2;
     59     int c;
     60     Seg(){}
     61     Seg(double a,double b,double c,int d):y(a),x1(b),x2(c),c(d){}
     62     bool operator < (const Seg& a)const{
     63         return y<a.y;
     64     }
     65 }seg[N];
     66 double hs[N],len[N<<2];
     67 int cnt[N<<2];
     68 int n,m;
     69 
     70 void pushup(int l,int r,int rt)
     71 {
     72     if(cnt[rt])len[rt]=hs[r+1]-hs[l];
     73     else if(l==r)len[rt]=0;
     74     else len[rt]=len[rt<<1]+len[rt<<1|1];
     75 }
     76 
     77 void update(int a,int b,int c,int l,int r,int rt)
     78 {
     79     if(a<=l && r<=b){
     80         cnt[rt]+=c;
     81         pushup(l,r,rt);
     82         return;
     83     }
     84     int mid=(l+r)>>1;
     85     if(a<=mid)update(a,b,c,lson);
     86     if(b>mid)update(a,b,c,rson);
     87     pushup(l,r,rt);
     88 }
     89 
     90 int binary(int l,int r,double tar)
     91 {
     92     int mid;
     93     while(l<r){
     94         mid=(l+r)>>1;
     95         if(hs[mid]==tar)return mid;
     96         else if(hs[mid]>tar)r=mid;
     97         else l=mid+1;
     98     }
     99     return -1;
    100 }
    101 
    102 int main()
    103 {
    104  //   freopen("in.txt","r",stdin);
    105     int i,j,k,ca=1,l,r;
    106     double ans,a,b,c,d;
    107     while(~scanf("%d",&n) && n)
    108     {
    109         m=0;
    110         for(i=0;i<n;i++){
    111             scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    112             hs[m]=a;
    113             seg[m++]=Seg(b,a,c,1);
    114             hs[m]=c;
    115             seg[m++]=Seg(d,a,c,-1);
    116         }
    117         sort(hs,hs+m);
    118         sort(seg,seg+m);
    119         for(i=1,k=0;i<m;i++)
    120             if(hs[i]!=hs[k])hs[++k]=hs[i];
    121         mem(len,0);mem(cnt,0);
    122         ans=0;
    123         for(i=0;i<m-1;i++){
    124             l=binary(0,k+1,seg[i].x1);
    125             r=binary(0,k+1,seg[i].x2)-1;
    126             if(l<=r)update(l,r,seg[i].c,0,k,1);
    127             ans+=len[1]*(seg[i+1].y-seg[i].y);
    128         }
    129 
    130         printf("Test case #%d
    Total explored area: %.2lf
    
    ",ca++,ans);
    131     }
    132     return 0;
    133 }
  • 相关阅读:
    5.4 省选模拟赛 修改 线段树优化dp 线段树上二分
    一本通 高手训练 1782 分层图 状压dp
    luogu P3830 [SHOI2012]随机树 期望 dp
    5.2 省选模拟赛 或许 线型基
    luogu P4562 [JXOI2018]游戏 组合数学
    一本通 高手训练 1781 死亡之树 状态压缩dp
    luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开
    4.28 省选模拟赛 负环 倍增 矩阵乘法 dp
    HDU 1756 Cupid's Arrow 计算几何 判断一个点是否在多边形内
    一本通 高手训练 1763 简单树 可持久化线段树 树链刨分 标记永久化
  • 原文地址:https://www.cnblogs.com/zhsl/p/3196636.html
Copyright © 2011-2022 走看看