★☆ 输入文件:XTTMYXJ.in
输出文件:XTTMYXJ.out
简单对比
时间限制:5 s 内存限制:512 MB
【题目描述】
在Asm.def仍然在与人工智能进行艰苦的斗争时,雪甜甜小公主仍然在亚特兰蒂斯里自娱自乐,她不小心误闯了玛丽奥的世界。
她感觉十分有趣,她闯关到了一行有n个小块上面有傻币的地面(可以看成一个数轴),地面上有许多,假如雪甜甜的起点为l,终点为r,跳跃能力为jump,从左往右跳
针对雪甜甜皇家公主给出的q组询问l,r,jump,你需要计算他获得的傻币数
例如下面这种情况
地面的金币数列:
2 1 4 7 4 1 2 5 1
w[1] w[2] w[3] w[4] w[5] w[6] w[7] w[8] w[9]
若l=2,r=7,jump=3,则总傻币数为w[2]+w[5]=5(w[8]不算,因为雪甜甜跳不到)
若l=3,r=4,jump=2,则总傻币数为w[3]=4(没法跳,只能留在原地)
【输入格式】
第一行为两个整数n,q
第二行n个数,表示w[i]
接下来q行每行三个数l,r,jump
【输出格式】
总共q行,每行一个答案ans
【样例输入】
【样例输出】
2 7 29 10 4
【提示】
对于30%的数据,n<=2000
对于100%的数据,n<=100000,q<=500000
暴力40:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
int n,m;
int a[N];
inline int read()
{
int x=0;int f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
int main()
{
freopen("XTTMYXJ.in","r",stdin);
freopen("XTTMYXJ.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=m;i++)
{
int start=read(),endd=read(),jump=read();
long long answer=0;
for(int i=start;i<=min(n,endd);i+=jump)
answer+=a[i];
printf("%lld\n",answer);
}
return 0;
}
分块+乱搞=AC:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
inline int read()
{
int x=0;int f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
const ll maxn=101000;
ll n,m,size;
ll block[maxn],c[maxn],sum[400][maxn];
ll query_1(ll l,ll r,ll jump)
{
ll ans=0;
for(ll i=l;i<=r;i+=jump) ans+=c[i];
return ans;
}
ll query_2(ll l,ll r,ll jump)
{
r=r-((r-l)%jump);
if(r<=l) return c[l];
return sum[jump][l]-sum[jump][r+jump];
}
int main()
{
freopen("XTTMYXJ.in","r",stdin);
freopen("XTTMYXJ.out","w",stdout);
n=read(),m=read(),size=sqrt(n);
for(ll i=1;i<=n;i++) block[i]=(i-1)/size+1;
for(ll i=1;i<=n;i++) c[i]=read();
for(ll i=1;i<=size;i++)
for(ll j=n;j>=1;j--)
sum[i][j]=sum[i][j+i]+c[j];
for(ll i=1;i<=m;i++)
{
ll l=read(),r=read(),jump=read();
if(jump==0) printf("%lld\n",c[l]);
else if(jump>size) printf("%lld\n",query_1(l,r,jump));//1步大于块数
else printf("%lld\n",query_2(l,r,jump));//一步小于块数
}
return 0;
}