乙個連線,還不錯:
hdu1542:
題意:給你每個長方形的左下點的座標和右上點的座標,求他們的面積和。
hdu 1255:
題意:給你每個長方形的左下點的座標和右上點的座標,求出被這些矩形覆蓋過至少兩次的區域的面積
與上一題議題差別在第一題求總的面積,第二題求覆蓋兩次以上的面積。就len2表示下。
1.q[rt].s>1 : 說明該區間被覆蓋兩次或以上,那麼長度就可以直接計算,就是該區間的長度
剩下的情況就是q[rt].s=1或q[rt].s=0
2.先看葉子節點,因為是葉子沒有孩子了,所以被覆蓋兩次貨以上的長度就是0(無論q[rt].s=1或q[rt].s=0都是0,因為是葉子。。。)
3.不是葉子節點 ,且q[rt].s=1.注意這裡,q[rt].s=1確切的意義是什麼,應該是,可以確定,這個區間被完全覆蓋了1次,而有沒有被完全覆蓋兩次或以上則不知道無法確定,那麼怎麼怎麼辦了,只要加上q[ls].len1+q[rs].len1 即,看看左右孩子區間被覆蓋了一次或以上的長度,那麼疊加在雙親上就是雙親被覆蓋兩次或以上的長度
3.不是葉子節點,且q[rt].s=0,確切的意義應該是不完全不知道被覆蓋的情況(不知道有沒有被覆蓋,被覆蓋了幾次,長度是多少都不知道),這種情況,只能由其左右孩子的資訊所得
q[ls].len2+q[rs].len2 , 即直接將左右孩子給覆蓋了兩次或以上的長度加起來,這樣才能做到不重不漏
#include #include #include #include #include #include #include #include #include #include #define ull unsigned long long
#define ls rt<<1
#define rs rt<<1|1
#define mems(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod=1000000007;
const int n=2210;
const double pi=acos(-1);
const int inf=0x3f3f3f3f;
const int m=50000+5;
struct edge
edge(double l,double r,double h,int f):l(l),r(r),h(h),f(f) {}
bool operator <(const edge &a) const
return -1;
}void build(int l,int r,int rt)
void pushup(int rt)
else if(q[rt].l==q[rt].r)//這是乙個點
else
// if(q[rt].s>1)//該區間被覆蓋兩次以上
// q[rt].len2=x[q[rt].r+1]-x[q[rt].l];
// else if(q[rt].l==q[rt].r)
// q[rt].len2=0;
// else if(q[rt].s==1)
// q[rt].len2=q[ls].len1+q[rs].len1;
// else
// q[rt].len2=q[ls].len2+q[rs].len2;
}void update(int l,int r,int c,int rt)
int mid=(q[rt].l+q[rt].r)>>1;
if(r<=mid)
update(l,r,c,ls);
else if(l>mid)
update(l,r,c,rs);
else
pushup(rt);
}int main()
sort(e,e+tot);
//離散化座標
sort(x,x+tot);
int k=unique(x,x+tot)-x;//去重
build(0,k-1,1);
double ans=0.0;
for(int i=0;iprintf("test case #%d\n",p++);
printf("total explored area: %.2f\n\n",ans);
}return 0;
}
hdu1542(線段樹 掃瞄線)
裸的掃瞄線,學習掃瞄線的題目。具體掃瞄線的原理我不講了,我是看大神們的部落格懂得,就算寫也沒大神屌。下面我給出我的 裡面的注釋是我認為比較重要的地方 include include include includeusing namespace std const int max 210 int n ...
hdu 1542 掃瞄線 線段樹
題目大意 求矩形面積的並 思路 按y軸排序,然後將x投影到線段樹上做乙個線段覆蓋問題即可 注意 為了避免重複,線段座標右端點是開區間,更新時需要加上1 include include include include include define fo i,a,b for int i a i b i ...
hdu1542(線段樹 掃瞄線)
題目連線 又看到了幾個月前做的題,感覺那時候就是個sb 也怪自己剛開始沒搞清楚線段樹,瞎摸索 用連續線段樹很好理解這個題,之前的 稍微改了一下就好理解多了 1 include2 include3 include4 define lson l,m,rt 1 5 define rson m,r,rt 1...