10 月 4 日 S 组 风 雨 大 作

news/2024/10/5 9:44:25/文章来源:https://www.cnblogs.com/hmzcoding/p/18447627

智障行为+2

T1 T2 T3 T4
0 0 0 0

好吧至少下一次不会考更低了

T1

你有个 n 个点 m 条边的无向图,每条边都有红蓝两种颜色中的一种,保证红色的边形成了这个图的一个生成树。
你希望给这些边赋上边权,保证边权是 1 ∼ m 的排列,使得红色的边是最小生成树。
希望这些边权形成的序列字典序最小,也就是先比较第一条边的边权,再比较第二条边的边权,依次类推。
对于所有数据,保证 n, m ≤ 5 × 10^5 , m ≥ n − 1。

对,这道题(感觉像绿)卡了我很久,挂了

Time:2s
Memory:128M

正确思路:

首先,我们先看一张图:

绿字代表加入顺序(边序)

根据题意,我们会发现:红边会构成一棵树,之后每加入一条蓝边就会构成一个环(除了这条边其他环上边均为红边),由于蓝边一定是环上最大边(红边为最小生成树上的边,一定比他小),所以我们就可以用拓扑排序解决此题(时间复杂度n方,TLE)

我们可以尝试对上述方法用数据结构进行优化,但时间复杂度还是会有问题(线段树时间可能没问题,but MLE)

我们可以考虑从前往后,按顺序贪心确定每条边的大小。对于一条非树边,考虑有k条它对应的树边没
确定,那么把这些树边按顺序从小到大赋值,然后把这条树边赋上环上最大红边的边权+1即可。因为一条边被赋完值之
后不会再被修改,所以可以用并查集实现,也就是确定的边直接缩起来,时间复杂度O(nlogn) 。

code:

#include <bits/stdc++.h>
// #include<windows.h>
using namespace std;
// #pragma GCC optimize(2)
#define int long long
#define pii pair<int, int>
#define il inline
#define p_q priority_queue
#define map unordered_map
#define rg registerconst int N1 = 100005;
const int N2 = 1000006;
const int mod = 998244353;#define debug 0
#define endl '\n'int _test_ = 1;
int n,m;
vector<pii> a[N1*5];
struct edge{int x,y,col;
}e[N2];
int fa[N1*5],deep[N1*5];
int tot=0;
int top[N2],ans[N2];
int fid[N1*5];// 用来存这个节点连向父亲的边的id
namespace third_coming {void dfs(int x,int f,int dep){fa[x]=f;deep[x]=dep;for(int i=0;i<a[x].size();i++){if(f==a[x][i].first){continue;}fid[a[x][i].first]=a[x][i].second;dfs(a[x][i].first,x,dep+1);}}int asdf[5*N1];void add_edge(int id){if(e[id].col){//红边if(!ans[id]) ans[id]=++tot;//没有记录过ansreturn;//红边不需要判断环}int x=e[id].x,y=e[id].y;int u=x,v=y,tt=0;//tt,asdf是用来记录环上没有ans的红边的idwhile(top[u]!=top[v]){// cout<<u<<' '<<v<<endl;// cout<<top[u]<<' '<<top[v]<<endl;// cout<<fa[u]<<' '<<fa[v]<<endl;// Sleep(100);if(deep[top[u]]>deep[top[v]]){if(!ans[fid[top[u]]]) asdf[++tt]=fid[top[u]];u=fa[top[u]];}//u比v深,u往上爬else{if(!ans[fid[top[v]]]) asdf[++tt]=fid[top[v]];v=fa[top[v]];}//v比u深,v往上爬}//LCA+环上计算红边sort(asdf+1,asdf+tt+1);for(int i=1;i<=tt;i++){int x=asdf[i];// pq.pop();ans[x]=++tot;}ans[id]=++tot;int p=u,q=v;u=x,v=y;while(top[u]!=top[v]){if(deep[top[u]]>deep[top[v]]){// int p=top[u];int x=u;u=fa[top[u]];top[x]=top[p];}else{int x=v;v=fa[top[v]];top[x]=top[q];}}//路径压缩}void init() {// cout<<endl;cin>>n>>m;for(int i=1;i<=m;i++){// int x,y,z;cin>>e[i].x>>e[i].y>>e[i].col;if(!e[i].col) continue;a[e[i].x].push_back({e[i].y,i});a[e[i].y].push_back({e[i].x,i});}dfs(e[1].x,0,1);//预处理for(int i=1;i<=n;i++){top[i]=i;}//top用于LCA的运算(优化)for(int i=1;i<=m;i++){add_edge(i);}//一条一条加进去算for(int i=1;i<=m;i++){cout<<ans[i]<<" ";}}void solve() {}void main() {init();solve();}
}
using namespace third_coming;
signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#ifdef debug// freopen("series.in", "r", stdin);// freopen("series.out", "w", stdout);
#endifthird_coming::main();return 0;
}

T2

现在有 n 个区间 [li, ri],每个区间有个权值 wi。我们把这 n 个区间当成 n 个点,如果两个区间它们之间有交(包括端点),那么我们就在这两个区间之间连边,形成了一个区间图。
现在希望你删除一些区间,使得每个连通块大小不超过 k。输出删除区间最小的权值和。

保证 1 ≤ k ≤ n ≤ 2500, 1 ≤ li ≤ ri ≤ 10^9(区间左右端点), 1 ≤ wi ≤ 10^9。

Time:1s
Memory:1G

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

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

相关文章

南沙C++信奥赛陈老师解一本通题: 1828:【02NOIP提高组】均分纸牌

​【题目描述】有n堆纸牌,编号分别为 1,2,…,n。每堆上有若干张,但纸牌总数必为nn的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为n−1的堆上;其他堆上取的纸…

反射容斥

好久没写了呃呃呃……反射容斥恋のうた あとどれくらいの距離を 月へ歩いたら あとどれくらいの 寒い夜を重ねたら あとどれくらいの さよならを流したら まぶたの奥の泉が枯れ果てるとか 千年後もきっと続くだろう そう思ってた空洞を 満たしてあふれてしまうほどの この気持ち…

快乐数学5虚数

5 虚数 虚数总是让我感到困惑:这是一个数学抽象概念,方程是可处理它。 大学才会用到它。我们将用我们最喜欢的工具来攻克这个课题:关注关系,而非机械公式。 将复数视为数字系统的升级,就像零、小数和负数一样。 使用直观的图表,而不仅仅是文字,来理解概念。5.1 真正理解负…

Cisco Secure Firewall 3100 Series FTD Software 7.6.0 ASA Software 9.22.1

Cisco Secure Firewall 3100 Series FTD Software 7.6.0 & ASA Software 9.22.1Cisco Secure Firewall 3100 Series FTD Software 7.6.0 & ASA Software 9.22.1 Firepower Threat Defense (FTD) Software - 思科防火墙系统软件 请访问原文链接:https://sysin.org/blog…

冲刺 CSP 联训模拟 2

T1 挤压 概率期望,二进制拆位 看到异或想到拆位算贡献 \[\begin{aligned} ans&=\sum_xx^2P(x)\\ &=\sum_x(b_1+b_2+...+b_{30})^2P(x)\ \ \ (b_i表示\ x\ 二进制下\ i\ 位的值)\\ &=\sum_x(b_1b_1+b_1b_2+. . .b_{30}b_{29}+b_{30}b_{30})P(x)\\ &=\sum_i^{30…

智慧园区管理原型

智慧园区管理系统的构建是一个复杂而系统的工程,它融合了信息化、AI、物联网等多种先进技术,旨在提升园区的管理效率、服务质量以及企业运营效率。 一、明确系统目标和需求 需求收集与分析:首先,需要对园区的实际需求进行全面分析,包括园区类型(如产业园区、办公园区、住…

读数据湖仓07描述性数据

读数据湖仓07描述性数据1. 描述性数据 1.1. 基础数据中包含不同类型的数据,而不同类型数据的描述性数据也存在显著的差异 1.2. 尽管这些描述性数据存在根本性的差异,但通过描述性数据,我们可以全面了解基础数据中的数据 1.3. 通过分析基础设施中提供的描述性数据可以获得更详…

探索JVM的堆内存分布:官方图片展示

序章 截取Java官方的 堆内存分布相关图片 到本文。Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide Java 21 https://docs.oracle.com/en/java/javase/21/gctuning/preface.html下载为 pdf,搜索 Figure,截取其中的 堆内存分布相关…

快乐数学3勾股定理延伸

3 勾股定理延伸 我们一直低估了勾股定理。上一章表明它适用于任何有平方项的公式。 3.1 理解该定理在任意直角三角形中如果 a=3 和 b=4,那么 c=5。很简单吧?那么,关键的一点是 a 和 b 成直角(注意小红框)。一个方向的移动对另一个方向没有影响。 这有点像南北与东西的关系…

Docker系列-超级详细教你Linux安装并使用docker compose,如何使用docker-compose安装sqlserver

docker compose是什么? Docker Compose 和docker功能一样,为了运行容器服务,但是docker compose比docker更好的一点是:允许你在一个 YAML 文件中定义多个容器及其配置,并通过一条命令启动和管理这些容器。 为什么要使用docker compose? 通过 Compose,您可以使用 YML 文件…

手把手非常详细图文并茂教你 Docker 部署 SQL Server

前提条件linux服务器 服务器装好了Docker 引擎 1.8 及更高版本 至少 2 GB 的磁盘空间 至少 2 GB 的 RAM搜索镜像 docker search mssql-server拉取镜像 找到适合你的版本,拉取镜像,下面这个是我从官方文档里直接找到的镜像哇~ docker pull mcr.microsoft.com/mssql/server:202…

git报错集

报错集 1.打标签报错 前戏:在开发了基础的项目功能后,在推送到远端仓库后,打算给提交的版本打标签,报错了 $ git push origin --tags fatal: unable to access https://github.com/ICP-team/仓库名.git/: Failed to connect to github.com port 443 after 21072 ms: Could…