1. 程式人生 > 其它 >論文解讀(SelfGNN)《Self-supervised Graph Neural Networks without explicit negative sampling》

論文解讀(SelfGNN)《Self-supervised Graph Neural Networks without explicit negative sampling》

開始時,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\) 行:每行兩個整數\(L_i,R_i\)

輸出格式
\(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\)

全部小於n,所以如果可以保證\(1\)~\(n\)每個數字都只是遍歷一次,就可以達到調和級數列舉。我們可以數一下每一種數出現了多少次,然後一併加上就可以了。遍歷1到n,然後把相同的數一起加。

#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;
}