题目链接

离别

离线算法+线段树

容易发现当我们枚举右端点r时,符合条件的左端点是一段连续的区间

我们可以用队列来维护这个连续区间的左右端点

当枚举到端点\(i\)时,将下标\(i\)插入到队列\(q[a_i]\)中

如果元素大于k,队首+1即为左端点(注意要与之前的取max)

如果元素等于k,队首即为右端点

这样对每个右端点,就找到了符合条件的左端点

然后将询问离线,以右端点排序

对于每个右端点,将符合条件的左端点插入线段树中,同时查询答案

时间复杂度\(O(nlogn)\)

(注意要开long long,还有update 与 query 都要push_down)

代码

#include <bits/stdc++.h>
#define LL long long
#define int long long
#define ls(p) p << 1
#define rs(p) p << 1|1
using namespace std;
const int N = 3e5 + 101;
int tree[N * 4], laz[N * 4];
int a[N], b[N], tl[N], tr[N];
int n, q, k, ans[N];
struct node {int id, l;};
queue<int>que[N];
vector<node>ask[N]; void push_up(int p)
{
tree[p] = tree[ls(p)] + tree[rs(p)];
}
void push_down(int p,int l,int r)
{
int mid = (l + r) / 2;
tree[ls(p)] += (mid - l + 1) * laz[p];
tree[rs(p)] += (r - mid) * laz[p];
laz[ls(p)] += laz[p];
laz[rs(p)] += laz[p];
laz[p] = 0;
} void update(int p,int l,int r,int nl,int nr,int ad)
{
if(nl <= l && r <= nr)
{
laz[p] += ad;tree[p] += (r - l + 1) * ad;
return;
}
push_down(p,l,r);
int mid = (l + r) / 2;
if(nl <= mid) update(ls(p),l,mid,nl,nr,ad);
if(nr > mid) update(rs(p),mid + 1,r,nl,nr,ad);
push_up(p);
} int query(int p,int l,int r,int nl,int nr)
{
int ans = 0;
if(nl <= l && r <= nr) return tree[p];
push_down(p,l,r);
int mid = (l + r) / 2;
if(nl <= mid) ans += query(ls(p),l,mid,nl,nr);
if(nr > mid) ans += query(rs(p),mid + 1,r,nl,nr);
return ans;
}
signed main()
{
scanf("%lld%lld%lld",&n,&q,&k);
for(int i = 1;i <= n; i++)
scanf("%lld",&a[i]);
int L = 0,R = 0; // 对应的左区间符合条件的答案
for(int i = 1;i <= n; i++)
{
que[a[i]].push(i);
if(que[a[i]].size() > k)
L = max(L,que[a[i]].front()),que[a[i]].pop(); //更新左端点
if(que[a[i]].size() == k)
R = max(R,que[a[i]].front());
tl[i] = L + 1;tr[i] = R;
}
for(int i = 1;i <= q; i++)
{
int l, r;scanf("%lld%lld",&l,&r);
ask[r].push_back((node){i,l});
}
for(int i = 1;i <= n; i++)
{
if(tl[i] <= tr[i]) update(1,1,n,tl[i],tr[i],1);
for(int j = 0;j < ask[i].size(); j++)
ans[ask[i][j].id] = query(1,1,n,ask[i][j].l,i);
}
for(int i = 1;i <= q; i++) printf("%lld\n",ans[i]);
} /*
4 4 2
1 2 3 4
1 2
1 3
1 4
2 4
*/

牛客练习赛 73 D的更多相关文章

  1. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  2. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  3. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  4. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  5. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  6. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  7. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

  8. 牛客练习赛 29 E 位运算?位运算!(线段树)

    题目链接  牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...

  9. 牛客练习赛22C Bitset

    牛客练习赛22C 一共有 n个数,第 i 个数是 xi  xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 感觉二进制真是一个神奇的东西. #include <iost ...

随机推荐

  1. Linux bash反弹shell原理引起的一点思考

        最近,一起做安全测试的兄弟问我:Linux反弹shell的命令是什么,我毫不犹豫地在笔记中找到发给了他,可是脑海中突然闪过有个疑问,为啥这样能反弹shell呢,用了那么多次却从来没有想过这个问 ...

  2. 图解HTTP简单笔记【上】

    第一章 了解WEB及网络基础(省略了TCP/IP的知识点) 1.1.使用HTTP协议访问web  当我们在主机的浏览器的地址输入URL之后 请求将回发送至目标服务器 目标服务器在接受到响应请求时将会响 ...

  3. 02python开发之基本运算符

    02 python开发之基本运算符 目录 02 python开发之基本运算符 2 基本运算符 2.1 算数运算符 2.1.1 种类 2.1.2 用法 2.2 比较运算符 2.2.1 种类 2.2.2 ...

  4. MathType中怎么打约化普朗克常数ħ

    普朗克常数记为ħ,是一个物理常数,用以描述量子大小.在量子力学中占有重要的角色,马克斯·普朗克在1900年研究物体热辐射的规律时发现的.如果要打出关于约化普朗克常数ħ的公式,就需要用到专业的公式编辑器 ...

  5. 在Jenkins的帮助下让我们的应用CI与CD

    上图三位大家应该很熟悉吧,借助这三者可以让我们的服务在Linux环境下持续集成.容器中持续部署. 本篇博客的项目是core webapi, .NET 5.0 在11号已经正式发布了,你们的项目都升级了 ...

  6. 检查字符串结尾 判断一个字符串(str)是否以指定的字符串(target)结尾。

    function confirmEnding(str, target) { var arr = str.replace(/\s+/g, ""); var bb = arr.subs ...

  7. mq消息

    同步,异步,单向 Message的扩展属性主要包含下面几个: tag:消息tag,用于消息过滤 keys:Message索引键,用多个空格隔开,可以根据这些key快速检索到消息 waitStoreMs ...

  8. leetcode_3FizzBuzz的一些思考

    题目很简单,给定一个正整数n,如果n能整除3的话往list里加入Fizz,如果n能整除5的话往list里面加入Buzz,如果即能整除3又能整除5的话,加入FizzBuzz,代码也很简单 public ...

  9. PyQt(Python+Qt)学习随笔: QDoubleSpinBox浮点数字设定部件简介

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<PyQt(Python+Qt)学习随笔: ...

  10. 第8.28节 Python中使用__setattr__定义实例变量和实例方法

    一. 引言 根据前面章节介绍的内容,我们知道实例变量.实例方法的定义可以通过以下方法进行: 在类体中直接定义实例变量.实例方法: 在实例方法中定义实例变量.实例方法: 在类体外调用方使用赋值语句赋值定 ...