這題太讓我感動了qaq,讓我找到了我一直以來寫線段樹的錯誤!!!!
就是,pushdown一定要放在最前面!要不然順序會錯。也就是說,當到達更新點時,你重合了標記,然後再pushdown,就會導致pushdown標記沒了順序。
因為有兩種運算,乘法與加法,會衝突,所以必須先pushdown!
還有一點是,要開long long !!!(我的線段是太慢了t_t)
#include #include #include #include #include #include using namespace std;#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define cc(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n)
inline const long long getint()
inline const int max(const int &a, const int &b)
inline const int min(const int &a, const int &b)
inline void pushdown(const int &x, const int &m)
void build(const int &l, const int &r, const int &x)
int m=mid;
build(lson); build(rson);
pushup(x); add2[x]=1;
}void update(const int &l, const int &r, const int &x)
int m=mid;
if(l<=m) update(lson); if(m
「神州「載人飛船的發射成功讓小可可非常激動,他立志長大後要成為一名太空飛行員假期一始,他就報名參加了「小小太空飛行員夏令營」,在這裡小可可 不僅學到了豐富的宇航知識,還參與解決了一些模擬飛行中發現的問題,今天指導老師交給他乙個任務,在這次模擬飛行的路線上有n個行星,暫且稱它們為乙個行 星序列,並將他們從1至n標號,在宇宙未知力量的作用下這n個行星的質量是不斷變化的,所以他們對飛船產生的引力也會不斷變化,小可可的任務就是在飛行途 中計算這個行星序列中某段行星的質量和,以便能及時修正飛船的飛行線路,最終到達目的地,行星序列質量變化有兩種形式:1,行星序列中某一段行星的質量全部乘以乙個值
2,行星序列中某一段行星的質量全部加上乙個值
由於行星的質量和很大,所以求出某段行星的質量和後只要輸出這個值模p的結果即可,小可可被這個任務難住了,聰明的你能夠幫他完成這個任務嗎?
第一行兩個整數n和p(1<=p<=1000000000);第二行含有n個非負整數,從左到右依次為a1,a2,…………,an(0<=ai<=100000000,1<=i<=n),其中ai表示第i個行星的質量:
第三行有乙個整數m,表示模擬行星質量變化以及求質量和等操作的總次數。從第四行開始每行描述乙個操作,輸入的操作有以下三種形式:
操作1:1 t g c 表示把所有滿足t<=i<=g的行星質量ai改為ai*c
操作2:2 t g c 表示把所有滿足t<=i<=g的行星質量ai改為ai+c
操作3:3 t g 表示輸出所有滿足t<=i<=g的ai的和模p的值
其中:1<=t<=g<=n,0<=c<=10000000
注:同一行相鄰的兩數之間用乙個空格隔開,每行開頭和末尾沒有多餘空格
對每個操作3,按照它在輸入中出現的順序,依次一行輸出乙個整數表示所求行星質量和7 431 2 3 4 5 6 7
51 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7
2358
100%的資料中,m,n<=10000040%的資料中,m,n<=10000
735 行星碰撞
給定乙個整數陣列asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆移...
leetcode 735 行星碰撞
給定乙個整數陣列asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆移...
leetcode 735 行星碰撞
給定乙個整數陣列 asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆...