P8539 「Wdoi-2」来自地上的支援 题解
思路
根据题意,如果每次询问选中的为第 \(x\) 个数,那么前 \(x-1\) 次操作一定不会选中第 \(x\) 个数。(感觉在说废话。)
同样,因为第 \(x\) 个数必须被选中 \(k\) 次,根据题意,不难发现这 \(k\) 次选中一定是从第 \(x\) 次操作到 \(x+k-1\) 次操作被选中。因为如果某个数在某次操作时没有被选中,那么他在后面的操作中肯定不会再次被选中。
根据上面的思路,我们要修改的最小值 \(s\) 必须大于等于前 \(x-1\) 个数进行 \(x-1\) 次操作后的最大值,我们可以用一个前缀数组来维护,数组的每个值 \(pre_i\) 表示前 \(i-1\) 个数进行 \(i-1\) 次操作后的最大值,然后再向后枚举 \(k-1\) 个数,每次都和进行过若干次操作后的最大值比较,如果枚举到的值比最大值大,就讲当前的最大值修改为枚举到的值加一(操作的第二个性质),这样就可以得到答案。
这时你就可以得到 \(65\) 分的好成绩。
优化
很显然,对于上面向后枚举 \(k-1\) 个数的操作是可以进行优化的。
因为要区间查询最大值,所以不妨考虑一下线段树,但现在问题出现在如果维护最大值上。
我们可以考虑在维护线段树时同时记录下最大值和最大值所在的坐标。然后在两个数相比较的时候,比较 \(a_i+(j-i)\times v\) 和 \(a_j\) 的大小(\(i\le j\))。根据这样比较的结果选出最大值来,这样我们只需要把 \(s\) 修改为 \(\max\left\{ pre_x,a_p-(p-x)\times v+1 \right\}\) (\(p\) 表示最大值所在的下标)即可。
代码
#include <bits/stdc++.h>
#define int long long
#define ls x<<1
#define rs x<<1|1
#define N 2000010
using namespace std;
struct node {
int val, st;
};
int n, m, v, a[N], pre[N], ans1, ans2;
node maxn[N << 2];
node max(node x, node y) {
if (x.st > y.st) {
if ((x.st - y.st)*v + y.val < x.val) {
return x;
} else {
return y;
}
} else {
if ((y.st - x.st)*v + x.val < y.val) {
return y;
} else {
return x;
}
}
}
void bulid(int x, int l, int r) {
if (l == r) {
maxn[x] = node{a[l], l};
return;
}
int mid = l + r >> 1;
bulid(ls, l, mid);
bulid(rs, mid + 1, r);
maxn[x] = max(maxn[ls], maxn[rs]);
}
node query(int x, int l, int r, int L, int R) {
if (l >= L && r <= R) {
return maxn[x];
}
int mid = l + r >> 1;
if (R <= mid) {
return query(ls, l, mid, L, R);
} else if (L > mid) {
return query(rs, mid + 1, r, L, R);
} else {
return max(query(ls, l, mid, L, R), query(rs, mid + 1, r, L, R));
}
}
signed main() {
scanf("%lld%lld%lld", &n, &m, &v);
int maxn = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
pre[i] = maxn;
maxn = max(maxn, a[i]) + v;
}
bulid(1, 1, n);
while (m--) {
int x, k;
scanf("%lld%lld", &x, &k);
if (k > n - x + 1) {
continue;
}
int s = pre[x];
if(k==1){
ans1 ^= s;
ans2 += s;
continue;
}
node tmp = query(1, 1, n, x + 1, x + k - 1);
if (s <= tmp.val - (tmp.st - x)*v) {
s = tmp.val - (tmp.st - x) * v + 1;
}
ans1 ^= s;
ans2 += s;
}
printf("%lld %lld", ans1, ans2);
return 0;
}
P8539 「Wdoi-2」来自地上的支援 题解的更多相关文章
- 「杂录」CSP-S 2019 爆炸记&题解
考试状况 \(Day1\) \(8:30\) 解压,先打个含头文件和\(freopen\)的模板程序,准备做题. \(8:35\) 开题,心想着按顺序做吧,毕竟难度一般是按顺序排的. 第一题,一眼看过 ...
- LuoguP7505 「Wdsr-2.5」小小的埴轮兵团 题解
Content 给出一个范围为 \([-k,k]\) 的数轴,数轴上有 \(n\) 个点,第 \(i\) 个点的位置为 \(a_i\).有 \(m\) 次操作,有且仅有以下三种: 1 x:所有点往右移 ...
- fir.im Weekly - 如何打造 Github 「爆款」开源项目
最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- Linux 小知识翻译 - 「动态DNS」(DDNS)
这次聊聊「动态DNS」. DNS上周已经介绍过了,就是提供主机名和IP地址对应关系的结构.「动态DNS」是对主机名和IP地址的对应关系提供动态管理的结构. 以前的DNS没有考虑IP地址变化的情况.但是 ...
- 「TJOI / HEOI2016」字符串
「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...
- NLP领域的ImageNet时代到来:词嵌入「已死」,语言模型当立
http://3g.163.com/all/article/DM995J240511AQHO.html 选自the Gradient 作者:Sebastian Ruder 机器之心编译 计算机视觉领域 ...
- 「下载神器」aria2 懒人安装教程 [Windows]
是一款开源.轻量级的多协议命令行下载工具,支持 HTTP/HTTPS.FTP.SFTP.BitTorrent 和 Metalink 协议,拥有众多第三方支持插件,被誉为「下一代下载工具」和「下载神器」 ...
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
随机推荐
- 深入解析kubernetes controller-runtime
Overview controller-runtime 是 Kubernetes 社区提供可供快速搭建一套 实现了controller 功能的工具,无需自行实现Controller的功能了:在 Kub ...
- 毕业论文着急了?Python疫情数据分析,并做数据可视化展示
采集流程 一..明确需求 采集/确诊人数/新增人数 二.代码流程 四大步骤 发送请求 获取数据 网页源代码 解析数据 筛选一些我想用的数据 保存数据 保存成表格 做数据可视化分析 开始代码 1. 发送 ...
- Java模拟西宝高速公路
@ 目录 写在前面 一.仿真模拟的具体要求 二.类的设计 2.1 抽象父类PubVehicles 2.2 Expressway类 2.3 Passenger类 2.4 Timer类 2.5 Displ ...
- C#中List实体类转换为object 并把参数返回到前端
用ConvertAll方法转换: List<Object> m= list.ConvertAll(s=> (object)s); 返回的结果:
- plain framework的实际应用和扩展
首先在这里庆祝香港回归祖国的怀抱25周年,想起那年还是一个小学生戴着红领巾和胸章激动不已,实现祖国的统一是每个中华儿女从小的梦想!趁着这欢庆的日子,突然想要写些什么,其实最近也在做一些事,由于工作繁忙 ...
- RASP | 远程Java应用的RASP调试教程
远程Java应用的RASP调试教程 介绍 Java RASP是基于Java Agent技术实现的,而Java Agent代码无法独立启动,必须依赖于一个Java运行时程序才能运行. 如何调试一个Jav ...
- C#请求HTTPS地址的故障分析和TLS知识点总结
背景介绍 近期收到同事反馈,在C#程序中通过HTTPClient请求一个HTTPS的地址时,在本地开发环境和测试环境均能正常执行,而部署到生产环境后发生异常且稳定复现,异常提示为:[请求被中止: 未能 ...
- spingboot打jar包
pom.xml文件中packaging为jar <packaging>jar</packaging> 安装插件 <plugin> <groupId>or ...
- Linux挂载webdav
Docker挂载webdav(推荐): docker run -itd \ --name mydav \ --device /dev/fuse \ --cap-add SYS_ADMIN \ --se ...
- 是时候优雅的和NullPointException说再见了
是时候优雅的和NullPointException说再见了 ️️️️️️️️️️️️️️️️ 最近在参加原创投稿比赛,本篇文章如果对你有帮助的话,欢迎帮忙点击助力下吧 NullPointExcepti ...