思路

根据题意,如果每次询问选中的为第 \(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. Python实现中文字幕雨+源代码

    写在前面的一些P话: 最近浏览了很多关于用Python和Pygame实现代码雨的案例,发现很多都是没有深入讲解代码的整个实现过程,从0到1教会你制作中文文字雨. 然后在介绍的过程中,我也将深入介绍Py ...

  2. 测试右移:线上质量监控 ELK 实战

    目录 [测试右移]介绍 ELK Stack 介绍 ELK 监控体系搭建 ES & Kibana 搭建 Nginx 日志自动采集 Nginx Agent 安装 Nginx 服务器 数据分析 Lo ...

  3. day11 - 多线程

    1内容 进程.线程介绍 Java中 线程的实现方式 Thread 类 Runnable 接口 Callable 接口 线程相关的方法 线程安全问题 - 同步技术 线程等待唤醒机制 进程(Process ...

  4. IO流思维导图

    IO思维导图总结 总览: 1.文件 <目标:File类的创建和删除的方法 > public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时, 创建一个 ...

  5. xxljob安装

    目录 一.简介 二.docker安装 三.k8s方式安装 四.参考 一.简介 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家 ...

  6. SpringBoot中Tomcat和SpringMVC整合源码分析

    概述 ​ SpringBoot中集成官方的第三方组件是通过在POM文件中添加组件的starter的Maven依赖来完成的.添加相关的Maven依赖之后,会引入具体的jar包,在SpringBoot启动 ...

  7. 转换流的原理和OutputStreamWriter介绍&代码实现

    转换流的原理 OutputStreamWriter介绍&代码实现 package com.yang.Test.ReverseStream; import java.io.FileNotFoun ...

  8. 利用DockerHub在Centos7.7环境下部署Nginx反向代理Gunicorn+Flask独立架构

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_165 上一篇文章:Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像,是在 ...

  9. Odoo Session In Redis

    # odoo session in redis # 一.下载安装Session in Redis免费模块 # 下载地址:https://apps.odoo.com/apps/modules/12.0/ ...

  10. GS2107-WTBD 用什么软件为什么新建不了GS系列

    1.GS系列GOT必须使用官网上的新软件,资料下载-软件下载-GOT 1000 & GOT 2000 & GOT Simple 画面设计软件,下载安装后,机种选择GS系列即可. 2.在 ...