與poj1151略有不同 由於是大於等於2 的有效 所以應該更新到點
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
const int dir[4][2]=;
#define maxn 2005
struct tree
tree[maxn*4];
struct line
line[maxn];
bool cmp(line a,line b)//sort排序的函式
double y[maxn];//記錄y座標
void build(int l,int r,int root)
void calen(int root)
if(tree[root].l+1==tree[root].r) tree[root].cnt=0;
else tree[root].cnt=tree[root<<1].cnt+tree[root<<1|1].cnt;
}void update(int root,struct line e)
if(e.y2<=tree[root<<1].rf)update(root<<1,e);
else if(e.y1>=tree[root<<1|1].lf)update(root<<1|1,e);
else
calen(root);
}int main()
k--;
sort(line+1,line+k+1,cmp);
sort(y+1,y+k+1);
build(1,k,1);
update(1,line[1]);
double ans=0;
for(i=2;i<=k;i++)
printf("%.2lf\n",ans);
} return 0;
}
也可以更新到段,通過覆蓋一層的面積去更新覆蓋兩層的面積
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
const int dir[4][2]=;
#define maxn 2005
struct tree
tree[maxn*4];
struct line
line[maxn];
bool cmp(line a,line b)//sort排序的函式
double y[maxn];//記錄y座標
void build(int l,int r,int root)
void calen(int root)
else if(tree[root].c==1)
if(tree[root].l+1==tree[root].r)
else }
void update(int root,struct line e)
if(e.y2<=tree[root<<1].rf)update(root<<1,e);
else if(e.y1>=tree[root<<1|1].lf)update(root<<1|1,e);
else
calen(root);
}int main()
k--;
sort(line+1,line+k+1,cmp);
sort(y+1,y+k+1);
build(1,k,1);
update(1,line[1]);
double ans=0;
for(i=2;i<=k;i++)
printf("%.2lf\n",ans);
} return 0;
}
HDU 1255 覆蓋的面積
題目鏈結點這裡 這道題,很久以前做過,當時寫了個暴力,居然過了,然後一直想寫下線段樹的,結果一直被各種事搞得忘了。現在終於填坑了。include include include includeusing namespace std define mem x,y memset x,y,sizeof x...
HDU 1255 覆蓋的面積
題目 給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.input 輸入資料的第一行是乙個正整數t 1 t 100 代表測試資料的數量.每個測試資料的第一行是乙個正整數n 1 n 1000 代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標...
HDU 1255 覆蓋的面積
problem description 給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.輸入資料的第一行是乙個正整數t 1 t 100 代表測試資料的數量.每個測試資料的第一行是乙個正整數n 1 n 1000 代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的...