【CodeForces】80D Time to Raid Cowavans 分塊

#include <bits/stdc++.h>
using namespace std;

typedef long long lint;
const int N=300010;
const int U=64;

int n,unit,p[N],m;
struct Q
{
	int fir,len;
	int id;
}q[N];
lint res;
lint ans[N],LenAns[N];

inline int read(void)
{
	int s=0; char c=getchar();
	for (;!isdigit(c);c=getchar());
	for (;isdigit(c);c=getchar()) s=s*10+c-'0';
	return s;
}

inline int cmp(Q qa,Q qb)
{
	return qa.len<qb.len;
}

int main(void)
{
	n=read();
	for (int i=1;i<=n;i++) p[i]=read();
	unit=(int)sqrt(n);
	
	m=read();
	for (int i=1;i<=m;i++) q[i].fir=read(),q[i].len=read(),q[i].id=i;
	sort(q+1,q+m+1,cmp);
	
	for (int i=1;i<=m;i++)
		if (q[i].len>unit)
		{
			res=0;
			for (int j=q[i].fir;j<=n;j+=q[i].len) res+=p[j];
			ans[q[i].id]=res;			
		}
		else
		{
			if (q[i].len!=q[i-1].len)
			{
				for (int j=n;j>=n-q[i].len+1;j--) LenAns[j]=p[j];
				for (int j=n-q[i].len;j>=1;j--) LenAns[j]=LenAns[j+q[i].len]+p[j];
			}
			ans[q[i].id]=LenAns[q[i].fir];
		}
	for (int i=1;i<=m;i++) printf("%I64d\n",ans[i]);
	
	return 0;
}

發佈了137 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章