Solution -「洛谷 P4688」「YunoOI 2016」掉进兔子洞
Description
(Link)[https://www.luogu.com.cn/problem/P4688].
每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立。
Solution
读完题,我们可以发现每轮询问的答案是这个东西:
\]
其中,\(P\) 表示三个区间里面的公共颜色数量。
前面那个 \(\sum\) 里面的东西很好维护,我们主要来讲后面一部分的维护方法。
首先初始序列的 \(a_{i}\) 是一定要离散化一遍的。
那么我们如何表示出出现的最少次数呢?
如果这是一个二进制串的话,我们可以发现这就是一个 \(\operatorname{bit\_and}\) 的操作。
对于每个询问,我们可以把三个区间分开处理再合并。直接维护复杂度过高,用 bitset 优化。由于这是个二进制序列,所以离散化的时候不能去重,否则答案就会偏大。
直接操作容易 MLE,这里介绍一个小trick。我们可以把询问分批处理,这样就行了。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <bitset>
#include <cmath>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int N = 1e5 + 5;
const int F = 23333 + 5;
int n, m, block, origin[N], appear[N];
int cnt[N], ans[N], vis[25005];
int l1[N], l2[N], l3[N];
int r1[N], r2[N], r3[N];
bitset < N > S[F];
vector < int > disc;
struct AskSet {
int l, r;
int id, p;
} Q[N];
int GetID(int x) {
return lower_bound(disc.begin(), disc.end(), x) - disc.begin() + 1;
}
bool SortWith(const AskSet& x, const AskSet& y) {
return (x.p < y.p) || (x.p == y.p && x.r < y.r);
}
void MakeCont(int pos, int flags, bitset < N >& bit) {
pos = origin[pos];
if (flags > 0) bit[pos + cnt[pos]] = 1;
else bit[pos + cnt[pos] - 1] = 0;
cnt[pos] += flags;
}
void Contribute(int fr, int ba) {
memset(cnt, 0, sizeof cnt);
memset(vis, 0, sizeof vis);
bitset < N > bit; bit.reset();
int l = 1, r = 0, subs = 0;
for (int i = fr; i <= ba; ++i) {
Q[++subs] = {l1[i], r1[i], i, appear[l1[i]]};
Q[++subs] = {l2[i], r2[i], i, appear[l2[i]]};
Q[++subs] = {l3[i], r3[i], i, appear[l3[i]]};
ans[i] += (r3[i] - l3[i]) + (r2[i] - l2[i]) + (r1[i] - l1[i]) + 3;
}
sort(Q + 1, Q + 1 + subs, SortWith);
for (int i = 1; i <= subs; ++i) {
while (r < Q[i].r) MakeCont(++r, 1, bit);
while (l > Q[i].l) MakeCont(--l, 1, bit);
while (r > Q[i].r) MakeCont(r--, -1, bit);
while (l < Q[i].l) MakeCont(l++, -1, bit);
if (!vis[Q[i].id - fr + 1]) {
vis[Q[i].id - fr + 1] = 1;
S[Q[i].id - fr + 1] = bit;
} else {
S[Q[i].id - fr + 1] &= bit;
}
}
for (int i = fr; i <= ba; ++i)
ans[i] -= S[i - fr + 1].count() * 3;
}
signed main() {
scanf("%d %d", &n, &m);
block = sqrt(n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &origin[i]);
appear[i] = (i - 1) / block + 1;
disc.push_back(origin[i]);
}
sort(disc.begin(), disc.end());
for (int i = 1; i <= n; ++i)
origin[i] = GetID(origin[i]);
for (int i = 1; i <= m; ++i) {
scanf("%d %d", &l1[i], &r1[i]);
scanf("%d %d", &l2[i], &r2[i]);
scanf("%d %d", &l3[i], &r3[i]);
}
for (int i = 1; i <= m; i += 23333) Contribute(i, min(m, i + 23332));
for (int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
return 0;
}
Solution -「洛谷 P4688」「YunoOI 2016」掉进兔子洞的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 「 洛谷 」P2768 珍珠项链
珍珠项链 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 题目来源 「 洛谷 」P2768 珍珠项链 ...
- 「 洛谷 」P4539 [SCOI2006]zh_tree
小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- loj #6201. 「YNOI2016」掉进兔子洞
#6201. 「YNOI2016」掉进兔子洞 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 给出一个长为 nnn 的序列 aaa. 有 mmm 个询问,每次询问三个区 ...
- luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队
题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
随机推荐
- 【Python爬虫】批量爬取网页的图片&制作数据集
由于Python拥有强大且丰富的类库,语法简单,效率高而被广泛运用于网络爬虫,很多人都是通过爬虫认识Python. 因为小编最近正在做目标识别相关的项目,所以需要大量的 ...
- 可能是最简单最通透的Comparable和Comparator接口返回值理解
先说 Comparator 接口,这个理解了,下一个就理解了 一.Comparator 的用法(暂不考虑0,因为0不处理) 返回-1,1交换不交换位置,如果撇开比较器的两个参数和jdk默认顺序来说,存 ...
- RALB负载均衡算法的应用
一.背景 搜索推荐算法架构为京东集团所有的搜索推荐业务提供服务,实时返回处理结果给上游.部门各子系统已经实现了基于CPU的自适应限流,但是Client端对Server端的调用依然是RR轮询的方式,没有 ...
- 自然语言处理 Paddle NLP - 预训练语言模型及应用
什么是语言理解? 关于疫情的一段对话: 中国:我们这边快完了 欧洲:我们这边快完了 中国:我们好多了 欧洲:我们好多了 挑战: 语言的复杂性和多样性 多义/同义/歧义现象 灵活多变的表达形式 语言背后 ...
- R语言中的跨平台支持:如何在Windows、MacOS和Linux上使用R语言进行数据分析和可视化
目录 当今数据科学领域,R语言已经成为了数据分析和可视化的流行工具.R语言具有强大的功能和灵活性,使得它可以在各种不同的平台上运行,包括Windows.MacOS和Linux.因此,本文将介绍R语言中 ...
- 1.6 编写双管道ShellCode后门
本文将介绍如何将CMD绑定到双向管道上,这是一种常用的黑客反弹技巧,可以让用户在命令行界面下与其他程序进行交互,我们将从创建管道.启动进程.传输数据等方面对这个功能进行详细讲解.此外,本文还将通过使用 ...
- AntdPro中formItemProps和fieldProps的区别
最近在工作中接触到了 antd 和 antd pro,作为一个 react 和 antd 新人,在学习和使用中遇到了不少的问题,下边就常见的一个问题来进行记录,后续还会记录更多的问题以及心得 Form ...
- JVM GC配置指南
本文旨在简明扼要说明各回收器调优参数,如有疏漏欢迎指正. 1.JDK版本 以下所有优化全部基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能使用update_191以后版本. 2.如何选择垃圾回 ...
- 王道oj/problem15(用c++的引用精简代码)
网址:http://oj.lgwenda.com/problem/15 思路:子函数的形参是指针的时候格式为 int*&p,且原函数实参为p 主函数使用fgets(字符串的指针,最大容量,st ...
- ASP.NET WebForm中在TextBox输入框回车时会触发其他事件,如何处理?
一.TextBox在输入框回车时会触发其他事件,如何解决? 前台代码: <ul> <li><span>名称:</span><asp:TextBox ...