小奇的數列

2022-08-04 09:06:16 字數 2580 閱讀 4985

【題目 背景】

小奇總是在數學課上思考奇怪的問題。

【問題描述】

給定乙個長度為 n 的數列, 以及 m 次詢問, 每次給出三個數 l, r 和 p, 詢問 (a[l' ] + a[l' +1] + . . . + a[r' ] ) mod p 的最小值。 其中 l <= l' <= r' <= r。 即模意義下的區間子串和最小值。

【輸入格式】

第一行包含兩個正整數 n 和 m, 表示數列的長度和詢問的個數。 第二行為 n 個整數, 為 a[1] . . a[n] 。 接下來 m 行, 每行三個數 l, r 和 p, 代表一次詢問。

【輸出格式】

對於每次詢問, 輸出一行乙個整數表示要求的結果

【樣例輸入】4 2

8 15 9 9

1 3 10

1 4 17

【樣例輸出】

21【資料範圍】

對於 20%的資料 n<=100, m<=100, p<=200

對於 40%的資料 n<=200, m<=1000, p<=500

對於 70%的資料 n<=100000, m<=10000, p<=200

對於 100%的資料 n<=500000, m<=10000, p<=500, 1<=a[i] <=10^9

題解(這是老師發下來的)

對於20%的資料,最暴力的做法,在區間內列舉子串,暴力求和取模,最後得出最小值,複雜度m*n^3

對於40%的資料,演算法1的區間求和改用字首和相減,複雜度m*n^2

接下來,思考一下抽屜原理,如果詢問的區間長度大等p的話,一定有兩個字首和相減等於0,那麼直接輸出0即可

對於70%的資料,把所有長度大等p的區間特判,其餘暴力,複雜度m*p^2

考慮生日悖論,數列如果是隨機生成的,找到2個字首和相同的就返回0,期望複雜度為m*p

由於第10組資料是隨機生成的,所以演算法3可以通過8個測試點

對於100%的資料,使用平衡樹來尋找某個數的前驅,複雜度為m*p*logp(可能高於noip難度),需要手寫treap,splay或替罪羊樹等。set由於常數較大,實測和暴力結果一樣。

(下面是我自己的話)

首先下面這一句話十分有用:

接下來,思考一下抽屜原理,如果詢問的區間長度大等p的話,一定有兩個字首和相減等於0,那麼直接輸出0即可

但如果你沒法理解,可以自己舉幾個例子直觀感知一下(小提示,往餘數上想想)

所以對於每乙個詢問區間我們都insert出乙個平衡樹就是把之前記錄的字首和 從 s[l]-s[l-1] ~ s[r]-s[l-1],每一段字首和都插入,然後邊插入一遍查詢此時這一段字首和在平衡樹里的前繼是誰,此時的前繼與這一段字首和的差值一定是最小的。對於每一段都這樣查詢,就可以得到這個區間在模p意義下的最小字段和了。

具體細節請看**

1 #include2 #include3 #include4 #include5 #include6

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

8#define dwn(i,a,b) for(register int i=a;i>=b;--i)

9#define re register

10#define pn putchar('\n')

11#define llg long long

12using

namespace

std;

13const

int n=5e5+10;14

intn,m,p;

15int ch[n][2],val[n],cnt[n],fa[n],bh=0;16

int a[n],root=0

,l,r,fn;

17llg s[n];

18 inline void read(int &v)

2425

void write(int

x)30

void clear(int

x)33

bool wson(int

x)36

void rotate(int

x)50

51void splay(int x,int

goal)

58rotate(x);59}

60if(goal==0)root=x;61}

6263

void insert(int

dt)71

int now=root,pa=0;72

while(1

)76 pa=now;

77 now=ch[now][val[now]78if(!now)85}

86}8788

intpre()

9596

intmain()

110for(j,l,r)

117write(fn); pn;

118}

119fclose(stdin); fclose(stdout);

120return0;

121 }

小奇挖礦 Explo

題目背景 小奇要開採一些礦物,它駕駛著一台帶有鑽頭 初始能力值 w 的飛船,按既定路線依次飛過喵星系的 n 個星球。問題描述 星球分為 2 類 資源型和維修型。1.資源型 含礦物質量 a i 若選擇開採,則得到 a i p 的金錢,之後鑽頭損耗 k 即p p 1 0.01k 2.維修型 維護費用 b...

小奇挖礦 解題報告

小奇挖礦 題目背景 小奇要開採一些礦物,它駕駛著一台帶有鑽頭 初始能力值w 的飛船,按既定路線依次飛過喵星系的n個星球。問題描述 星球分為2類 資源型和維修型。1.資源型 含礦物質量a i 若選擇開採,則得到a i p的金錢,之後鑽頭損耗k 即p p 1 0.01k 2.維修型 維護費用b i 若選...

小奇遐想(樹狀陣列)

擷來一縷清風飄渺 方知今日書信未到 窗外三月天霽垂柳新長枝條 風中鳥啼猶帶歡笑 清風醉夢 小奇望著青天中的悠悠白雲,開始了無限的遐想,在它的視野中,恰好有n朵高度不同的白雲排成一排,他想從左到右選出四朵白雲a,b,c,d,使得h a輸入 第一行包括1個整數n。第二行包括n個整數,第i個正數表示h i...