洛谷P2023 AHOI2009 維護序列

2021-10-03 01:55:11 字數 2211 閱讀 7338

題目鏈結-p2023 [ahoi2009]維護序列

解題思路

經典線段樹題目

注意

一定記得要取模!!!而且建樹時要把乘法lazytag(即t[i].mul)置為1!!!如果不用讀入優化就老老實實scanf,否則容易超時

做這個題之前或者做完這個題想再鞏固一下,可以看看這道題,兩道題幾乎一模一樣——>洛谷p3373 【模板】線段樹 2

附上**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define lowbit(x) (x &(-x))

using

namespace std;

const

int inf=

0x3f3f3f3f

;const

double pi=

acos(-

1.0)

;const

double eps=

1e-10

;const

int m=

1e9+7;

const

int n=

1e5+5;

typedef

long

long ll;

typedef pair<

int,

int> pii;

ll a[n]

,n,p;

struct nodet[n<<2]

;//線段樹結構體,sum表示此時的答案,mul表示乘法上的lazy標記,plu是加法上的

void

push_up

(ll i)

void

build

(ll l,ll r,ll i)

ll m=l+

((r-l)

>>1)

;//m則為中間點,左兒子的結點區間為[l,m],右兒子的結點區間為[m+1,r]

build

(l,m,i<<1)

;build

(m+1

,r,i<<1|

1);//構造左右子節點

push_up

(i);

//更新父節點

}void

pushdown

(ll i)

void

updata

(ll l,ll r,ll add,ll mult,ll i)

pushdown

(i);

ll m=t[i]

.l+(

(t[i]

.r-t[i]

.l)>>1)

;if(l<=m)

updata

(l,r,add,mult,i<<1)

;if(m

updata

(l,r,add,mult,i<<1|

1);push_up

(i);

//更新父節點

}ll query

(ll l,ll r,ll i)

signed

main()

else

if(op==2)

else

printf

("%lld\n"

,query

(l,r,1)

%p);

}return0;

}

P2023 AHOI2009 維護序列

線段樹模板題 此題關鍵在於 pushdown 考慮加法標記 lt1 和 乘法標記 lt2 考慮到乘法優先順序 要 高於 加法優先順序 因此在 pushdown 裡先 傳 lt2 再傳 lt1 注意 lt2 傳的時候,兩個兒子的 lt1 也都要乘上 lt2 code include define in...

洛谷 P2051 AHOI2009 中國象棋

題目描述 這次小可可想解決的難題和中國象棋有關,在乙個n行m列的棋盤上,讓你放若干個炮 可以是0個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起...

洛谷 P2051 AHOI2009 中國象棋

這道題主要是狀態很難想到 首先可以看出每行每列不能超過2個棋子 也就是說有0,1,2三種狀態 所以可以一行一行來處理 那就用放了0個棋子的列數是 那麼這個時候狀態轉移方程就非常好寫了。對於當前這一行可以不放,放乙個,放兩個棋子 表示沒有棋子的列,1表示有1個棋子的列。那麼有幾種情況 不放放乙個在 放...