cogs 1695. 梦游仙境

★☆   输入文件: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

【样例输入】

10 5
2 1 4 7 4 8 3 6 4 7
1 10 233333
4 7 666666
2 10 2
1 9 4
3 5 3

【样例输出】

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
",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
",c[l]);
		else if(jump>size) printf("%lld
",query_1(l,r,jump));//1步大于块数 
		else printf("%lld
",query_2(l,r,jump));//一步小于块数 
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/lyqlyq/p/7214252.html