\(\text{Solution}\)

一个点可与另一个颜色相同点同时涂色当且仅当两点间颜色都大于等于这两点

那么我们可以预处理一个点向左向右最远能到的位置,记为 \(l_i,r_i)\)

当 \(l_i = l_j \text{ and }r_i = r_j\) 时,\((i,j)\) 就可以同时涂色

我们认为他们是相同

预处理 \(l_i,r_i\) 正反两次单调栈即可

那么一个区间的答案就是 \(l_i,r_i\) 不相同的个数

将 \(l_i,r_i\) 排序后重新编号,主席树维护即可

这就相当于区间数颜色

注:空间开到 \(2 \log n\) 倍

纪念考场暴切此题但空间开小白丢 \(5pts\)

#include <cstdio>
#include <algorithm>
#include <cstring>
#define re register
using namespace std; const int N = 2e5 + 5;
int n, q, stk[N], top;
struct node{int v, l, r, id;}a[N]; inline void read(int &x)
{
x = 0; char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
} inline bool cmp1(node a, node b){return (a.l < b.l ? 1 : (a.l == b.l ? a.r < b.r : 0));}
inline bool cmp2(node a, node b){return a.id < b.id;} int size, lst[N], rt[N];
struct ChairManTree{int ls, rs, s;}seg[N * 40];
inline void update(int &p, int pre, int l, int r, int x, int v)
{
p = ++size;
seg[p] = seg[pre], seg[p].s = seg[pre].s + v;
if (l == r) return;
int mid = (l + r) >> 1;
if (x <= mid) update(seg[p].ls, seg[pre].ls, l, mid, x, v);
else update(seg[p].rs, seg[pre].rs, mid + 1, r, x, v);
}
inline int query(int p, int l, int r, int x)
{
if (l == r) return seg[p].s;
int mid = (l + r) >> 1;
if (x <= mid) return query(seg[p].ls, l, mid, x) + seg[seg[p].rs].s;
return query(seg[p].rs, mid + 1, r, x);
} int main()
{
read(n), read(q);
for(re int i = 1; i <= n; i++) read(a[i].v), a[i].l = a[i].r = a[i].id = i;
for(re int i = 1; i <= n; i++)
{
while (top && a[stk[top]].v >= a[i].v) a[i].l = a[stk[top]].l, --top;
if (!top) a[i].l = 1;
stk[++top] = i;
}
top = 0;
for(re int i = n; i; i--)
{
while (top && a[stk[top]].v >= a[i].v) a[i].r = a[stk[top]].r, --top;
if (!top) a[i].r = n;
stk[++top] = i;
} sort(a + 1, a + n + 1, cmp1);
a[1].v = top = 1;
for(re int i = 2; i <= n; i++)
if (a[i].l == a[i - 1].l && a[i].r == a[i - 1].r) a[i].v = top;
else a[i].v = ++top;
sort(a + 1, a + n + 1, cmp2); memset(lst , 255 , sizeof lst);
for(re int i = 1, pre; i <= n; i++)
{
if (lst[a[i].v] == -1) update(rt[i], rt[i - 1], 1, n, i, 1);
else update(pre, rt[i - 1], 1, n, lst[a[i].v], -1), update(rt[i], pre, 1, n, i, 1);
lst[a[i].v] = i;
}
for(re int i = 1, l, r; i <= q; i++)
read(l), read(r), printf("%d\n", query(rt[r], 1, n, l));
}

最新文章

  1. ASP.NET MVC Model绑定的简单应用
  2. lower_bound实现函数
  3. 安装 Visual Stuidio 2010 失败
  4. 不逃离WIndows,Asp.Net就只能写写进销存管理系统
  5. 谱曲软件-MuseScore
  6. 高效 Java Web 开发框架 JessMA v3.2.3 beta-2 发布
  7. 无法安装vmware tools的解决方PLEASE WAIT! VMware Tools is currently being installed on your system. Dependin
  8. USACO dualpal
  9. 【百度地图API】今日小年大进步,齐头共进贺佳节——API优化升级上线,不再增加内存消耗
  10. jmeter+ant+jenkins+mac 构建后自动发送邮件
  11. hashCode()方法以及集合中Set的一些总结
  12. codeforces 600E . Lomsat gelral (线段树合并)
  13. linux查看IP
  14. JDBC(12)—DBUtils工具类
  15. 潭州课堂25班:Ph201805201 第八课:函数基础和函数参数 (课堂笔记)
  16. Java设计模式(一)普通工场模式 抽象工场模式
  17. memory consistency
  18. bing背单词交互流程 - Chongyang Bai
  19. 打开vi后提示The ycmd server SHUT DOWN (restart with :YcmRestartServer)该如何处理
  20. 在 Ubuntu 14.04 Chrome中安装Flash Player(转)

热门文章

  1. [CG] 用 Docker 配置 Ubuntu OpenGL 环境
  2. Navicat mysql创建数据库、用户、授权、连接
  3. 【SQL进阶】【REPLACE/TIMESTAMPDIFF/TRUNCATE】Day01:增删改操作
  4. Maven工程卡在Resolving Maven dependencies,长时间不变
  5. 【Java EE】Day13 Web概念回顾、Tomcat、Servlet
  6. 基于Nginx搭建WebDAV服务
  7. 把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
  8. Spring IOC官方文档学习笔记(一)之IOC容器概述
  9. Python实验报告(第13章)
  10. 已完成 10000 多次提交,Solon Java Framework v1.12.1 发布