首页 > 其他分享 >染色

染色

时间:2023-07-30 11:33:43浏览次数:24  
标签:lzx return fa 黑点 染色 int find

题目描述

在一条数轴上有n个点,分别为1-n 。一开始所有的点都被染成黑色。接着进行m次操作,第i次操作将[l,r]这些点染成白色。请输出每个操作执行后剩余黑色点的个数。

输入格式

输入第一行为n和 m。

下面一行每行两个数l,r 。

输出格式

输出m行,为每次操作后剩余黑色点的个数。

样例

样例输入

10 3
3 3
5 7
2 8

样例输出

9
6
3
 

 

分析

将[l,r]区间内的黑点染成白点。最朴素的方法是,从l到r逐个排查每个点,将黑点变白,统计黑点个数。时间复杂度(O(n2))超时了。

本题关键是提高查找区间内黑点位置的效率。

可以维护每个点右边最近的黑点的位 置   fa[p]

这样查找p向右最近的黑点位置时候可以跳过白点,p=fa[p]。

为了跳得更快点,可以路径压缩 :p=find(p) (并查集中的“查”)

染色操作的影响:

将p点染色后 ,p向右最近的黑点位置就是p+1点向右最近的黑点位置fa[p]=find[p+1](并查集中的“并”)  

代码参考

   
#include <bits/stdc++.h>
using namespace std;
#define re register

#define LL long long

inline int read() {
    int f = 1, lzx = 0;
    char c = getchar();
    while ((c > '9') || (c < '0')) {
        if (c == '-')
            f = -f;
        c = getchar();
    }
    while (c <= '9' && c >= '0') {
        lzx = lzx * 10 + c - '0';
        c = getchar();
    }
    return lzx * f;
}
const int MAXN = 1e6 + 10;
int n, m, l, r, fa[MAXN];
inline int find(int x) {
    if (fa[x] == 0)
        return x;
    return fa[x] = find(fa[x]);
}

int main() {
    n = read();
    m = read();
    int s = n;
    for (int i = 1; i <= m; i++) {
        l = read();
        r = read();
        for (;;) {
            l = find(l);
            if (l > r)
                break;
            // 染白l位置的点
            s--;                  // 黑点个数减1
            fa[l] = find(l + 1);  // l右边最近的黑点位置,就是l+1右边最近的黑点位置.
        }
        printf("%d\n", s);
    }

    return 0;
}

  

     

标签:lzx,return,fa,黑点,染色,int,find
From: https://www.cnblogs.com/flatte/p/17591135.html

相关文章

  • LOJ #6160. 「美团 CodeM 初赛 Round A」二分图染色 思考--zhengjun
    link思维+容斥计数。首先的转化比较妙,二分图转化为\(n\timesn\)的网格图染色。与网络流的转化方向相反,值得注意。然后发现两种颜色(红、蓝)如果独立染色,同一个格子可能会重复染色。考虑容斥,式子很好列,直接容斥即可。\[ans=\sum\limits_{i=0}^n(-1)^n\times\binom{n}{i......
  • BZOJ 2243: [SDOI2011]染色 树链剖分+线段树
    2243:[SDOI2011]染色TimeLimit: 20Sec  MemoryLimit: 512MBSubmit: 7623  Solved: 2855[Submit][Status][Discuss]Description给定一棵有n个节点的无根树和m个操作,操作有2类:1、将节点a到节点b路径上所有点都染成颜色c;2、询问节点a到节点b路径上的颜色段数量(连续......
  • 染色问题
    环形染色问题一个圆环被分成m块,用n种不同颜色给每一块染色,要求相邻两块的颜色不相同。此类问题称之为环形染色问题。相关证明:https://zhuanlan.zhihu.com/p/507310484结论:n种颜色,m种区域,则最终的染色数为\(ans=(n-1)^m+(-1)^m(n-1)\)......
  • NC20573 [SDOI2011]染色
    题目链接题目题目描述给定一棵有n个节点的无根树和m个操作,操作有2类:1、将节点a到节点b路径上所有点都染成颜色c;2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。请你写一个程序依次完成这m......
  • 【高中生物必修二】第二章 基因和染色体
    第一节减数分裂与受精作用减数分裂是两倍体细胞(有性繁殖)产生单倍体配子的过程,简单而言,染色体的数量变为一半。二倍体细胞中每一对染色体大小形态意义类似,一个从母方获得,一个从父方获得,故一对染色体也会有差距。有丝分裂产生复制品,往往用于常被磨损的细胞,例如皮肤。减数分裂的主......
  • C++ 图进阶系列之剖析二分图的染色算法和匈牙利算法
    1.前言二分图又称作二部图或称为偶图,是图论中的一种特殊类型,有广泛的应用场景。什么是二分图?二分图一般指无向图。看待问题要有哲学思想,有二分图也可以是有向图。如果图中所有顶点集合能分成两个独立的子集,且任一子集中的任意顶点之间没有边连接,则称这样的图为二分图。......
  • B. 染色(树链抛分)
    B.染色-树链剖分-比赛-衡中OI(tg.hszxoj.com)题目描述原题来自:SDOI2011给定一棵有  个节点的无根树和  个操作,操作共两类。将节点  到节点  路径上的所有节点都染上颜色;询问节点  到节点  路径上的颜色段数量,连续相同颜色的认为是同一段,例如 1......
  • python 中 pyfaidx 模块统计fasta文件每一条染色体的长度
     001、python版本和pip版本a、python版本[root@PC1pip]#python--versionPython3.11.3 b、pip版本[[email protected]]#pip--versionpip23.1.2from/usr/local/lib/python3.11/site-packages/pip(python3.11) 002、利用pip安装 pyfaidx模块......
  • 从原理聊 JVM(一):染色标记和垃圾回收算法
    1JVM运行时内存划分1.1运行时数据区域• 方法区属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池,属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。JDK1.8之前,Hotspot虚拟机对方法区的实现叫做永久代,1......
  • 从原理聊JVM(一):染色标记和垃圾回收算法
    作者:京东科技 康志兴1JVM运行时内存划分1.1运行时数据区域•方法区属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池,属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。JDK1.8之前,Hotspot虚拟机对方法区......