当前位置: 代码迷 >> 综合 >> hdu 1542 Atlantis
  详细解决方案

hdu 1542 Atlantis

热度:69   发布时间:2023-10-29 06:35:12.0

题意

求一个矩形的面积并

题解

师姐写的很好
然后这是一个裸题

CODE:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAX=(1<<28);
const int N=1005;
double s[N][4];
struct qt
{int x,y;double d;
}p[N];int tot;
struct qr {int l,r;double d;int o; }h[N];
bool cmp (qt x,qt y)    {
   return x.d<y.d;}
double A[N];
struct qq {int l,r;double o;double c;int s1,s2,tag; }tr[N*2];int num;
void bt (int l,int r)
{int a=++num;tr[a].l=l;tr[a].r=r;tr[a].c=tr[a].tag=0;tr[a].o=A[r+1]-A[l];tr[a].s1=tr[a].s2=0;if (l==r) return ;int mid=(l+r)>>1;tr[a].l=l;tr[a].r=r;tr[a].s1=num+1;bt(l,mid);tr[a].s2=num+1;bt(mid+1,r);
}
void update (int now)
{int s1=tr[now].s1,s2=tr[now].s2;if (tr[now].tag>0)  tr[now].c=tr[now].o;else tr[now].c=tr[s1].c+tr[s2].c;
}
void change (int now,int l,int r,int o)
{
//  printf("%d %d %d\n",l,r,o);if (tr[now].l==l&&tr[now].r==r) {
   tr[now].tag+=o;update(now);return ;}int s1=tr[now].s1,s2=tr[now].s2;int mid=(tr[now].l+tr[now].r)>>1;if (r<=mid) change(s1,l,r,o);else if (l>mid) change(s2,l,r,o);else change(s1,l,mid,o),change(s2,mid+1,r,o);update(now);
}
bool cmp1 (qr x,qr y){
   return x.d<y.d;}
int main()
{for (int T=1;;T++){tot=0;int n;scanf("%d",&n);if (n==0) break;for (int u=1;u<=n;u++)for (int i=0;i<=3;i++){scanf("%lf",&s[u][i]);if (i%2==0) p[++tot].d=s[u][i],p[tot].x=u,p[tot].y=i;}sort(p+1,p+1+tot,cmp);int mx=0;p[0].d=MAX;for (int u=1;u<=tot;u++){if (p[u].d!=p[u-1].d) mx++,A[mx]=p[u].d;s[p[u].x][p[u].y]=mx;}num=0;bt(1,mx-1);/*for (int u=1;u<=num;u++)printf("%d %d %d %lf %lf\n",tr[u].l,tr[u].r,tr[u].tag,tr[u].c,tr[u].o);*/tot=0;for (int u=1;u<=n;u++){if (s[u][1]>s[u][3]) swap(s[u][1],s[u][3]);if (s[u][0]>s[u][2]) swap(s[u][0],s[u][2]);h[++tot].l=(int)s[u][0];h[tot].r=(int)s[u][2];h[tot].d=s[u][1];h[tot].o=1;h[++tot].l=(int)s[u][0];h[tot].r=(int)s[u][2];h[tot].d=s[u][3];h[tot].o=-1;}sort(h+1,h+1+tot,cmp1);double w,H,ans=0;change(1,h[1].l,h[1].r-1,h[1].o);for (int u=2;u<=tot;u++){H=h[u].d-h[u-1].d;w=tr[1].c;//printf("%lf %lf\n",w,H);ans=ans+w*H;change(1,h[u].l,h[u].r-1,h[u].o);}printf("Test case #%d\nTotal explored area: %.2lf\n\n",T,ans);}return 0;
}