CF103D Time to Raid Cowavans 根号分治+离线
题意:
给定序列 $a,m$ 次询问,每次询问给出 $t,k$. 求 $a_{t}+a_{t+k}+a_{t+2k}+.....a_{t+pk}$ 其中 $t+(p+1)k>n$
题解:
这种跳步数问题可以用根号分治来解决:
对于 $k$ 比较大的询问直接暴力跳,而对于 $k$ 较小的部分就通过预处理的手段来做.
我们现在只考虑 $k<\sqrt n$ 的情况,即需要我们预处理的部分.
如果直接维护 $f[i][j]$ 表示从 $i$ 开始以 $j$ 的步伐跳到 $n$ 所能得到的点权和的话空间根本开不下.
但是询问不是强制在线的,我们可以采用离线+滚动数组的方式来处理.
具体地,我们将这个序列分块,对于块内元素维护 $(i,pos,t)$ 即在第 $i$ 个块中第 $pos$ 个位置开始以 $t$ 的步伐条的元素和.
倒着枚举询问,我们就可以将第一维 $i$ 压掉,然后倒着处理并滚动优化一下即可.
#include <bits/stdc++.h>
#define M 550
#define N 300005
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,m,B;
ll f[M][M],A[N],output[N];
struct query
{
int id,k;
query(int id=0,int k=0):id(id),k(k){}
};
struct Data
{
int id,pos;
vector<query>v;
}p[N];
int main()
{
int i,j;
// setIO("input");
scanf("%d",&n);
B=sqrt(n);
for(i=1;i<=n;++i)
{
scanf("%lld",&A[i]);
p[i].id=(i-1)/B+1;
if(p[i].id!=p[i-1].id) p[i].pos=1;
else p[i].pos=p[i-1].pos+1;
}
scanf("%d",&m);
for(i=1;i<=m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
if(b<B) p[a].v.push_back(query(i, b));
else
{
ll re=0;
for(j=a;j<=n;j+=b) re+=A[j];
output[i]=re;
}
}
for(i=n;i>=1;--i)
{
int cur=p[i].pos;
for(j=1;j<B;++j)
{
f[p[i].pos][j]=A[i];
if(i+j<=n)
{
f[p[i].pos][j]+=f[p[i+j].pos][j];
}
}
for(j=0;j<p[i].v.size();++j)
{
output[p[i].v[j].id]=f[p[i].pos][p[i].v[j].k];
}
}
for(i=1;i<=m;++i) printf("%lld\n",output[i]);
return 0;
}
CF103D Time to Raid Cowavans 根号分治+离线的更多相关文章
- 题解【CF103D Time to Raid Cowavans】
Description 给一个序列 \(a\) ,\(m\) 次询问,每次询问给出 \(t, k\) .求 \(a_t + a_{t+k}+a_{t+2k}+\cdots+a_{t+pk}\) 其中 ...
- Codeforces Beta Round #80 (Div. 1 Only) D. Time to Raid Cowavans 离线+分块
题目链接: http://codeforces.com/contest/103/problem/D D. Time to Raid Cowavans time limit per test:4 sec ...
- Codeforces103D - Time to Raid Cowavans
Portal Description 给出长度为\(n(n\leq3\times10^5)\)的序列\(\{a_n\}\),进行\(q(q\leq3\times10^5)\)次询问:给出\(x,y\) ...
- BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)
BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复 ...
- CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表
传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...
- CF1039E Summer Oenothera Exhibition 根号分治,LCT,ST表
CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\), ...
- CodeForces 103 D Time to Raid Cowavans
Time to Raid Cowavans 题意:一共有n头牛, 每头牛有一个重量,m次询问, 每次询问有a,b 求出 a,a+b,a+2b的牛的重量和. 题解:对于m次询问,b>sqrt(n) ...
- Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]
洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地 ...
- BZOJ3351: [ioi2009]Regions(根号分治)
题意 题目链接 Sol 很神仙的题 我们考虑询问(a, b)(a是b的祖先),直接对b根号分治 如果b的出现次数\(< \sqrt{n}\),我们可以直接对每个b记录下与它有关的询问,这样每个询 ...
随机推荐
- @Adaptive注解
关于@Adaptive注解 引用dubbo官方文档的一段话: Adaptive 可注解在类或方法上.当 Adaptive 注解在类上时,Dubbo 不会为该类生成代理类.注解在方法(接口方法)上时 ...
- 解决django的后台管理界面添加中文内容乱码问题
在使用django migrate功能时,默认数据库的字符集不是utf8. 是latin 1,然后在后台管理model时,不允许有中文字符插入 解决方案: 在使用migrate建库之前先把数据库建立起 ...
- ActivityMQ消息中间件【待完成】
1,MQ的引入 使用场景,将耗时的通知业务交给消息中间件[业务逻辑进行解耦] 使用消息中间件的逻辑交互 2,MQ的应用场景 首先消息中间件是一个异步处理 有两个关键点:①耗时:②业务的耦合度 案例1: ...
- 巧用Ajax的beforeSend 提高用户体验--防止重复数据
巧用Ajax的beforeSend 提高用户体验 jQuery是经常使用的一个开源js框架,其中的$.ajax请求中有一个beforeSend方法,用于在向服务器发送请求前执行一些动作.具体可参考jQ ...
- sql 触发器里,发生错误,回滚提示错误语句
SET @msg='错误消息'; RAISERROR(@msg, 16, 1); ROLLBACK TRANSACTION; ...
- gin框架初识(先跑一个简单demo) ①
Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 先跑一个demo(先安装gin框架,具体见官方地址): 1.vs ...
- drunk_admin_hacking_challenge靶机之旅?
注: 只是记录本人玩的时候发现的新奇点 如果你也想玩且看了这篇文章还是不会,请联系gg 靶机下载地址 https://www.vulnhub.com/entry/drunk-admin-web-h ...
- ARC模式下获取retainCount的方法
_objc_rootRetainCount(obj)可以获取obj的retainCount,不过不清楚是不是私有api,因此建议调试时使用.
- stm32 定时器 通用定时器
STM32F10xxx 2个基本定时器(TIM6.TIM7) 4个通用定时器(TIM2. TIM3. TIM4和TIM5) 2个高级定时器(TIM1.TIM8) 每个定时器都是完全独立的,没有互相共享 ...
- bootstrap下拉框保持打开
$(".dropdown-menu li").on("click", function (e) { e.stopPropagation(); }); 停止传播事 ...