#includeusing namespace std;
#define ll long long
const int maxn=1010;
int n;
double x[maxn<<1];
struct edge;
edge(double a,double b,double c,int d):l(a),r(b),h(c),v(d){};
bool operator<(const edge &b)const
void cal(int l,int r,int rt)else if(st[rt].l==st[rt].r)else
///if(st[rt].cnt>1)else if(l==r)else if(st[rt].cnt==1)else
}void update(int a,int b,int v,int l,int r,int rt)
int m=l+r>>1;
if(a<=m)update(a,b,v,l,m,rt<<1);
if(b>m)update(a,b,v,m+1,r,rt<<1|1);
cal(l,r,rt);
}int main()
sort(x+1,x+tt+1);
sort(edge+1,edge+tt+1);
int m=1;
for(int i=2;i<=tt;i++)
build(1,m,1);
double ans=0;
for(int i=1;i大部分**風格能和掃瞄線保持一致還蠻開心的。。
多次覆蓋的核心就在於cal函式
若當前區間被覆蓋過一次,當前區間被覆蓋2次的長度就加上子節點們覆蓋1次的長度
當時聽學長講的時候還感覺很迷,當時光聽,沒分清楚覆蓋次數和覆蓋長度。。orz
估計判ac的時候給了eps吧。。不然我樣例都沒過啊(
hdu 1255 覆蓋的面積 掃瞄線
一道挺簡單的題,讓我折騰了許久。主要卡在了更新節點後維護父親節點上。後來思路明確了就很容易了。節點資訊 l,r 區間端點 cnt 區間被覆蓋的次數,cnt 0說明沒有被完全覆蓋。len1 區間被覆蓋的長度 len2 區間至少被兩條線段覆蓋的長度。只要找到父親節點與子節點在len1,len2,cnt的...
覆蓋的面積 HDU 1255(掃瞄線求面積交)
題意 就是掃瞄線求面積交 解析 參考求面積並。就是把down的判斷條件改了一下。由w 0 改為 w 1 同時要討論一下 1 時 的情況,所以就要用到乙個臨時的sum。具體看 把 include include include include include include include inclu...
HDU 1255 覆蓋的面積 線段樹 掃瞄線
還是先離散化座標,然後用線段樹掃瞄線 其中sum代表被覆蓋過一次的長度,sum2代表被覆蓋過2次及以上的長度。然後注意pushup操作比較麻煩。id sdj22251 prog subset lang c include include include include include include...