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