qzezoj 1591 序列詢問

2021-10-04 20:04:27 字數 1524 閱讀 8710

題面傳送門

看資料範圍,對於 100

%100\%

100%

的資料 1≤n

≤105

,1≤a

i≤10

9,1≤

m≤10

51 \leq n \leq 10^5, 1 \leq a_i \leq 10^9, 1 \leq m \leq10^5

1≤n≤10

5,1≤

ai​≤

109,

1≤m≤

105 ,可能是o(n

logn

)o(nlogn)

o(nlog

n)或o (n

n)

o(n\sqrt n)

o(nn​)

,再看開了兩秒,就知道是o(n

n)

o(n\sqrt n)

o(nn​)

了。這道題是一道資料分治的題目。這讓我想起了這道題,同樣也可以資料分治。

我們思考一下怎麼資料分治。由於這道題是沒有修改的,則一定可以預處理出一部分答案。我們設我們處理出k

kk個答案,則處理出k

kk個答案的複雜度是o(n

k)

o(nk)

o(nk

)的,而處理剩下的直接查詢的答案的複雜度是o(n

mk

)o(\frac)

o(knm​

),兩個合併一下得到o(n

(k+m

k)

)o(n(k+\frac))

o(n(k+

km​)

),顯然k

kk取m

\sqrt m

m​最優,但這樣如果m

mm很大n

nn很小會造成不可避免的錯誤,所以換成與m

mm同階的n

nn,k

kk取n

\sqrt n

n​。同時我們的空間複雜度和時間複雜度一樣,都是o(n

n)

o(n\sqrt n)

o(nn​)

,所以空間只能開成160

×100000

160\times 100000

160×10

0000

,所以k

kk還要對160

16016

0取乙個min

minmi

n**實現:

#include

#include

#define min(a,b) ((a)<(b)?(a):(b))

using

namespace std;

long

long n,m,k,x,y,ans,f[

100039][

160]

,a[100039];

intmain()

scanf

("%lld"

,&m)

;for

(i=1

;i<=m;i++

)}

30 序列構造

給定兩個長度為 n 的正整數序列 a a1,a2,an 和 b b1,b2,bn 現在你選擇 k 個數構成序列 p p1,p2,pk 使得 序列 p 中的元素是不重複的1 pi n 其中1 i k2 ap1 a pk 大於序列 a 所有元素的和2 bp1 b pk 大於序列 b 所有元素的和 k 小...

192220序列型別

序列表示索引未非負整數的有序物件集合,包括字串,列表,元祖。說明 舉例 元祖跟裡面的逗號相關 mytuple a b c d type mytuple 列表根中括號相關 mylist a b c d type mylist 字串跟雙引號有關 mystr a,b,c,d type mystr 適用於所...

38 序列解包

序列解包可以用於元組 列表 字典。序列解包可以讓我們方便的對多個變數賦值。1 也就是以下 效果 類似。in 35 a,b c,d 1,2 3,4 in 36 aout 36 1in 37 bout 37 2in 38 cout 38 3in 39 dout 39 4序列解包用於字典時,預設是對 鍵 ...