第一次脫離模板寫線段樹題目(洛谷的線段樹模板題太**了)。言歸正傳,這是乙個未完成版的線段樹,因為一直到最後都沒有發現為什麼第一組資料會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,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止...