- 梦游仙境
★☆ 输入文件: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
/*
本蒟蒻做的第一道分块题.
一开始没想到怎么分.
大概就是对于jump值>sqrt(n)的询问暴力处理.
对于jump值<=sqrt(n)的询问做一个预处理.
sum[i][j]表示跳i次,编号(重新编号)为j的点的前缀答案贡献.
查询的时候我们保证了跳跃起点相同的点的编号是连续的
而且查询的[l,r]有贡献的两个端点必定是同一起跳起点跳过来的.
so 前缀和直接相减就可以.
复杂度O(q√n).
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#define MAXN 100001
#define MAXM 320
#define LL long long
using namespace std;
int n,m,K,a[MAXN],s[MAXM][MAXN],g[MAXM][MAXN];
LL sum[MAXM][MAXN];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void pre()
{
int pos;
for(int i=1;i<=K;i++)//枚举跳的长度.
{
pos=0;
for(int j=1;j<=i;j++)//枚举跳的起点(显然共有i种情况).
for(int k=j;k<=n;k+=i)//跳.
{
g[i][k]=++pos;
s[i][pos]=a[k];
}
for(int j=1;j<=n;j++) sum[i][j]=sum[i][j-1]+(LL)s[i][j];
}
}
LL slove1(int l,int r,int jump)
{
LL tot=0;
for(int i=l;i<=r;i+=jump) tot+=a[i];
return tot;
}
LL slove2(int l,int r,int jump)
{
int ll=l,rr=r-(r-l)%jump;
if(!jump||ll>=rr) return a[ll];
ll=g[jump][ll],rr=g[jump][rr];
return sum[jump][rr]-sum[jump][ll-1];
}
int main()
{
freopen("XTTMYXJ.in","r",stdin);
freopen("XTTMYXJ.out","w",stdout);
int x,y,z;
n=read(),m=read();K=sqrt(n);
for(int i=1;i<=n;i++) a[i]=read();
pre();
while(m--)
{
x=read(),y=read(),z=read();
if(z>K) printf("%lld\n",slove1(x,y,z));
else printf("%lld\n",slove2(x,y,z));
}
return 0;
}
Cogs 1695. 梦游仙境(分块)的更多相关文章
-
E - 娜娜梦游仙境系列——莫名其妙的插曲
E - 娜娜梦游仙境系列——莫名其妙的插曲 E - 娜娜梦游仙境系列——莫名其妙的插曲 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 1 ...
-
B - 娜娜梦游仙境系列——跳远女王
B - 娜娜梦游仙境系列——跳远女王 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...
-
G - 娜娜梦游仙境系列——梦醒
G - 娜娜梦游仙境系列——梦醒 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
-
F - 娜娜梦游仙境系列——多民族王国
F - 娜娜梦游仙境系列——多民族王国 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
-
D - 娜娜梦游仙境系列——村民的怪癖
D - 娜娜梦游仙境系列——村民的怪癖 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
-
C - 娜娜梦游仙境系列——吃不完的糖果
C - 娜娜梦游仙境系列——吃不完的糖果 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Oth ...
-
A - 娜娜梦游仙境系列——诡异的钢琴
A - 娜娜梦游仙境系列——诡异的钢琴 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
-
acdream 1684 娜娜梦游仙境系列——莫名其妙的插曲 (gcd)
题意:一开始有一个集合,集合里有n个不同的数,然后Alice(娜娜)与Bob轮流进行操作,每人都可以任意选择两个数a,b,不妨设a>b,不过要求a-b不在集合中,把a-b放入集合(集合元素个数只 ...
-
COGS.264.数列操作(分块 单点加 区间求和)
题目链接 #include<cmath> #include<cstdio> #include<cctype> #include<algorithm> u ...
随机推荐
-
Python简单练习
#coding=UTF-8 a=10; b=2; c=a+b; print (c); score=90; if score>=80: print ("很好"); elif s ...
-
C#中去除字符串空格的三种方法
static void Main() { //demo1 除去空格,提取出各个单词 string s = "a b c"; string[] word = s.Split(new ...
-
Solr学习笔记(一)
最近准备为一个产品做一个站内的搜索引擎,是一个java产品.由于原来做过Lucene.net,所以自然而然的就想到了使用Lucene.在复习Lucene的过程中发现了Solr这个和Lucene绑定在一 ...
-
在JavaScript中实现yield,实用简洁实现方式。
原题还是老赵的: http://blog.zhaojie.me/2010/06/code-for-fun-iterator-generator-yield-in-javascript.html 原以为 ...
-
ios应用接入微信开放平台
前几天试了一下服务端接入微信公众平台,昨天又看了一下APP接入开放平台 开放平台和公众平台的差别 公众平台针对的是公众账号,除了提供管理后台之外.也开放了若干接口,让微信server和开发人员自己的应 ...
-
分页插件Jpages的使用
项目原因需要前端做分页表格,之前做了一个ul的分页效果,但是感觉自己写还是造*了,今天网上看到Jpqges插件就试了下,感觉平时使用挺方便的,写一下自己的使用过程. 先上套图,下载下来就2个js和1 ...
-
52、css属性操作
前面说的主要是css的使用规则和选择器等,这篇主要讲解css的具体使用. 一.css text 1.文本颜色:color 颜色属性被用来设置文字的颜色. 颜色是通过CSS最经常的指定: 1)十六进制值 ...
-
workerman使用
1.start_timer.php(boc) <?php use \Workerman\Worker; use \Workerman\Lib\Timer; require_once '/var/ ...
-
经典笔试题:用C写一个函数测试当前机器大小端模式
“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...
-
Servlet------>;jsp自定义标签2(让标签体不显示)
自定义标签能做什么: 1.移除java代码 2.控制jsp页面某一部分是否执行 3.控制整个jsp是否执行 3.jsp内容重复输出 4.修改jsp内容输出 2.控制jsp页面某一部分是否执行 tag1 ...