AK(線段樹 分塊)

2021-08-28 17:34:28 字數 3665 閱讀 9777

ak

【問題描述】

noipoipoip考場上 ,馬里奧 順利地切掉了前兩題,他只要再最後一就可以 ak 了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和並且把它們都變成原來的平方。馬里奧瞬間就切掉了這道題,但他覺得對 並且把它們都變成原來的平方。馬里奧瞬間就切掉了這道題,但他覺得對 並且把它們都變成原來的平方。馬里奧瞬間就切掉了這道題,但他覺得對 於別人來說太難了。出題在和馬里奧商量後,決定詢問時只要求返回模 於別人來說太難了。出題在和馬里奧商量後,決定詢問時只要求返回模 於別人來說太難了。出題在和馬里奧商量後,決定詢問時只要求返回模 乙個 數 c = 2305843008676823040 的結果。作為另一名noip選手的你也已經切掉了 選手的你也已經切掉了 前兩題,你能夠解決這個修改後的問順利 ak 嗎?

【輸入格式】

第一行 兩個整數 n,m ,表示 數字 個數 和詢問個數 。

接下來 一行 n個數字 ai ,表示 序列的 初始值。

接下 來 m行,每兩個整數 l,r 表示詢問區間 。

【輸出格式】

對於每次詢問,你需要輸出乙個整數表示應的結果。

這題線段樹啊分塊都行

主要是模數上做了手腳,就是說當乙個數平方六十次左右的時候就會開始迴圈了(1000000以內只要28次),所以……又是優化暴力。

線段樹

#include

#define lson(x) (x<<1)

#define rson(x) ((x<<1)|1)

using

namespace std;

typedef

unsigned

long

long ll;

const ll mod =

2305843008676823040ull

;const

int maxn=

100500

;int n,m;

ll ans,val[maxn]

;struct treetree[maxn<<2]

;inline ll mul

(ll x,ll y)

return res;

}inline

void

build

(int left,

int right,

int cur)

int mid=

(left+right)

>>1;

build

(left,mid,

(cur<<1)

);build

(mid+

1,right,

(cur<<1)

|1);

tree[cur]

.val=tree[

(cur<<1)

].val+tree[

((cur<<1)

|1)]

.val;

}inline

void

query

(int a,

int b,

int cur)

if(left==right)

tree[cur]

.val=tmp;

return;}

int mid=

(left+right)

>>1;

if(b<=mid)

query

(a,b,

(cur<<1)

);else

if(a>mid)

query

(a,b,

((cur<<1)

|1))

;else

tree[cur]

.val=

(tree[

(cur<<1)

].val+tree[

((cur<<1)

|1)]

.val)

%mod;

if(tree[cur<<1]

.flag && tree[

(cur<<1)

|1].flag ) tree[cur]

.flag=1;

}int

main()

return0;

}

分塊

# include

# define int long long

# define rint register long long

using

namespace std;

const

int mo=

2305843008676823040

,e=30

,maxn=(2

<<16)

+1;int n,m,bl;

int f[maxn]

,l[maxn]

,r[maxn]

,sum[maxn]

,cnt[maxn]

;struct reca[maxn]

;inline

intread()

while

(c>=

'0'&&c<=

'9') x=

(x<<3)

+(x<<1)

+(c^48)

,c=getchar()

;return w?

-x:x;

}inline

void

print

(rint x)

inline

intfather

(rint x)

inline

intmul

(rint a,rint b)

return res%mo;

}inline

intsolve

(rint l,rint r)

for(rint i=l;i<=r[lb]

;i++

) ans=

(ans+a[i]

.val)

%mo;

for(rint i=r;i>=l[rb]

;i--

) ans=

(ans+a[i]

.val)

%mo;

for(rint i=lb+

1;i<=rb-

1;i++

) ans=

(ans+sum[i]

)%mo;

return ans%mo;

}inline

void

update

(rint l,rint r)

}signed

main()

a[i]

.val=

read()

; a[i]

.bl=bl;

sum[bl]

=(sum[bl]

+a[i]

.val)

%mo;

} r[bl]

=n; rint l,r;

while

(m--

)return0;

}

分塊 線段樹模板

線段樹的一些操作其實用分塊也可以很方便就做掉,至於時間效率也不會慢很多,主要是好寫 對於區間加法一樣用lazy陣列標記,如果區間覆蓋整塊,則把塊給標記上,否則暴力加減,維護sum和lazy陣列 include cmath include cstdio include cstdlib include ...

模擬8 05 優美序列 線段樹 分塊 ST演算法

如此顯然的線段樹,我又瞎了眼了 事實上跟以前的奇襲很像.只要滿足公式maxn minn 權值 r l即可 所以可以考慮建兩顆樹,一棵節點維護位置,一棵權值,每次從一棵樹樹上查詢資訊,如果滿足公式就停止,不然兩顆樹不斷擴充套件區間 當然也可以用st啦 查詢o 1 優於線段樹 1 include2 in...

CDOJ 1292 卿學姐種花 暴力 分塊 線段樹

眾所周知,在喵哈哈村,有乙個溫柔善良的卿學姐。卿學姐喜歡和她一樣美麗的花。所以卿學姐家的後院有很多的花壇。卿學姐有 n 個花壇,一開始第 i 個花壇裡有 a i 朵花。每過一段時間,卿學姐都會在花壇裡種上新的花。作為乙個聰明的學姐,卿學姐的種花方式也是與眾不同 每一次,卿學姐會在第 x 個花壇種上 ...