首页 > 其他分享 >牛客练习赛127

牛客练习赛127

时间:2024-07-06 11:41:13浏览次数:13  
标签:连通 练习赛 环上 top 路径 白点 牛客 答案 127

还没补E,感觉很GF。

个人感觉质量挺好,拿 CF Div.2 来对标也是出的比较好的一场。唯一的缺陷可能是E/F应该换个位置?

简要写个题解?

A

给定数组 \(a\),以及常数 \(k\),定义 \(w(i,j)\) 当 \(|a_i-a_j|>k\) 时候为 \(\max(a_i,a_j)\),否则为 \(\min(a_i,a_j)\)。

显然排序之后贪心将 \(w(n-1,n),w(1,n)\) 取 \(\max\) 即可。

\(O(n\log n)\),可以优化到 \(O(n)\)

B

给定一个正整数 \(N\) 的质因子分解 \((p_i,c_i)\),\(N=\prod_{i=1}^np_i^{c_i}\),给定 \(d\),求 \(\sum_{i|N}i^d\)。对 \(10^9+7\) 取模。

显然就是

\[\prod_{i=1}^n(\sum_{j=0}^{c_i}p_i^{d·j}) \]

不知道后面这个式子用等比数列求和分母会不会变成零,总之对于 \((1+p+p^2+p^3+……+p^m)\) 可以利用分治法进行求解。

也即设原式值为 \(S(p,m)\),当 \(m\) 为奇数时,可以 \(S(p,m)=S(p,m-1)\times p+1\)。

否则有 \(S(p,m)=(S(p,m/2)-1)\times p^{m/2}+S(p,m/2)\),可以 \(O(\log^2 m)\) 计算。

\(O(n\log^2 n)\)

C

给定 \(n\) 点 \(m\) 边带权无向图,多次询问 \(L,R\),求能否选出一个边集,使得至少有 \(L\) 个连通块,至多有 \(R\) 个连通块,如果可以,求出这个边集里可能的最小边权的最大值。

容易发现 \(L\) 是基本全没啥用的。因为我们可以通过对这个边集把除了答案边之外的边一条条删去,肯定会增加连通块个数。

更加形式化一点,对于答案边 \((u,v,w)\),其所有的边 \((u_i,v_i,w_i)\) 若有 \(w_i\ge w\),则将其加入 \(E\) 中一定不影响答案。

假定全部加入这样的边后有 \(k\) 个连通块,那么我们显然可以通过这些边做到有 \([k,n-1]\) 个连通块。

证明:考虑加入所有边后,对各个连通块都求一颗生成树,其余非生成树边删去,那么我们可以任意断开一条非答案边都会使得答案不变且连通块个数增加一,最终可以做到只保留答案边,\(n-1\) 个连通块。

那就简单了,直接模仿 Kruskal 算法,将边权从大到小排序,依次加入,维护连通块个数。不妨设加入 \([1,i]\) 边后有 \(c_i\) 个连通块。

那就是找到第一个 \(\le R\) 的 \(c_i\),其 \(w_i\) 即为答案。找不到就无解。

\(O((n+q)\log n)\)

D

给定一棵树,最初全为白色,要求将至多 \(k\) 个点染为黑色,要求最终白色点对之间距离最大的最小。\(0\le k<n-2<n\le 1000\)

显然二分答案。

我们倒过来看最终局面,我们断言最终局面,所有白点定然是一个连通块。

证明:如果不是这样,考虑一个孤立的白点,将其染为黑色,然后将原白点连通块与该白点最长路径上遇到的第一个黑点变白,答案一定不会变差,因为以该白点为端点的所有路径的最大值定然比这个新的白点与连通块中点的所有路径最大值更大。对每个白点都进行这样的操作,最终一定会变成一个连通块。

那么假设二分答案为 \(mid\),我们要判断能否选出一个连通块,在满足直径不长于 \(mid\) 的情况下,大小为 \(n-k\)。

更强的信息:求出可以选出的最大大小的连通块。

不妨设 \(f_{u,i}\) 为在子树 \(u\) 内,包含 \(u\),最长链为 \(i\) 的合法连通块最大大小。

初始:\(f_{u,0}=1\)

转移:\(f'_{u,\max(i,j+1)}=\max(f_{u,\max(i,j+1)},(f_{u,i}+f_{v,j})[i+j+1\le mid])\)

然后所有可行的最大的 \(f_{i,j}\) 即为所求。

\(O(n^2\log n)\)。

code

说个需要注意的点:其实我们在二分 \(mid\) 后可以将所有距离 \(\ge mid\) 的点对全部连边,就是判断是否存在一个点覆盖,满足其大小 \(\le k\)。

也就是最小点覆盖问题。我因为把一般图最小点覆盖和二分图最小点覆盖搞混,打网络流吃了2罚时

E

暂时不会,感觉很生成函数(有点组合符号化的构造感觉)。MD我生成函数学的像个什么一样

F

给定一颗基环树,保证不是自环,每条边有边权,定义简单路径为 不经过重复边 的路径,定义路径权值为路径上所有边边权的异或和。

给定 \(k\),求所有下标差不超过 \(k\) 的点中,最大的路径权值是多少。

草了看成了不经过重复点,居然有75,恐怖如斯

首先如果是一棵树,我们直接预处理 \(dis_i\) 为根到 \(i\) 路径的权值,然后利用 \(trie\),记录一个最大时间戳直接查就完了,这是经典问题。

对于环的处理,我们先考虑第一类路径:顺时针走。

考虑选定环上一个点为起点,然后先对环做一个异或前缀和作为环上点的 \(dis\),然后对于环上各个点再跑 DFS 处理出各自点的 \(dis\) 即可。

那么如果一个点对,下标差不超过 \(k\),简单路径不过环,则直接查(也即按照 \(1\to n\) 将 \(dis_i\) 插入环中,同时查询 \([max(1,i-k),i]\) 的点作为点对)就行了。如果简单路径过环,直接查也可以处理出计算顺时针走法的答案。

这样就70了

然后我们考虑是不经过重复边的路径,那么我们考虑如何判断两点之间简单路径能否经过环,其实也就两种情况:

  1. 两个点分属环上不同点的子树里
  2. 两个点在环上同一点的子树里,但其LCA是这个点。

所以不妨设 \(top_u\) 为点 \(u\) 一直向上走,走到环上点的前一个点的编号(亦或者说是环上点的子树)。这个可以通过枚举环上点及其子树预处理出来。

那么 \(top_u\neq top_v\) 就是两个点之间简单路径可以路过环的充要条件。

不妨设整个环的边权异或和为 \(t\),则对于逆时针走环的情况,我们只需要对所有 \(top_j\neq top_i\) 的 \(j\),求 \(dis_j\oplus dis_i\oplus t\) 的最大值。

这个偏序关系仅仅只是一个不等关系,考虑在Trie上时,我们只是需要判断是否可以走那一棵子树。所以我们只在乎那颗子树里是否有点,满足其 \(top\) 不等于 \(top_i\),且编号 \(\ge i-k\)。

这个问题不用想得太复杂,我们对于Trie上,维护两个二元组 \((top,id)\)。要求两个 \(top\) 不相同,且 \(id\) 尽量小。

意思就是第一个二元组记录该子树里,出现时间最晚的点的 \(top\) 值以及出现时间。

第二个二元组记录该子树里,\(top\) 不同的出现时间最晚的点的 \(top\) 值以及出现时间。

这样查询就行了。

但是需要特判一下Trie里是否有合法解。

code

标签:连通,练习赛,环上,top,路径,白点,牛客,答案,127
From: https://www.cnblogs.com/spdarkle/p/18287048

相关文章

  • 牛客小白月赛97 A-D题解
    AAAAAAAAAAAAAAAAAAAAA-----------------------------题解-------------------------------------------统计数组中有没有出现三个相同的边即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;map<int,int>m;int......
  • [IOT2050 question] Unable to listen on http://127.0.0.1:1880/ 端口被占用错误
    1.背景第一次连接node-red的时候,一直出现错误Unabletolistenonhttp://127.0.0.1:1880/。如下:2.原因分析估计是早前利用iot2050setup小工具把node-red设置为开机自动启动项了,导致1880端口一直被占用。3.验证首先查看端口是否真的被占用,利用sudonetstat-ltup命......
  • (对结果分类讨论)牛客周赛 Round 1 C.游游的交换字符
    题意:思路:观察发现相邻元素不同的结果只有两种,要么是101010101...要么是010101010,因此我们可以对结果分类讨论。直接模拟算出两种情况最少需要操作多少次,再取min即可。需要注意的是,如果是奇数串,那么结果只有一种,数量多的一定要放两侧。code:#include<bits/stdc++.h>#includ......
  • 牛客周赛 Round 44
    A题每三张删除一张,n/3就是答案点击查看代码#include<bits/stdc++.h>#defineall(x)(x).begin(),(x).end()#definefifirst#definesesecondusingi64=longlong;usingpii=std::pair<int,int>;template<typenameT>std::vector<T>read(T&n......
  • 牛客周赛 Round 49 (D~F)
    嘤嘤不想求异或喵think:首先l和r的范围有1e18,我们能要到要么是二分(但这题显然和二分无关),所以我们尝试打表找规律.打表发现x是4的倍数,1~x的异或和应该是x,同理其他也是有规律的.#include<bits/stdc++.h>#definefifirst#definesesecond#defineintlonglongusin......
  • 牛客周赛 Round 49
    A题按题目输出即可#include<bits/stdc++.h>#defineall(x)(x).begin(),(x).end()#definefifirst#definesesecond#definelowbit(x)(x)&(-x)usingi64=longlong;usingpii=std::pair<int,int>;voidsolve(){i64a,b;std::cin>......
  • 牛客周赛49
    比赛链接:牛客周赛49赛时感受A思路    代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=1e5+10;intmain(){lla,b;cin>>a>>b;cout<<a-b*11<<endl;return0;}B思路......
  • localhost 和 127.0.0.1 有什么区别?
    当前端开发人员在本地调试时,他们经常与 localhost 互动,只需运行npmrun命令就可以在浏览器中打开他们的网页,地址栏显示类似于 http://localhost:xxx/index.html的内容。许多人在使用它时可能没有思考两者之间的区别。考虑到我过去与开发人员合作时他们也缺乏对这两者区别......
  • 【协同任务】多无人机协同任务【含Matlab源码 1273期】
    ......
  • 小程序+spring boot流浪动物救助系统 毕业设计-附源码12783
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,流浪动物救助系统被用户普遍使用,为方便用户能够可以随时进行在线查看校园志愿者的数据信息管理,特开发了流浪动物救助系......