思路

根据题意,如果每次询问选中的为第 \(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」来自地上的支援 题解的更多相关文章

  1. 「杂录」CSP-S 2019 爆炸记&题解

    考试状况 \(Day1\) \(8:30\) 解压,先打个含头文件和\(freopen\)的模板程序,准备做题. \(8:35\) 开题,心想着按顺序做吧,毕竟难度一般是按顺序排的. 第一题,一眼看过 ...

  2. LuoguP7505 「Wdsr-2.5」小小的埴轮兵团 题解

    Content 给出一个范围为 \([-k,k]\) 的数轴,数轴上有 \(n\) 个点,第 \(i\) 个点的位置为 \(a_i\).有 \(m\) 次操作,有且仅有以下三种: 1 x:所有点往右移 ...

  3. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

  4. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  5. Linux 小知识翻译 - 「动态DNS」(DDNS)

    这次聊聊「动态DNS」. DNS上周已经介绍过了,就是提供主机名和IP地址对应关系的结构.「动态DNS」是对主机名和IP地址的对应关系提供动态管理的结构. 以前的DNS没有考虑IP地址变化的情况.但是 ...

  6. 「TJOI / HEOI2016」字符串

    「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...

  7. NLP领域的ImageNet时代到来:词嵌入「已死」,语言模型当立

    http://3g.163.com/all/article/DM995J240511AQHO.html 选自the Gradient 作者:Sebastian Ruder 机器之心编译 计算机视觉领域 ...

  8. 「下载神器」aria2 懒人安装教程 [Windows]

    是一款开源.轻量级的多协议命令行下载工具,支持 HTTP/HTTPS.FTP.SFTP.BitTorrent 和 Metalink 协议,拥有众多第三方支持插件,被誉为「下一代下载工具」和「下载神器」 ...

  9. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

随机推荐

  1. EasyExcel导出添加批注

    直接看代码.根据个人需要做改动 注:POI也可以做批注,文章链接https://www.cnblogs.com/qq1445496485/p/15622664.html /** * 导出(批注) * ...

  2. 论文阅读 GloDyNE Global Topology Preserving Dynamic Network Embedding

    11 GloDyNE Global Topology Preserving Dynamic Network Embedding link:http://arxiv.org/abs/2008.01935 ...

  3. 深入理解Apache Hudi异步索引机制

    在我们之前的文章中,我们讨论了多模式索引的设计,这是一种用于Lakehouse架构的无服务器和高性能索引子系统,以提高查询和写入性能.在这篇博客中,我们讨论了构建如此强大的索引所需的机制,异步索引机制 ...

  4. jdk8 hashmap 链表resize 源码分析

    重点看这部分代码 for (int j = 0; j < oldCap; ++j) { Node<K,V> e; if ((e = oldTab[j]) != null) { old ...

  5. Seata-初体验以及避坑

    Seata是什么 这里引用官方解释 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用 ...

  6. 修改 hosts

    不会牛逼操作 -1. 位置.格式 所有系统都差不多,都是 啥啥/etc/hosts 这样的 . 具体去查即可 . 格式: ip + 域名 域名不能含有通配符 hosts 可以绕过 dns 解析,直接访 ...

  7. goalng-sync/atomic原子操作

    目录 1.go已经提供了锁,为什么还需要atomic原子操作? 2.atomic原子操作为什么比mutex快? 3.CAS 4.互斥锁与原子操作区别 5.原子操作方法 5.1 atomic.AddIn ...

  8. Java SE 13 新增特性

    Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  9. HttpServletResponse 类

    HttpServletResponse 类的作用 HttpServletResponse 类和 HttpServletRequest 类一样.每次请求进来,Tomcat 服务器都会创建一个 Respo ...

  10. python爬虫之BeautifulSoup4使用

    钢铁知识库,一个学习python爬虫.数据分析的知识库.人生苦短,快用python. 上一章我们讲解针对结构化的html.xml数据,使用Xpath实现网页内容爬取.本章我们再来聊另一个高效的神器:B ...