線段樹掃瞄線 hdu1542 Atlantis

2021-07-15 13:45:18 字數 1205 閱讀 5966

這幾天線段樹學習中,但是掃瞄線這一段一直沒寫出**來 努力了好幾天終於可以了

這裡是寫掃瞄線**需要注意的地方:

1.每次插入一條線段的時候 只有當該線段和該節點表示的線段恰好相等的時候,才對mark標記一下,即使是區間包含插入的線段也要向下推。

2.不需要延遲標記,因為你插入了一條線段以後一定會完完全全的刪除 

3.每次更新的時候 ,先找到最底下一層(也就是插入線段和節點所管理的線段正好相等的時候) ,然後我們可以保證最底下一層是正確的,然後依次往上更新,用下面的正確資訊去更新最上面的!

#include #include #include #include #include #include #include #include using namespace std;

const int maxn=1000;

struct seg;

seg(double x1,double x2,double x3,double x4) :l(x1),r(x2),h(x3),op(x4) {};

bool operator < (const seg &a) const

void update(int l,int r,int num,int left,int right,int op)

int mid=(left+right)/2;

if(r<=mid) update(l,r,2*num,left,mid,op);

else if(l>mid) update(l,r,2*num+1,mid+1,r,op);

else update(l,mid,2*num,left,mid,op),update(mid+1,r,2*num+1,mid+1,right,op);

if(mark[num]) sum[num]=hashh[right+1]-hashh[left];

else sum[num]=sum[2*num]+sum[2*num+1];

}int cmp(double a,double b) //input

sort(hashh.begin(),hashh.end(),cmp),unique(hashh.begin(),hashh.end());

sort(t,t+cnt);//有cnt個線段 cnt個點 對 lim建立乙個從一開始的線段樹 此過程不需要任何動作

double s=0;

int lim=(int)hashh.size();

for(int i=0;i

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...