题面

空间只有$64\text{MB}$!!!

题解

(据说正解是毒瘤分块套分块)

按照权值从大到小排序,对所有能够覆盖到它的区间的左端点打个标记

按照值域建一棵主席树就可以了

区间查询最大值,用$m$减去它即可

如何卡空间???

  1. 用位域将主席树的节点信息压到一个unsigned long long
  2. 将叶节点改成一个值,节省空间。(但是还是要开40倍)
  3. 永久化的标记和值压在一起。

最后以大约$63\text{MB}$的空间卡了过去。

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x)) inline int read()
{
int data = 0, w = 1; char ch = getchar();
while(ch != '-' && (!isdigit(ch))) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
} const int maxn(2e5 + 10), INT_MAX(1e9);
#define lmax (l == mid ? int(t[rt].lson) : int(t[t[rt].lson].max))
#define rmax (mid + 1 == r ? int(t[rt].rson) : int(t[t[rt].rson].max)) struct node { unsigned long long max : 18, lson : 23, rson : 23; } t[maxn * 40];
int cur, root[maxn], n, m, Q;
std::pair<int, int> a[maxn]; int Insert(int p, int l, int r, int ql, int qr)
{
if(l == r) return p + 1;
int rt = ++cur; t[rt] = t[p];
if(ql <= l && r <= qr) return ++t[rt].max, rt;
int mid = (l + r) >> 1, tag = t[rt].max - std::max(lmax, rmax);
if(ql <= mid) t[rt].lson = Insert(t[p].lson, l, mid, ql, qr);
if(qr > mid) t[rt].rson = Insert(t[p].rson, mid + 1, r, ql, qr);
t[rt].max = std::max(lmax, rmax) + tag; return rt;
} int query(int rt, int l, int r, int ql, int qr)
{
if(l == r) return rt;
if(ql <= l && r <= qr) return t[rt].max;
int mid = (l + r) >> 1, ans = 0, tag = t[rt].max - std::max(lmax, rmax);
if(ql <= mid) ans = std::max(ans, query(t[rt].lson, l, mid, ql, qr));
if(qr > mid) ans = std::max(ans, query(t[rt].rson, mid + 1, r, ql, qr));
return ans + tag;
} int main()
{
#ifndef ONLINE_JUDGE
file(cpp);
#endif
n = read(), m = read();
for(RG int i = 1; i <= n; i++) a[i] = std::make_pair(-read(), i);
std::sort(a + 1, a + n + 1);
for(RG int i = 1; i <= n; i++)
{
int ql = std::max(1, a[i].second - m + 1);
int qr = std::min(a[i].second, n - m + 1);
root[i] = Insert(root[i - 1], 1, n - m + 1, ql, qr);
}
Q = read(); int ans = 0;
while(Q--)
{
int l = read(), r = read(), x = read() ^ ans;
int id = std::upper_bound(a + 1, a + n + 1,
std::make_pair(-x, INT_MAX)) - a - 1;
printf("%d\n", ans = m - query(root[id], 1, n - m + 1, l, r));
}
return 0;
}

CF543E Listening to Music的更多相关文章

  1. 【CF543E】Listening to Music

    [CF543E]Listening to Music 题面 洛谷 题目大意 给你一个长度为\(n\)序列\(a_i\),和一个常数\(m\),定义一个函数\(f(l,x)\)为\([l,l+m-1]\ ...

  2. [WPF系列]基础 Listening to Dependency Property change notifications of a given Element

    I want to share this great post from Anoop that shows a easy way to add a notification system to dep ...

  3. [BEC][hujiang] Lesson03 Unit1:Working life ---Grammar & Listening & Vocabulary

    3 Working life p8 Grammar Gerund and infinitive(动名词和不定式) 一般而言:        1 动词后面接动名词还是不定式没有特定规则,主要取决于语言习 ...

  4. 错误信息:A TCP error (10013: 以一种访问权限不允许的方式做了一个访问套接字的尝试。) occurred while listening on IP Endpoint=192.168.1.18:8002.

    百度之后,知道这个原因是端口已经被其他进程打开了 使用cmd命令,查看8002端口被哪一个程序占用了 C:\Windows\System32>netstat -ano | find " ...

  5. 启动redis出现Creating Server TCP listening socket *:6379: bind: No such file or directory

    E:\redis>redis-server.exe redis.windows.conf [8564] 10 Oct 20:00:36.745 # Creating Server TCP lis ...

  6. ERROR: unable to bind listening socket for address ’127

    ERROR: unable to bind listening socket for address '127.0.0.1:9000′ 解决办法: killall php-fpm 然后重启即可. 我的 ...

  7. creating server tcp listening socket 127.0.0.1:6379: bind No error

    参考链接:https://blog.csdn.net/n_fly/article/details/52692480 1.window10环境下面安装的redis,之前安装好弄了一下,过了好几天,再次使 ...

  8. 报错处理——# Creating Server TCP listening socket *:6379: bind: Address already in use

    在启动redis时报错 # Creating Server TCP listening socket *:6379: bind: Address already in use 错误原因 6379地址已 ...

  9. redis启动出现错误creating server tcp listening socket 127.0.0.1:6379: bind No error

    creating server tcp listening socket 127.0.0.1:6379: bind No error 的解决方案如下按顺序输入如下命令就可以连接成功 1. redis- ...

随机推荐

  1. Android如何自学----转自lavor从segmentfault

    如何自学Android 1. Java知识储备 本知识点不做重点讲解: 对于有基础的同学推荐看<Java编程思想>,巩固基础,查漏补全,了解并熟悉更多细节知识点. 对于没有基础的同学推荐看 ...

  2. HTTP协议实体的基本讲解

    http://blog.csdn.net/diyagoanyhacker/article/details/6685305 HTTP协议运作方式 HTTP协议是基于请求/响应范式的.一个客户机与服务器建 ...

  3. # 20155214 2016-2017-2 《Java程序设计》第9周学习总结

    20155214 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC架构 JDBC全名Java DataBase Connectivity,是用于执行S ...

  4. topk两种解法

    1.这个通过partition实现topk,时间复杂度是o(logn*logn),也就是0(n),但需要修改原数组的顺序 下面这个代码本身有一些错误,并且throw excption会在牛客上报错 c ...

  5. VC++获取一个GB级大文件的字节大小

    常规的获得小文件(2.1GB以下)的字节大小可以使用ftell,函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数.使用fseek函数后再调用函数ftell()就能非常容易地确定文 ...

  6. PHP文档

    http://php.net/manual/zh/function.socket-close.php

  7. Spring中使用属性文件properties的两种方式

    实际项目中,通常将可配置的参数放到属性文件中,例如数据库连接信息.redis连接信息等,便于统一管理.然后通过IoC框架spring将其加载到上下文中,使得程序可以直接使用. 创建mysql.prop ...

  8. HDU 2544最短路 (迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Me ...

  9. 解密蓝牙mesh系列

    解密蓝牙mesh系列 https://mp.weixin.qq.com/s/KdVhkgcmHIboA0xPFqFCgQ 1.NRF52832 & NRF52840 BLE mesh 协议栈 ...

  10. Linux内存管理-高端内存(二)

    在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Lin ...