首页 > 其他分享 >CF--795--E

CF--795--E

时间:2022-12-25 17:12:44浏览次数:78  
标签:tmp 795 ch -- CF int id se

E. Number of Groups

关键

感觉是一个很神奇的合并的方法。
首先对这个区间进行左右拆点,然后进行排序处理。
如果加进来的这个点是左端点,那就把在区间里面的左端点进行合并。
如果加进来的是右端点,那就把相对应的左端点进行删除就可以了。
就是没有那些特别复杂的判断了。
这题是检查连通块的数量,所以只需要取最右边的那个点就行了,set里面存储的东西变一下子就可以了。

代码

#include <bits/stdc++.h>
using namespace std;
using pii=pair<int,int>;
const int M=1e5+5;
#define fi fist
#define se second

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}

struct node {
    int c,l,r;
}a[M];

int fa[M];
int find(int x) {
    return x==fa[x]?fa[x]:fa[x]=find(fa[x]);
}
void merge(int x,int y) {
    fa[find(x)]=find(y);
}

int main() {
    int TT=read();
    while(TT--) {
        int n=read();
        vector<pii>v;
        for(int i=1;i<=n;i++) {
            fa[i]=i;
            a[i].c=read(),a[i].l=read(),a[i].r=read();
            v.push_back({a[i].l,-i});//左边的优先级更高,所以是负的
            v.push_back({a[i].r,i});
        }
        sort(v.begin(),v.end());
        set<pii>se[2];
        for(int i=0;i<v.size();i++) {
            auto [x,id]=v[i];//这个值
            if(id<0) {
                id=-id;//进来
                se[a[id].c].insert({a[id].r,id});
                int tmp=a[id].c^1;//去另一边合并
                while(se[tmp].size()>1) {
                    int y=se[tmp].begin()->second;
                    se[tmp].erase(se[tmp].begin());
                    merge(id,y);
                }
                if(se[tmp].size()==1)merge(se[tmp].begin()->second,id);//这最后一个也要进行合并,其他的全部进行删除
            }
            else se[a[id].c].erase({a[id].r,id});
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            if(fa[i]==i)ans++;
        cout<<ans<<endl;
    }
    return 0;
}

标签:tmp,795,ch,--,CF,int,id,se
From: https://www.cnblogs.com/basicecho/p/17004247.html

相关文章

  • 力扣2145. 统计隐藏数组数目
    给你一个下标从0 开始且长度为n 的整数数组 differences ,它表示一个长度为 n+1 的 隐藏 数组 相邻 元素之间的 差值 。更正式的表述为:我们将隐藏数组记作......
  • Merry Christmas Mr. Lawrence
    快乐的圣诞节,从12:00整醒来开始!从圣诞节到元旦,应该是每年的12月份最快乐的一段时光,寒冷的空气里总是弥漫着节日气氛。按照惯例,平安夜我都会因为期待圣诞礼物而睡不着......
  • kali ping不通windows,而windows可以ping同kali
    kaliping不通windows,而windows可以ping同kalikaliip->192.168.248.131win10ip->192.168.248.130打开网络和Internet设置,点击Windows防火墙关闭防火墙在kali中......
  • Linux分区命令parted的用法
    linux分区命令parted的用法parted的适用场景创建操作大于2T的分区一般情况下,我们都是选择使用fdisk工具来进行分区,但是目前在实际生产环境中使用的磁盘空间越来越大,呈T......
  • springboot 使用redis和lettuce原理
    springboot使用redis  简介   在SpringBoot中,要访问Redis,可以直接引入spring-boot-starter-data-redis依赖,它实际上是SpringData的一个子项目——SpringDat......
  • Lombok介绍和配置
    什么是LombokLombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。官网:https://www.projectlombok.org/Lombok的作用通过添加注解的方式,Lombok能以简......
  • 实验八
    实验准备弹性云服务器购买实验过程遇到的问题MySQL退出时不知道单纯按了q结果不行,后来知道有俩种方式1.QUIT2.\q视频中进行网页操作卡住。......
  • 排序综合
    title:排序综合date:2022-11-1820:59:43tags:算法本文章遵守知识共享协议CC-BY-NC-SA,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人......
  • 快速幂
    title:快速幂date:2022-11-1605:45:26tags:算法本文章遵守知识共享协议CC-BY-NC-SA,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人博......
  • 费用流
    title:费用流tags:算法date:2022-11-2305:21:28本文章遵守知识共享协议CC-BY-NC-SA,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人博......