記錄3個變數。
sum[i]:當前區間被覆蓋2次及兩次以上的面積。
num[i]:當前區間被覆蓋1次及一次以上的面積。
cover[i]:覆蓋的lazy標記。
對於每乙個區間.
更新操作如下:
void push_up(int_now)
if(cover[rt]==1)
if(cover[rt]>=2)
}
那麼剩下的問題就是簡單的區間更新問題了。
還有,要注意每乙個點所代表的含義。
我的每個點代表的含義為當前點到下乙個點的長度。
#include#include#include#include#include#include#include#include#pragma comment(linker, "/stack:1024000000,1024000000")
using namespace std;
#define maxn 11000
#define mem(a,b) (memset(a),b,sizeof(a))
#define lmin 1
#define rmax len
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define now l,r,rt
#define int_now int l,int r,int rt
#define inf 99999999
#define ll long long
#define mod 10007
#define eps 1e-6
#define zero(x) (fabs(x)mp;
double du[4010];
int len;
struct list
node[maxn];
struct linen
}line[maxn*2];
double sum[maxn*4*4*2];
double num[maxn*4*4*2];
int cover[maxn*4*4*2];
void push_up(int_now)
if(cover[rt]==1)
if(cover[rt]>=2)
}void push_down(int_now)
void creat(int_now)
void updata(int ll,int rr,int x,int_now)
updata(ll,rr,x,lson);
updata(ll,rr,x,rson);
push_up(now);
}int main()
sort(line+1,line+n*2+1);
sort(du+1,du+s+1);
du[0]=-1;
len =0;
mp.clear();
for(int i=1;i<=s;i++)
}creat(root);
double st=0;
double are=0.0;
len--;
for(int i=1;i<=n*2;i++)
updata(l,r-1,line[i].leap,root);
}printf("%.2lf\n",are);
}return 0;
}
hdu 1255 覆蓋的面積(線段樹求面積交)
給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.雖說覆蓋兩次區域的面積,但是這道題實際上就是求矩形的面積交。膜拜能夠想出這種解法的神牛,竟然能把實際的東西用這麼抽象的語言表示出來,實在是佩服,現在關於掃瞄線的題才做了幾道,沒有對其深刻理解,但是多練總可以理解的,奮鬥吧!acmer!我是...
HDU 1255 覆蓋的面積(線段樹求矩形面積交)
題意 給出n個矩形,求出至少被兩塊矩形覆蓋的面積。思路 跟面積並類似的做法,不同的是每個節點要額外維護乙個至少被覆蓋兩次的長度dcnt,此外還是要維護至少覆蓋一次的長度cnt,然後每次由當前結點的cover標記和子節點的dcnt,cnt值來推出當前結點的dcnt,cnt值。include inclu...
HDU 1255 覆蓋的面積 線段樹 掃瞄線
還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...