\(\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));
}

【USACO 2021 February Contest, Platinum】Problem 1 No Time to Dry的更多相关文章

  1. 孤独的照片【USACO 2021 December Contest Bronze】

    孤独的照片 Farmer John 最近购入了 \(N\) 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一. 奶牛目前排成一排,Farmer John 想要为 ...

  2. 洛谷 P2812 校园网络【[USACO]Network of Schools加强版】 解题报告

    P2812 校园网络[[USACO]Network of Schools加强版] 题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是 ...

  3. 【USACO 2019 Feburary Contest】Gold

    模拟二月金组,三个半小时AK. USACO 2019 Feburary Contest, Gold T1 题意:给定一棵树,每个点有点权,每次可以进行以下操作之一: 更改一个点的点权 求某条路径上的点 ...

  4. USACO 2015 December Contest, Platinum Problem Max Flow【树链剖分】

    题意比较难理解,就是给你n个点的树,然后给你m个修改操作,每一次修改包括一个点对(x, y),意味着将x到y所有的点权值加一,最后问你整个树上的点权最大是多少. 比较裸的树链剖分了,感谢Haild的讲 ...

  5. 【 2013 Multi-University Training Contest 3 】

    HDU 4622 Reincarnation 枚举字符串的起点,构造后缀自动机,每次插入一个字符,就能统计得到当前不同字串的个数,预处理出所有的询问. #include<cstdio> # ...

  6. 【贪心+中位数】【新生赛3 1007题】 Problem G (K)

    Problem G Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  7. USACO 2016 February Contest, Gold解题报告

    1.Circular Barn   http://www.usaco.org/index.php?page=viewproblem2&cpid=621 贪心 #include <cstd ...

  8. 【 2013 Multi-University Training Contest 8 】

    HDU 4678 Mine 对于每个空白区域,求SG值. 最后异或起来等于0,先手必败. #pragma comment(linker,"/STACK:102400000,102400000 ...

  9. 【 2013 Multi-University Training Contest 7 】

    HDU 4666 Hyperspace 曼哈顿距离:|x1-x2|+|y1-y2|. 最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案. #include<cstdio ...

  10. 【 2013 Multi-University Training Contest 6 】

    HDU 4655 Cut Pieces 假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an.但是答案显然不会那么多. 对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a ...

随机推荐

  1. 【开发必备】单点登录,清除了cookie,页面还保持登录状态?

    背景 本地搭建了一台认证服务器.两台资源服务器,看看请求的过程 开始 没登录,直接请求资源服务器,结果跳转到的登录页面 登录后,请求了认证服务器的登录接口,然后顿重定向,最后回到了资源服务器的接口,页 ...

  2. 整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期、昨天、今天、明天、每月天数、时间戳等,以及常用的日期时间处理方法

    在 javascript 中内置了一个 Date 对象,可用于实现一些日期和时间的操作. 本文整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期.昨天.今天.明天.每月天数.时间戳等,以 ...

  3. 【SQL知识】SQL中的join操作总结:内连接、外连接(左右全)

    一.含义 基于表之间的共同字段,把来自两个或多个表的行结合起来 二.分类 内连接:join / inner join 外连接:left join / right join / full outer j ...

  4. Java开发学习(四十八)----MyBatisPlus删除语句之逻辑删除

    1.逻辑删除 接下来要讲解是删除中比较重要的一个操作,逻辑删除,先来分析下问题: 这是一个员工和其所签的合同表,关系是一个员工可以签多个合同,是一个一(员工)对多(合同)的表 员工ID为1的张业绩,总 ...

  5. IOS移动端 -webkit-overflow-scrollin属性造成的问题

    -webkit-overflow-scrolling带来的相关问题. -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效果. 其具有两个属性: auto: ...

  6. 【HarmonyOS】ArkTS Native开发——使用 system函数创建文件

    ​ ArkTS是HamronyOS优选的主力语言,但官方文档指南中对于Native应用开发并没有详细的描述,只有一篇Codelab可以学习(简易Native C++ 示例(ArkTS) (huawei ...

  7. 如何用 30s 给面试官讲清楚跳表

    查找 假设有如下这样一个有序链表: 想要查找 24.43.59,按照顺序遍历,分别需要比较的次数为 2.4.6 目前查找的时间复杂度是 O(N),如何提高查找效率? 很容易想到二分查找,将查找的时间复 ...

  8. 说透 Kubernetes 监控系列 - 概述

    本文作者孔飞,来自快猫星云团队,Kubernetes专家,Categraf 采集器核心研发工程师 云原生包含了开源软件.云计算和应用架构的元素.云计算解决开源软件的运行门槛问题,同时降低了运维成本和基 ...

  9. python与数值计算环境安装

    数值计算的编程的软件很多种,也见过一些编程绘图软件的对比. 利用Python进行数值计算,需要用到numpy(矩阵) ,scipy(公式符号), matplotlib(绘图)这些工具包. 1.Linu ...

  10. SQL Server下7种“数据分页”方案,全网最全

    数据分页往往有三种常用方案. 第一种,把数据库中存放的相关数据,全部读入PHP/Java/C#代码/内存,再由代码对其进行分页操作(速度慢,简易性高). 第二种,直接在数据库中对相关数据进行分页操作, ...