wikioi 2216 行星序列(線段樹)

2021-09-06 17:47:30 字數 2483 閱讀 6641

這題太讓我感動了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 43

1 2 3 4 5 6 7

51 2 5 5

3 2 4

2 3 7 9

3 1 3

3 4 7

2

358

100%的資料中,m,n<=100000

40%的資料中,m,n<=10000

735 行星碰撞

給定乙個整數陣列asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆移...

leetcode 735 行星碰撞

給定乙個整數陣列asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆移...

leetcode 735 行星碰撞

給定乙個整數陣列 asteroids,表示在同一行的行星。對於陣列中的每乙個元素,其絕對值表示行星的大小,正負表示行星的移動方向 正表示向右移動,負表示向左移動 每一顆行星以相同的速度移動。找出碰撞後剩下的所有行星。碰撞規則 兩個行星相互碰撞,較小的行星會 如果兩顆行星大小相同,則兩顆行星都會 兩顆...