首页 > 其他分享 >luogu P4690 [Ynoi2016] 镜中的昆虫 题解

luogu P4690 [Ynoi2016] 镜中的昆虫 题解

时间:2023-05-15 11:04:20浏览次数:54  
标签:一个点 题解 Ynoi2016 朵莉树 修改 luogu 区间 颜色

P4690 [Ynoi2016] 镜中的昆虫 题解

题意

维护一个长为 \(n\) 的序列 \(a_i\),有 \(m\) 次操作。

  1. 将区间 \([l,r]\) 的值修改为 \(x\)。

  2. 询问区间 \([l,r]\) 出现了多少种不同的数,也就是说同一个数出现多次只算一个。

题解

感觉这道题还是比较有意思的,像是一堆套路被集合了起来,但难写是真的难写,细节是真的多。

区间数颜色

以前我写区间数颜色是只算最右边的,然后修改前驱,但是这样写并不好扩展。
我们只计算最左边的,只我们记\(i\)的前驱为\(pre_i\),前驱是前面第一个和自己相同的数字。
然后扫描线统计区间中\([l,r]\)中\(pre_i\)为\([0,l-1]\)的个数,这其实是一个矩阵查询。
这其实是一个经典的二维数点问题,将\((i,pre_i)\)看做一个点,相当于查询\((x,y)(l\leq x \leq r)(0 \leq y \leq l-1)\)的点个数。
运用二维差分的知识将一个询问拆成\(4\)个,然后跑二维偏序即可,可能画图会直观一些,但是懒。

单点带修数颜色

也就是[BalkanOI2007] Mokia 摩基亚这道题。
多引入一维时间\(t\),给每一个点设置加入时间,询问设置询问时间,一个点会被统计当且仅当\(x,y,t\)都小于时才会被统计。
修改一个点可以改为插入一个点和删除一个点,修改一个点还要修改后继的前驱等,比较麻烦。

区间带修数颜色

其实对于上面的操作并不是进阶很多,我们将由于有区间推平操作,想到珂朵莉树,一个区间看做一个一个颜色段,每次修改发现只会对颜色端的两端有影响,只有颜色段两端的\(pre_i\)会被修改。
而我们知道只有修改的珂朵莉树操作次数是 n+m 级别的,所以实际上修改的并不是很多,给每一个颜色开一个珂朵莉树,给原序列开一颗珂朵莉树进行维护就行了。

一些卡常小建议:

  1. 三维偏序中结构体只需要存4个,多的放外面,可以加快排序速度。
  2. 比较短的,可以展开的函数加上inline
  3. 在三维偏序中最后一层不需要排序。

标签:一个点,题解,Ynoi2016,朵莉树,修改,luogu,区间,颜色
From: https://www.cnblogs.com/snow-panther/p/17401190.html

相关文章

  • NOIP 2023 模拟赛五 题解
    A.[NOIP2023模拟赛五ByFXTA]简单数学题summarization给出一个值域为\([1,m]\)的正整数序列\(a_{1\simn}\),序列中的数各不相同,求出使\(a_i^2+a_j\)为完全平方数的\((i,j)\)的对数。solution实际上就是求\(x^2+y=z^2\quad(x,y,z\in\mathbb{N}^+)\)的\((x,y)\)......
  • P4555 最长双回文串 题解
    首先用manacher处理一下。然后我们可以枚举断点,问题变为求任意一个点为起点或终点的最长回文串,我们可以在manacher过程中更新这个值。但这样做是不对的。因为我们只用了最长的回文串更新,未考虑一个点在大回文串内部的情况,所以我们可以考虑第二次递推,以\(l\)数组(起点最长)为......
  • CF1580C Train Maintenance题解
    我们以\(\sqrtm\)为分界点来进行平衡。设当前在进行第\(k\)次操作,询问\(i\)。对于\(x_i+y_i\leq\sqrtm\),可以在\(last_{x_i+y_i,day\bmod(x_i+y_i)}\)上\(+1\),其中\(day\)表示维修的时间,\(k+x_i\leqday\leqk+x_i+y_i-1\),输出时暴力统计即可......
  • CF961E Tufurama题解
    我们维护一个存储下标数据的树状数组,先将\(1\simn\)插入树状数组。用\(a\)表示原数组,\(b\)表示按照\(a_i\)排序后的数组。我们从\(1\)开始统计,直到\(n\),统计时:将\(i\)删除,不能把自己算进去。为了排除\(a_j<i\)的部分,可以从前往后扫描\(b\),一直删,......
  • CF1794B Not Dividing题解
    如果\(a_i\)可以整除\(a_{i-1}\),只要在\(a_i\)上\(+1\)即可,这样\(a_i\bmoda_{i-1}=1\)就满足题目要求了,如果这样算来最多进行\(n\)次操作。但同时要注意\(a_{i-1}=1\)的情况。如果\(a_{i-1}\)为\(1\),那么怎么\(+1\)都是\(a_i\bmoda_{i-1}=......
  • CF1794C Scoring Subsequences题解
    文中\(a\)为题目中给的\(a\)。如果我们要求\(a_1,a_2,a_3,\dots,a_m\)的结果,那么我们可以把\(a\)数组从后往前依次除以\(i\),\(i\)从\(1\)到\(n\),即为\(\frac{a_1}{m},\frac{a_2}{m-1},\frac{a_3}{m-2},\dots,\frac{a_{m-1}}{2},\frac{a_m}{1}\),并将其保......
  • CF371D题解
    思路:定义一个权值并查集,权值保存这个集合还可以存下多少水。如果这个集合可以存放的水已经小于要装入的水,就将这个集合与下一个集合合并。否则,直接把这个集合可以存放的水减去要装入的水的体积。代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;......
  • CF1799B Equalize by Divide题解
    本蒟蒻学习了jiangly大佬的思想,来发一个题解。大致题意:给定一个\(n\)个元素的数组\(a\),每次可以选择\(a[i]\)和\(a[j]\),然后使\(a[i]=\lceil\frac{a_i}{a_j}\rceil\),如果最后可以使数组中的所有元素都相等,那么输出Yes,并输出每一个操作\(i,j\);否则输出No。本人不......
  • CF1728A Colored Balls: Revisited题解
    去我的Blog观看修改时间:2022/9/11修改了格式与标点修改时间:2022/9/13修改了个别不严谨的语句题目大意有\(n\)种颜色的球,颜色为\(i\)的球为\(cnt_i\)个(\(cnt_1+cnt_2+\dots+cnt_n\)为奇数)。每次从球堆中取出\(2\)个颜色不相同的球,问最后可能剩下哪种颜色的球(输出任意......
  • 常见问题解决 --- python必备技能 换源
    源是什么源是编程开发或则是操作系统要使用的第三方依赖软件应用市场,源又从何而来,其实源来自其他的源的克隆,或者是源提供者自己收集,编译,又或者作者的上传为什么要换源这些源往往都在国外,国内以为你懂的原因无法直接访问或者特别慢怎么换Windows下python永久换源方式有两种:修......