09 自定義分頁器
阿新 • • 發佈:2022-04-15
開始時,seq陣列已清零。請注意seq陣列的第一個元素的下標是0 而非 1。
void something (int jump) {
for (int i = 0; i < N; i += jump)
++seq[i];
}
呼叫了 something 函式\(K\) 次,第 \(i\) 次呼叫時 \(jump=X_i\)。
接下來有 \(Q\) 次查詢,每次查詢包含兩個整數 \(L_i,R_i\) ,對於每組查詢請輸出\(∑^{R_i}_{k=L_i}seq[k]\) 。
輸入格式
第一行:\(N,\)K。 接下來一行 \(K\)個整數,第i 個為\(X_i\) 。 第$ N+2$ 行:\(Q\)
輸出格式
共 \(Q\)行,第\(i\) 行包含第\(i\) 組查詢的答案。
樣例1
input
10 4
1 1 2 1
3
0 9
2 6
7 7
output
35
18
3
樣例2
input
11 3
3 7 10
3
0 10
2 6
7 7
output
8
2
1
資料範圍
\(1≤N,K,Q≤10^6,1≤X_i≤N,0≤L_i<R_i<N\)
時間限制:2S
空間限制:256MB
求\(l\)到r的和我們只用把所有\(seq[i]\)求出來後求個字首 就行了,所以主要問題是怎樣快速求出seq.
觀察到\(x_i\)
#include<cstdio> const int N=1e6+5; int n,k,q,c[N],x,y; long long seq[N],s[N]; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=k;i++) scanf("%d",&x),++c[x]; for(int i=1;i<=n;i++) if(c[i]) for(int j=0;j*i<n;j++) seq[j*i]+=c[i]; s[0]=seq[0]; for(int i=1;i<n;i++) s[i]=s[i-1]+seq[i]; scanf("%d",&q); while(q--) { scanf("%d%d",&x,&y); if(x==0) printf("%lld\n",s[y]); else printf("%lld\n",s[y]-s[x-1]); } return 0; }