TJOI2018 數學計算(線段樹)

2021-10-02 11:42:00 字數 1134 閱讀 7607

題目描述

因為我在學校做過類似的題,所以這題一眼秒了

這題我們首先會想到乘法逆元,但發現不太可做。

這時我們仔細考慮平衡樹,發現我們可以按照操作得到乙個陣列。最後通過線段樹查詢所有數的乘積。

對於操作1,我們可以將陣列第i

ii個數由1變為xxx

對於操作2,我們可以將陣列第i

ii個數的值變為1

輸出的話,甚至連線段樹的que

ry

query

quer

y函式都不用寫,直接輸出根節點的值就可以了

# include

using

namespace std;

const

int n =

2e5+10;

const

int inf = int_max;

#define ll long long

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

#define _for(i,a,b) for(int i = a;i >= b;i--)

template

<

typename t>

void

read

(t &x)

ll t[n *4]

;int t,q,mod;

void

change

(int x,

int l,

int r,

int xx,

int yy)

//將第xx個數的值改為yy

int mid =

(l + r)

>>1;

if(xx <= mid)

change

(x <<

1,l,mid,xx,yy)

;else

change

(x <<1|

1,mid +

1,r,xx,yy)

; t[x]

= t[x <<1]

* t[x <<1|

1]% mod;

}int

main()

}return0;

}

TJOI2018 數學計算(線段樹)

描述 小豆現在有乙個數 x xx 初始值為 1 11 小豆有 q qq 次操作,操作有兩種型別 1 11 m x x m x x m x x m 輸出 xxxm od modmodmm m 2 pos pospo s x x x x x x 第 pos 次操作所乘的數 保證第 pos pospo s...

TJOI2018 數學計算 線段樹

題面 題解 考場上看到這題,沒想到竟然是省選原題qaq,考場上把它當數學題想了好久,因為不知道怎麼處理有些數沒有逆元的問題。知道這是線段樹後恍然大悟。首先可以一開始就建出乙個長度為n的操作序列,初始值都是1,表示一開始預設是1乘上n個1,因為乘1也就相當於沒乘。對於操作1,直接將操作序列上對應的位置...

TJOI2018 數學計算 線段樹水題

描述 小豆現在有乙個數 x xx,初始值為 1 11 小豆有 q qq次操作,操作有兩種型別 1 11m mm x x m x x m x x m 輸出 xmo dm x mod m xmodm 2 22p os pospo s x x x x x x 第p os pospo s次操作所乘的數 保證...