CF1601E Phys Ed Online
考虑一个贪心。
我们一定采取的方案是
\(b_i = \min_{j = i - k}^i a_j\)
\(\sum a_l + b_{l + k} + \min_{i = 1}^2{b_{l + ik}} + \min_{i = 1}^3{b_{l + ik}}......\min_{i = 1}^t{b_{l + ik}}\)
那么我们看出来可以只考虑同余系的关键点即可。
但是我们发现我们不好计算答案。
一个想要的考虑是扫描线。
但是我们发现这样需要支持区间加,区间取 \(0\),区间加等差数列,单点查。
然后我发现我不会区间加等差数列,所以只能考虑正解做法。
考虑我们差分答案,记\(f_i\)为一直到结尾的答案,考虑倒序枚举\(i\),直接单调栈,其转移显然。
那么\([l,r]\)答案应为\(f_i - f_p + b_p * {(r - p + 1)} + a_l\)
\(p\)为\([l,r]\)中最小值位置。
考虑笛卡尔树上的\([l,r]\)的最小值位置即其两点\(LCA\)位置。
那么复杂度为\(O(nlog{\frac{n}{k}} + q)\)
较正解做法\(O(nlog + q)\) 效率应该差距不大。
所以这里采用正解做法即ST表。
#include<bits/stdc++.h>
#define ll long long
#define N 600005
#define int ll
int n,q,k;
std::pair<int,int> g[N][30];//ST表
int lg[N],b[N];
std::pair<int,int> get(int l,int r){
if(l > r)
return std::pair<int,int>(0,0);
int p = lg[r - l + 1];
return std::min(g[l][p],g[r - (1ll << p) + 1][p]);
}
int stk[N],top,nxt[N],f[N];
ll calc(int l,int r){
int p = get(l - k,r).second;
int tmp = g[p][0].first;
if(p == l - k)
p += k;
p = p + (r - p) % k;
return f[l] - f[p] + (r / k - p / k + 1) * b[p];
}
signed main(){
scanf("%d%d%d",&n,&q,&k);
lg[0] = -1;
for(int i = 1;i <= n;++i)
lg[i] = lg[i / 2] + 1;
for(int i = 1;i <= n;++i){
scanf("%d",&g[i][0].first);
g[i][0].second = i;
}
for(int j = 1;j <= 20;++j)
for(int i = 1;i + (1ll << j) - 1 <= n;++i)
g[i][j] = std::min(g[i][j - 1],g[i + (1ll << (j - 1))][j - 1]);
for(int i = k + 1;i <= n;++i)
b[i] = get(i - k,i).first;
for(int l = k + 1;l + k <= n && l <= 2 * k;++l){
int r = l + (n - l) / k * k;
top = 1;
for(int i = r;i >= l;i -= k){
while(top > 1 && b[i] <= b[stk[top]])
top -- ;
nxt[i] = stk[top];
f[i] = f[nxt[i]] + b[i] * (nxt[i] / k - i / k);
stk[++top] = i;
}
}
while(q -- ){
int l,r;
scanf("%d%d",&l,&r);
r = l + (r - l) / k * k;
std::cout<<(1ll * g[l][0].first + 1ll * (l + k <= r? calc(l + k,r) : 0))<<std::endl;
}
}
CF1601E Phys Ed Online的更多相关文章
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- EDdb 是ED数据
eddb 是ED数据统计汇总软件的简称,用于统计汇总企事业单位的各类信息数据. 采用Excel界面,操作简单. 对各类信息数据,均可以自定义数据格式,通过internet联网,收集各类信息数据,并通 ...
- ios CoreBluetooth 警告 is being dealloc'ed while pending connection
ios CoreBluetooth 警告 is being dealloc'ed while pending connection CoreBluetooth[WARNING] <CBPerip ...
- ed编辑器使用
evilxr@IdeaPad:/tmp$ ed aa.c 0 a enter another words hello nice www.evilxr.com . w aa.c 46 q a 表示添加内 ...
- Linux ed命令
$ ed <- 激活 ed 命令 a <- 告诉 ed 我要编辑新文件 My name is Titan. <- 输入第 ...
- ED/EP系列5《消费指令》
1. 消费交易 消费交易允许持卡人使用电子存折或电子钱包的余额进行购物或获取服务. 特点: 1) --可以在销售点终端(POS)上脱机进行 2) --使用电子存折进行的消费交易必须提交个人识别码(PI ...
- ED/EP系列4《圈存指令》
1. 圈存交易 通过圈存交易,持卡人可将其在银行相应账户上的资金划入电子存折或电子钱包中. 特点: 1)--必须在金融终端上联机进行; 2)--必须提交个人识别码(PIN) 步骤: 1) --终端: ...
- ED/EP系列1《简介》
电子存折(ED:ElectronicDeposit)一种为持卡人进行消费.取现等交易而设计的支持个人识别码(PIN)保护的金融IC卡应用.它支持圈存.圈提.消费和取现等交易. 电子钱包(EP:Elec ...
- ED/EP简介
ED:electronic Deposit,电子存折 EP:electronic Purse,电子钱包 PIN:personal identification number,个人识别码 MAC:Mes ...
随机推荐
- 开源协同OA办公平台教程:O2OA服务管理中,接口的调用权限
本文介绍O2OA服务管理中,接口的权限设定和调用方式. 适用版本:5.4及以上版本 创建接口 具有服务管理设计权限的用户(具有ServiceManager角色或Manager角色)打开" ...
- tcl概述
tcl,全名tool command language,是一种通用的工具语言. 1)每个命令之间,通过换行符或者分号隔开: 2)tcl的每个命令包含一个或者多个单词,默认第一个单词表示命令,第二个单词 ...
- Poetry(2)Poetry的基本使用方式
Poetry的基本使用 准备工作 如果你是在一个已有的项目里使用Poetry,你只需要执行 poetry init 命令来创建一个 pyproject.toml 文件: poetry init 可看到 ...
- seata整合多数据源
seata整合多数据源 一.背景 二.整合步骤 1.seata server的搭建 2.引入数据源切换组件 3.引入seata组件 4.配置多数据源 5.关闭seata自己默认的数据源代理 6.配置s ...
- 2021.8.5考试总结[NOIP模拟31]
暴力打满直接rk3? T1 Game 想了一万种贪心和两万种$hack$. 可以先用最显然的贪心求出最高得分是多少.(从小到大用最小的大于$b_i$的$a$得分) 然后用一棵权值线段树维护值域内$a$ ...
- hdu 1158 Employment Planning(DP)
题意: 有一个工程需要N个月才能完成.(n<=12) 给出雇佣一个工人的费用.每个工人每个月的工资.解雇一个工人的费用. 然后给出N个月所需的最少工人人数. 问完成这个项目最少需要花多少钱. 思 ...
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...
- 第03课 OpenGL 添加颜色
添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在下图中,三角形用的是光滑着色,四边形用的是平面着色 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边形 ...
- docker 存储驱动(storage driver)知识总结
http://www.sohu.com/a/101016494_116235 一,先看docker镜像是如何构建和存储. 下面是ubuntu:15.04的镜像分层.一共是4层,每一层都由一些只读并且描 ...
- zabbix 报警发送qq邮件
1.开启QQ邮箱的IMAP/SMTP服务,获取授权码 获取授权码:点击[开启]按钮,编辑短信发送,即可获得授权码 2.配置 /etc/mail.rc 添加下列配置: [ set from=XXX@qq ...