洛谷 P1047 校門外的樹 線段樹版

2021-09-01 09:23:22 字數 2852 閱讀 6758

第一次脫離模板寫線段樹題目(洛谷的線段樹模板題太**了)。言歸正傳,這是乙個未完成版的線段樹,因為一直到最後都沒有發現為什麼第一組資料會wa.後來苦心研究之後,發現線段樹處理0的時候會有問題,於是想了兩個解決辦法應對該情況。

這個題目唯一的坑點在於從0開始,意思是輸入的500實質上有501棵樹,而線段樹的結點和範圍都必須從1開始,這也是做這題的教訓吧。

解決辦法1:將陣列範圍,修改左邊界與修改右邊界各加一,也就是輸入範圍為500時實質上建樹時是501,修改範圍輸入100~200實際上查詢101~201.

貼上**:

#include#include #include  #include  #include  #include   #include   #include   #include   #include    #include    #include      typedef long long ll;

#define rep(i,a,n) for (int i = a; i < n; ++i)

#define per(i,a,n) for (int i = n-1; i >= a; --i)

#define sz(x) ((int)x.size())

using namespace std;

//head

#define maxn 1000006

ll sx[maxn << 2];

inline ll ls(ll x)

inline ll rs(ll x)

inline void push_down(ll o, ll lc, ll rc);

inline void maintain(ll o)

void build(ll o, ll lc, ll rc)

ll m = (lc + rc) >> 1;

build(ls(o), lc, m);

build(rs(o), m + 1, rc);

maintain(o);

}void update(ll o, ll lc, ll rc, ll ql, ll qr)

ll m = (lc + rc) >> 1;

if (ql <= m) update(ls(o), lc, m, ql, qr);

if (qr > m) update(rs(o), m + 1, rc, ql, qr);

maintain(o);

}inline void push_down(ll o, ll lc, ll rc)

ll m = (lc + rc) >> 1;

push_down(ls(o), lc, m);

push_down(rs(o), m + 1, rc);

maintain(o);

}int main()

printf("%lld\n", sx[1]);

return 0;

}

解決辦法2:

這個是朋友想出來的,用乙個flag,如果碰到0則flag = 1,如果flag = 1則答案加1

這裡還有個坑就是修改0~0時線段樹會炸

貼上**:

#include#include #include  #include  #include  #include   #include   #include   #include   #include    #include    #include      typedef long long ll;

#define rep(i,a,n) for (int i = a; i < n; ++i)

#define per(i,a,n) for (int i = n-1; i >= a; --i)

#define sz(x) ((int)x.size())

using namespace std;

//head

#define maxn 1000006

ll sx[maxn << 2];

inline ll ls(ll x)

inline ll rs(ll x)

inline void push_down(ll o, ll lc, ll rc);

inline void maintain(ll o)

void build(ll o, ll lc, ll rc)

ll m = (lc + rc) >> 1;

build(ls(o), lc, m);

build(rs(o), m + 1, rc);

maintain(o);

}void update(ll o, ll lc, ll rc, ll ql, ll qr)

ll m = (lc + rc) >> 1;

if (ql <= m) update(ls(o), lc, m, ql, qr);

if (qr > m) update(rs(o), m + 1, rc, ql, qr);

maintain(o);

}inline void push_down(ll o, ll lc, ll rc)

ll m = (lc + rc) >> 1;

push_down(ls(o), lc, m);

push_down(rs(o), m + 1, rc);

maintain(o);

}int main()

else if(a == 0)

flag = 1;

update(1, 1, l, a, b);

} if(flag)

printf("%lld\n", sx[1]);

else

printf("%lld\n", sx[1] + 1);

return 0;

}

洛谷 p1047 校門外的樹

洛谷 p1047 校門外的樹 題目描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點...

洛谷P1047 校門外的樹

輸入輸出樣例 說明code 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在ll的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表...

洛谷P1047 校門外的樹

某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...