当前位置:网站首页>CF603E Pastoral Oddities
CF603E Pastoral Oddities
2022-07-30 13:17:00 【心怀凉月】
CF603E Pastoral Oddities
存在这样满足每个点的度数均为奇数的边集,充分条件是连通块的点数为偶数。
先考虑必要性,加入一边度数和增加 2 2 2 故度数和为偶数,而当满足条件的连通块点数为奇时,度数和必为奇数,矛盾。
证明充分性:对于一个偶数大小的连通块,找出其一棵生成树,从叶子开始根据连向儿子的度数考虑是否添加其到父亲的边,逐步满足,最后除了根之外都满足条件,显然根据奇偶性根也满足条件,故充分性保证。
故用一个按秩合并并查集即可维护连通块是否满足条件。
再考虑边集中的最大边权最小的限制,一棵最小生成树足矣。
在线 LCT 维护最小生成树森林,时间复杂度 O ( n log n ) \mathcal O(n\log n) O(nlogn)。
但非常难写且常数巨大,考虑离线做法。
观察样例得知,时间升序,答案单调递减;还有“最大值最小”一类的词,考虑二分。
多次询问,考虑整体二分。
具体地,离散化权值,再对权值分治,令其为 m i d mid mid。
添加权值 ≤ m i d \leq mid ≤mid 的边直到合法,根据第一个合法的位置分治。
注意细节,整体二分后面的状态 ( l , r , v l , v r ) (l,r,vl,vr) (l,r,vl,vr) 需要并查集中含有所有编号 ≤ l \leq l ≤l 且权值 ≤ v l \leq vl ≤vl 的边,考虑维护一个可撤销并查集即可。
时间复杂度 O ( m log m log n ) \mathcal O(m\log m\log n) O(mlogmlogn)。
#include<cstdio>
#include<algorithm>
typedef long long ll;
#define ha putchar(' ')
#define he putchar('\n')
inline int read() {
int x = 0;
char c = getchar();
while (c < '0' || c > '9')
c = getchar();
while (c >= '0' && c <= '9')
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
inline void write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9)
write(x / 10);
putchar(x % 10 + 48);
}
const int _ = 3e5 + 5;
int n, m, cnt, fa[_], sz[_], t, s[_], ans[_];
struct abc {
int u, v, w, id;
bool operator < (const abc &t) {
return w < t.w;
}
} e[_], b[_];
int find(int x) {
return fa[x] == x ? x : find(fa[x]);
}
void merge(int u, int v) {
u = find(u), v = find(v);
if (u == v) return;
if (sz[u] < sz[v]) std::swap(u, v);
if ((sz[u] & 1) && (sz[v] & 1)) cnt -= 2;
sz[u] += sz[v], fa[v] = u, s[++t] = v;
}
void ers(int lim) {
while (t > lim) {
int v = s[t--], u = fa[v];
fa[v] = v, sz[u] -= sz[v];
if ((sz[u] & 1) && (sz[v] & 1)) cnt += 2;
}
}
void solve(int l, int r, int vl, int vr) {
if (l > r || vl > vr) return;
if (vl == vr) {
for (int i = l; i <= r; ++i) ans[i] = b[vl].w;
return;
}
int mid = (vl + vr) >> 1, nw = t;
for (int i = vl; i <= mid; ++i)
if (b[i].id < l) merge(b[i].u, b[i].v);
int Id = r + 1, nw2 = t;
for (int i = l; i <= r; ++i) {
if (e[i].w <= b[mid].w) merge(e[i].u, e[i].v);
if (!cnt) {
Id = i;
break;
}
}
ers(nw2);
solve(l, Id - 1, mid + 1, vr);
ers(nw);
for (int i = l; i < Id; ++i)
if (e[i].w <= b[vl].w) merge(e[i].u, e[i].v);
solve(Id, r, vl, mid);
ers(nw);
}
signed main() {
n = cnt = read(), m = read();
for (int i = 1; i <= n; ++i) fa[i] = i, sz[i] = 1;
for (int i = 1; i <= m; ++i) {
e[i].u = read(), e[i].v = read(), e[i].w = read();
e[i].id = i, b[i] = e[i];
}
std::sort(b + 1, b + m + 1);
b[m + 1].w = -1;
solve(1, m, 1, m + 1);
for (int i = 1; i <= m; ++i) write(ans[i]), he;
}
边栏推荐
- Dolphinscheduler stand-alone transformation
- no matching host key type found. Their offer: ssh-rsa
- 湖仓一体电商项目(一):项目背景和架构介绍
- dolphinscheduler simple task definition and complex cross-node parameter transfer
- datax开启hana支持以及dolphinscheduler开启datax任务
- 【软考软件评测师】自动化测试章节下篇
- Lake storehouse which electricity (2) of the project: project using technology and version and the environment
- datax enables hana support and dolphinscheduler enables datax tasks
- 手撕读写锁性能测试
- R语言ggstatsplot包grouped_ggwithinstats函数可视化分组小提琴图、并添加假设检验结果(包含样本数、统计量、效应大小及其置信区间、显著性、组间两两比较、贝叶斯假设)
猜你喜欢
随机推荐
Go 事,Gopher 要学的数字类型,变量,常量,运算符 ,第2篇
ML之PDP:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用DT决策树&RF随机森林+PDP部分依赖图可视化实现模型可解释性之详细攻略
PyQt5快速开发与实战 8.6 设置样式
树形dp小总结(换根,基环树,杂七杂八的dp)
【23考研】408代码题参考模板——顺序表
R语言ggpubr包的ggboxplot函数可视化分组箱图、自定义移除可视化图像的特定对象(移除可视化图像轴坐标轴的刻度线标签文本、both x and y axis ticks labels)
缓存
jsArray array copy method performance test 2207292307
shell script flow control statement
Markdown 3 - 流程图表
Tutorial on using the one-key upgrade function of the RTSP/Onvif video platform EasyNVR service
浅析TSINGSEE智能视频分析网关的AI识别技术及应用场景
打破原则引入SQL,MongoDB到底想要干啥???
Why is Prometheus a monitoring artifact sufficient to replace Zabbix?
R语言时间序列数据算术运算:使用log函数将时间序列数据的数值对数化(平方、开平方、指数化等函数类似使用)
逻辑漏洞----权限类漏洞
dolphinscheduler simple task definition and complex cross-node parameter transfer
元宇宙的六大支撑技术
Hu-cang integrated e-commerce project (1): project background and structure introduction
第十四天笔记









