[CF1981E] Turtle and Intersected Segments 题解

好题好题。


难点在建图,因为图的边数将会决定最小生成树的时间复杂度。我们肯定希望能够只建 \(O(n)\) 级别的边,这样时间复杂度就可以做到 \(O(n\log n)\)

观察到当 \(i,j,k\) 三个区间能够互相连边时(这里假设 \(a_i<a_j<a_k\)),我们绝对不会连 \((i,k)\) 这条边。

那么假如我们将所有区间按 \(a\) 值大小从小到大排序,每次将当前区间与该区间中所有颜色连边,然后再将这个区间染上新颜色,我们就能保证不会连上述所谓的 \((i,k)\) 边。这很明显是可以珂学解决的。

考虑证明珂朵莉树时间复杂度正确性(实际上也是在证明边数正确性)。

假设原先有 \(x\) 个颜色段,若连 \(y\) 条边,则至少减少 \(y-3\) 个颜色段(除最左边的颜色和最右边的颜色外,中间所有颜色块都一定会被删去,同时全部更新为一个新的颜色段),假如 \(y\) 很小,那么本次操作的单次时间复杂度可忽略不计;假如 \(y\) 很大,则本次操作减少的颜色段数将与花费的时间复杂度在一个量级,就相当于这些参与连边操作的颜色段将不会再次花费时间复杂度,总体时间复杂度依旧正确。

所以我们 极端口胡的 证明了边数级别就是 \(O(n)\),那么珂朵莉树时间复杂度就是 \(O(n\log n)\)

最小生成树就不用说了。

最终时间复杂度 \(O(n\log n)\),可以通过。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+5;
int t,n,m,k,ans,fa[N];
struct edge{int x,y,w;}ed[N];
struct line{int l,r,a;}ln[N];
int cmp(edge x,edge y){return x.w<y.w;
}int cmp2(line x,line y){return x.a<y.a;
}struct odt{int l,r;mutable int v;bool operator<(const odt &c)const{return l<c.l;}
};set<odt>st;
#define iter set<odt>::iterator
struct chtholly{iter spilt(int x){iter it=st.lower_bound({x,0,0});if(it!=st.end()&&(*it).l==x) return it;it--;if((*it).r<x) return st.end();int l=(*it).l,r=(*it).r,v=(*it).v;st.erase(it);st.insert({l,x-1,v});return st.insert({x,r,v}).first;}void assign(int l,int r,int v){iter tr=spilt(r+1),tl=spilt(l);st.erase(tl,tr);st.insert({l,r,v});}void con(int l,int r,int id){iter tr=spilt(r+1),tl=spilt(l);for(iter it=tl;it!=tr;it++) if((*it).v)ed[++m]={id,(*it).v,ln[id].a-ln[(*it).v].a};}
}seniorious;
void init(){for(int i=1;i<=n;i++) fa[i]=i;
}int find(int x){return fa[x]=(fa[x]==x?x:find(fa[x]));
}void solve(){cin>>n,init(),m=ans=0,k=n;for(int i=1;i<=n;i++)cin>>ln[i].l>>ln[i].r>>ln[i].a;sort(ln+1,ln+n+1,cmp2);st.clear(),st.insert({1,(int)1e9,0});for(int i=1;i<=n;i++){seniorious.con(ln[i].l,ln[i].r,i);seniorious.assign(ln[i].l,ln[i].r,i);}sort(ed+1,ed+m+1,cmp);for(int i=1;i<=m;i++){int x=find(ed[i].x);int y=find(ed[i].y);if(x==y) continue;k--,fa[x]=y,ans+=ed[i].w;if(k==1){cout<<ans<<"\n";return;}}cout<<"-1\n";
}signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0); cin>>t;while(t--) solve();return 0;
}/*
In this world where the sun dips in the west.
Set in the heavenly forest.
When this war is over.
The people who do not return and the multitudes who look on.
In the name of justice.
A past that will never die,The fading future.
I'm back.Even if the sun is fading.
Even if I can't see the future.
The light of this moment.
I hope you won't forget.
---- The Happiest Girl in the World
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830656.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-2025-1 20241314 《计算机基础与程序设计》第七周学习总结

2024-2025-1 20241314 《计算机基础与程序设计》第七周学习总结 作业信息这个作业属于哪个课程 <班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标 数组与链表 基于数组和基于链表实现数据结构…

二进制和格雷码转换

二进制和格雷码转换 二进制转为格雷码//根据二进制转换成格雷码的法则,可以得到以下的代码: static unsigned int DecimaltoGray(unsigned int x) {return x^(x>>1); }//以上代码实现了unsigned int型数据到格雷码的转换,最高可转换32位自然二进制码,超出32位将溢出。…

在鸿蒙NEXT中开发一个2048小游戏

本项目是基于api12开发的2048游戏,游戏的逻辑是当用户向某个方向滑动时,将该方向相邻且相等的数字相加,同时在空白区域的随机位置生成一个随机数字。游戏中的数字越大,分数越高。首先,游戏的界面布局分别采用两个网格组件Grid来实现,难点在于上方的菜单栏是不均等的三种尺…

nginx 整体架构

Nginx 是什么 Nginx 是一款 C 语言编写高性能 Web 服务器,反向代理服务器。占用内存少、并发能力强 使用场景 nginx主要有以下 4 个使用场景作为 Http 服务器,可以提供静态网页和静态资源的访问 HTTP代理缓存,缓存服务端请求数据 作为反向代理服务器,将请求代理转发 作为负…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 打开实例发现是个POST注入框盲猜SQL注入,万能密码检测无果,而且经过测试存在大量sql关键字过滤尝试使用(),出现了bool(false),确定这是一道布尔注入题and被禁用,决定采用异或^注入 构建payload脚本梭哈:成功获得flag:flag{a2…

2024 AH CSP-S 迷惑行为大赏

洛谷专栏阅读:https://www.luogu.com.cn/article/0atx674s 一、概述 观前提示:本届CSP-S安徽省整活相较于其他省份不是那么“群英荟萃”,观看前请不要小零食(?) 本届CSP-S安徽共有1013人参赛,其中有效准考证号源文件夹共有1006个,7人因为种种原因最终没有留下任何参赛痕…

LeNet-5卷积神经网络的实现与改进-实验报告

摘要 在本次实验中,我实现了LeNet-5卷积神经网络模型的构建与训练,以实现图像分类任务。主模型采用Pytorch框架搭建,模型识别准确率达到了87%,体现了较好的分类效果。除此之外,我还尝试使用C++实现模型的底层核心操作,包括卷积、池化及全连接等,但最终准确率较低,未达预…

【Mplus 8.7软件下载与安装教程】

1、安装包 Mplus 8.7: 链接:https://pan.quark.cn/s/128e81c51dbe 提取码:1X7B Mplus 8.3: 链接:https://pan.quark.cn/s/5ea5ff583480 提取码:Vdjt Mplus 7.4: 链接:https://pan.quark.cn/s/414ec0c8cb14 提取码:8jhm 2、安装教程 1) 双击Mplus8.7 Demo(64-bi…

Day13 备战CCF-CSP练习

202312-3Day 13 题目描述 题目分析 大模拟,用栈储存每一个多项式,最后根据导数的加法原则依次求导相加,注意取模。 C++代码 #pragma GCC optimize(3, "Ofast", "inline") #include <bits/stdc++.h> #define int long longusing namespace std; co…

OOP实验三

任务1: 源码:1 #pragma once2 3 #include <iostream>4 #include <string>5 6 using std::string;7 using std::cout;8 9 // 按钮类 10 class Button { 11 public: 12 Button(const string &text); 13 string get_label() const; 14 void click()…

鸿蒙NEXT开发案例:转盘1W

【1】引言(完整代码在最后面) 在鸿蒙NEXT系统中,开发一个有趣且实用的转盘应用不仅可以提升用户体验,还能展示鸿蒙系统的强大功能。本文将详细介绍如何使用鸿蒙NEXT系统开发一个转盘应用,涵盖从组件定义到用户交互的完整过程。 【2】环境准备 电脑系统:windows 10 开发工…

开源 - Ideal库 - 常用时间转换扩展方法(二)Qv

合集 - Ideal库 - Common库(2)1.开源 - Ideal库 - 常用时间转换扩展方法(一)11-07:悠兔机场2.开源 - Ideal库 - 常用时间转换扩展方法(二)11-09收起 书接上回,我们继续来分享一些关于时间转换的常用扩展方法。01、时间转日期时间 TimeOnly 该方式是把TimeOnly类型转为Date…