程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 1542 Atlantis

hdu 1542 Atlantis

編輯:C++入門知識

#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 2222
using namespace std;

struct line
{
    double s,e,h,type;//記錄的是每一條線的起點 終點 距離X周的面積
}L[MAXN]; //是底還是高 底是1高是-1   意味著底就是覆蓋。高就是刪除

double tree[MAXN<<2];
int cnt[MAXN<<2];
double X[MAXN<<2];

bool cmp(line a,line b)
{
    return a.h<b.h;//按線的高度排序
}

void pushup(int num,int l,int r)
{
    if(cnt[num])tree[num] = X[r+1] - X[l];//如果被完全覆蓋   
   // else if(l==r)tree[num]=0;
    else tree[num] = tree[num<<1] + tree[num<<1|1];//如果沒有被完全覆蓋
}

int bin(double tag,int top)//離散化二分找位置
{
    int bo=0;
    int to=top-1;
    int mid;
    while(bo<=to)
    {
        mid=(bo+to)>>1;
        if(X[mid]==tag)return mid;
        else if(X[mid]>tag)to=mid-1;
        else bo=mid+1;
    }
    return -1;
}

void update(int num,int s,int e,int l,int r,int val)
{

    if(l<=s && r>=e)
    {
        cnt[num]+=val;
        pushup(num,s,e);//如果不要這句的話   自己這個節點就沒有被更新了
        return ;
    }
    int mid=(s+e)>>1;

    if(l<=mid)update(num<<1,s,mid,l,r,val);
    if(r>mid)update(num<<1|1,mid+1,e,l,r,val);

    pushup(num,s,e);
}

int main()
{
    int n;
    int cas=1;
    while(scanf("%d",&n)!=EOF && n)
    {
        int m=0;
        while(n--)
        {
            double a,b,c,d;
            scanf("%lf%lf%lf%lf",&a,&b,&c,&d);//離散化
            X[m]=a;
            L[m].s=a;L[m].e=c;L[m].h=b;L[m++].type=1;
            X[m]=c;
            L[m].s=a;L[m].e=c;L[m].h=d;L[m++].type=-1;
        }
        sort(L,L+m,cmp);
        sort(X,X+m);

        int k=1;
        for(int i=1;i<m;i++)
        {
            if(X[i]!=X[i-1])X[k++]=X[i];
        }
        memset(tree,0,sizeof(tree));
        memset(cnt,0,sizeof(cnt));
        double ans=0;
        for(int i=0;i<m-1;i++)
        {
            int lef=bin(L[i].s,k);
            int rig=bin(L[i].e,k)-1;

            if(lef<=rig)update(1,0,k,lef,rig,L[i].type);
            ans+=tree[1]*(L[i+1].h - L[i].h);

        }
        printf("Test case #%d\nTotal explored area: %.2lf\n\n",cas++ , ans);
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved