【CF543E】Listening to Music
【CF543E】Listening to Music
题面
题目大意
给你一个长度为\(n\)序列\(a_i\),和一个常数\(m\),定义一个函数\(f(l,x)\)为\([l,l+m-1]\)中小于\(x\)的数的个数,有\(q\)个询问,每次给定\(l,r,x\)查询\(min_{i=l}^rf(i,x)\)。
题解
先转化一个条件:
小于\(x\)的最小\(=\)大于等于\(x\)的最多
则我们就是要查询大于等于\(x\)的最多
然后再用\(m\)减去即可。
那么怎么做呢?
我们按照权值从大到小将所有位置排序
然后对于每个数,我们设它原位置在\(i\),
将左端点在原位置\(x\)时能覆盖到\(i\)的位置打上标记
依次按照值域建树,每次二分查找到最后一个大于等于查询数的
询问区间最大值即可。
\(tips:\)这题卡空间,要用到一些空间优化。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
typedef unsigned long long ull;
#define lson t[o].ls
#define rson t[o].rs
#define lmax (l == mid ? int(lson) : int(t[lson].mx))
#define rmax (mid + 1 == r ? int(rson) : int(t[rson].mx))
const int INF = 1e9;
const int MAX_N = 2e5 + 5;
struct Node {
ull mx : 18, ls : 23, rs : 23;
} t[MAX_N * 40];
int tot = 0, rt[MAX_N];
int modify(int p, int l, int r, int ql, int qr) {
if (l == r) { return p + 1; }
int o = ++tot; t[o] = t[p];
if (ql <= l && r <= qr) return ++t[o].mx, o;
int mid = (l + r) >> 1, tag = t[o].mx - max(lmax, rmax);
if (ql <= mid) lson = modify(t[p].ls, l, mid, ql, qr);
if (qr > mid) rson = modify(t[p].rs, mid + 1, r, ql, qr);
t[o].mx = max(lmax, rmax);
t[o].mx += tag;
return o;
}
int query(int o, int l, int r, int ql, int qr) {
if (l == r) return o;
if (ql <= l && r <= qr) return t[o].mx;
int mid = (l + r) >> 1, res = 0, tag = t[o].mx - max(lmax, rmax);
if (ql <= mid) res = max(res, query(lson, l, mid, ql, qr));
if (qr > mid) res = max(res, query(rson, mid + 1, r, ql, qr));
return res + tag;
}
int N, M;
pair<int, int> a[MAX_N];
int main () {
N = gi(), M = gi();
for (int i = 1; i <= N; i++) a[i].first = 0 - gi(), a[i].second = i;
sort(&a[1], &a[N + 1]);
for (int i = 1; i <= N; i++) {
int ql = max(1, a[i].second - M + 1);
int qr = min(a[i].second, N - M + 1);
rt[i] = modify(rt[i - 1], 1, N - M + 1, ql, qr);
}
int Q = gi(), ans = 0;
while (Q--) {
int l = gi(), r = gi(), x = gi();
x ^= ans;
int id = upper_bound(&a[1], &a[N + 1], make_pair(-x, INF)) - a - 1;
printf("%d\n", ans = M - query(rt[id], 1, N - M + 1, l, r));
}
return 0;
}
【CF543E】Listening to Music的更多相关文章
- 【复习】Listening and Reading Comprehension
短对话 M: Why do you declare the news that you're pregnant on your blog directly? W: I'm so excited tha ...
- 【转载】Python编写简易木马程序
转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool 使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...
- 【Android】Android 移动应用数据到SD
[Android]Android 移动应用数据到SD 在应用的menifest文件中指定就可以了,在 <manifest> 元素中包含android:installLocation 属性, ...
- JMS【二】--ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文JMS[一]--JMS基本概念,我们介绍了消息通信的规范JMS,我 ...
- 【转】adb.exe,start-server' failed -- run manually if necessary
[转]Android adb.exe程序启动不起来,如何处理 解决问题: 百度google大家多说的是任务管理器 kill掉adb 或者重启adb server,但我任务管理器就没有adb ,猜测是某 ...
- 第一阶段——CentOS6_Python3.6.1笔记(尚学堂-Python基础快速入门)+ 【补充】麦子-Python程序入门与进阶
虚拟机环境: 设置网络 .修改网络地址 .设置网卡为nat模式 .确保物理机启动dhcp.net服务 .编辑文件:vim /etc/sysconfig/network-scripts/ifcfg-et ...
- 【翻译】Flume 1.8.0 User Guide(用户指南) Processors
翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...
- 【转】inotify+rsync实现实时同步
[转]inotify+rsync实现实时同步 1.1 什么是实时同步:如何实现实时同步 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 发现目录中数据产生变化,就利用rsync服 ...
- Nodejs【单机】多进程模式集群
Nodejs[单机]多进程模式集群实例: 1.安装:npm install -s cluster 2.服务代码: var debug = require('debug'); var express = ...
随机推荐
- MacBook搭建go语言开发环境
mac下要安装 go 最简单的方式是通过 homebrew 直接执行: brew update && brew upgrade brew install go 安装完成后需要指定 GO ...
- C/C++——存储
关于各内存空间: 栈(stack):变量,数组.栈的大小是2M(也有的是1M),反正不大,一般递归写错了,没有出口,都会报错stack overflow. 全局区(静态区):全局变量.数组,静态变量. ...
- 五子棋项目总结 JavaScript+jQuery(插件写法)+bootstrap(模态框)
Html部分(界面): 1.五子棋棋盘由canvas完成: 2.两个按钮,样式由bootstrap完成: 3.菜单按钮对应的模态框,可以选择游戏模式:玩家自由对战,和电脑对战,还可以指定谁先执子和哪个 ...
- DataFrame概念与创建
一 概念 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Dat ...
- mysql将日期字符串转换
举个例子: 给定字符串为07/31/2018,想要把格式转换成20180731 需要用到以下两个函数: date_format(date,’%Y-%m-%d’) ————–>oracle中的to ...
- 身份认证系统(二)多WEB应用的单点登录
随着互联网的发展,web应用的复杂度也一直在提升,慢慢的单一的web应用已经不能满足复杂的业务需求.例如百度的搜索.新闻.百科.贴吧,其实本质上都是不同的网站.当用户使用这些平台的时候,我们当然不希望 ...
- oracle的建表语句
oracle数据库的建表语句,具体语法如下: CREATE TABLE tablename (column_name datatype [null,not null], column_name dat ...
- Oracle 存储结构一
了解块中表行数据的存储 Oracle数据存储模型 逻辑结构在左,物理结构在右 有一个关系使用虚线绘制,表示段与数据文件的多对多关系.之所以使用虚线表示关系,是因为这种多对多关系不应存在. 表空间实体消 ...
- ODI使用流程
---恢复内容开始--- ODI流程 Topology 1.建立 源 物理结构体系 2.建立 目的 物理结构体系 步骤同上 3.建立 源 逻辑架构 4.建立 目的 逻辑架构 步骤同上 Designer ...
- css布局-内容自适应屏幕
css页面布局,实现内容部分自适应屏幕,当内容高度小于浏览器窗口高度时,页脚在浏览器窗口底部:当内容高度高于浏览器窗口高度时,页脚自动被撑到页面底部. <style type="tex ...