注意力惊人的注意到我们可以将问题转化为所有联通块大小全部为偶数。

假如已经确认了所有加入的边,那么我们可以通过类似 \(K\) 算法的方式求解。

考虑到答案单调不升,所以每条边都有一个影响的区间。考虑线段树分治。

我们倒序枚举,遇到要加入的边,若当前时间为 \(t\),边的加入时间为 \(t'\),则我们让 \([t',t)\) 这一段区间都连这条边。由于答案单调不升(倒序就是单调不减),所以可以用类似双指针的思路将枚举加边的时间复杂度降到 \(O(m)\)。之后就是经典线段树分治了。

时间复杂度 \(O(n\log n\log m)\)。

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,m,k,fa[N],sz[N],ans[N];
struct mer{
int sz,x,y,dod;
};stack<mer>st;
struct ed{
int x,y,v,id;
}e[N];int ps,od;
vector<ed>g[4*N];
int cmp(ed x,ed y){
return x.v<y.v;
}inline void init(){
for(int i=1;i<=n;i++)
fa[i]=i,sz[i]=1;
}inline int find(int x){
return fa[x]==x?x:find(fa[x]);
}inline void unite(int x,int y){
x=find(x),y=find(y);
if(x==y) return;int fl=0;
if(sz[x]<sz[y]) swap(x,y);
if(sz[x]%2&&sz[y]%2) fl=2;
st.push({sz[x],x,y,fl});
fa[y]=x,sz[x]+=sz[y],od-=fl;
}inline void chg(int x,int l,int r,int L,int R,ed e){
if(L>R) return;
if(L<=l&&r<=R){
g[x].push_back(e);
return;
}int mid=(l+r)/2;
if(L<=mid) chg(x*2,l,mid,L,R,e);
if(R>mid) chg(x*2+1,mid+1,r,L,R,e);
}inline void solve(int x,int l,int r){
int ltp=st.size();
for(auto eg:g[x]) unite(eg.x,eg.y);
int mid=(l+r)/2;
if(l==r){
while(od&&ps<m){
if(e[ps+1].id<=l){
unite(e[ps+1].x,e[ps+1].y);
chg(1,1,m,e[ps+1].id,l-1,e[ps+1]);
}ps++;
}ans[l]=(!od?e[ps].v:-1);
}else solve(x*2+1,mid+1,r),solve(x*2,l,mid);
while(st.size()>ltp){
mer x=st.top();st.pop();
fa[x.y]=x.y,sz[x.x]=x.sz,od+=x.dod;
}
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m,od=n,init();
for(int i=1;i<=m;i++)
cin>>e[i].x>>e[i].y>>e[i].v,e[i].id=i;
sort(e+1,e+m+1,cmp),solve(1,1,m);
for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";
return 0;
}

[CF603E] Pastoral Oddities 题解的更多相关文章

  1. CF603E Pastoral Oddities

    CF603E Pastoral Oddities 度数不好处理.转化题意:不存在连通块为奇数时候就成功了(自底向上调整法证明) 暴力:从小到大排序加入.并查集维护.全局变量记录奇数连通块的个数 答案单 ...

  2. CF603E Pastoral Oddities 优先队列+结论+LCT维护生成树

    首先,一个神奇的结论:一个合法的方案存在的条件是每一个联通块的节点数都是偶数个的. 这个可以用数学归纳法简单证一证. 证出这个后,我们只需动态加入每一个边,并查看一下有哪些边能够被删除(删掉后联通块依 ...

  3. 【CF603E】Pastoral Oddities cdq分治+并查集

    [CF603E]Pastoral Oddities 题意:有n个点,依次加入m条边权为$l_i$的无向边,每次加入后询问:当前图是否存在一个生成子图,满足所有点的度数都是奇数.如果有,输出这个生成子图 ...

  4. Codeforces603E - Pastoral Oddities

    Portal Description 初始时有\(n(n\leq10^5)\)个孤立的点,依次向图中加入\(m(m\leq3\times10^5)\)条带权无向边.使得图中每个点的度数均为奇数的边集是 ...

  5. Codeforces 603E Pastoral Oddities

    传送门:http://codeforces.com/problemset/problem/603/E [题目大意] 给出$n$个点,$m$个操作,每个操作加入一条$(u, v)$长度为$l$的边. 对 ...

  6. cf Round 603

    A.Alternative Thinking(思维) 给出一个01串,你可以取反其中一个连续子串,问取反后的01子串的最长非连续010101串的长度是多少. 我们随便翻一个连续子串,显然翻完之后,对于 ...

  7. usaco training 4.2.4 Cowcycles 题解

    Cowcycles题解 Originally by Don Gillies [International readers should note that some words are puns on ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  10. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. git 推送代码到多个 远端仓库

    业务场景 在开发代码时,有时希望将代码推送到两个远端仓库. 实现方法 git remote add origin giturl1 git remote add backup giturl2 git p ...

  2. 使用 wireshark 捕获 请求包

    1.出错场景 今天遇到一个问题,在用户登录时,发现用户在登录的时候,一个用户登录正常,一个用户登录报错,报错的原因时400错误,分析对比发现一个用户的分配用户组多,一个分配的少,其中多的那个出错了. ...

  3. Ant Design Pro项目一初始化就报a标签嵌套a标签错误<a> cannot as a descendant of <a>

    前情 公司经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案. 坑位 按官方文挡一步步下来,项 ...

  4. 【Amadeus原创】更改域控域用户密码过期日期时间

    1,打开服务管理器,点工具,选择Active Directory 管理中心 2,右键域名(本地)-属性 3,选择属性编辑器,把maxPwdAge 从90天改成180天.

  5. 对 .NET 开发者来说,Azure AD 改名为 Microsoft Entra ID 意味着什么?

    对 .NET 开发者来说,Azure AD 改名为 Microsoft Entra ID 意味着什么? 原文地址:https://devblogs.microsoft.com/dotnet/azure ...

  6. TeamViewer 的替代品 ZeroTier + NoMachine

    之前不怎么用 TeamViewer,最近用的多了,特别好用,有点上瘾,在哪儿都能连家里的 RTX,太棒了. 然后它就开始作了. 有没有好的替代方案呢?有人推荐向日葵,向日葵显然是以盈利为目的的我不想再 ...

  7. Vulnhub经典靶机:from_sqli_to_shell_i386入门靶机

    靶机官网: https://www.vulnhub.com/entry/pentester-lab-from-sql-injection-to-shell,80/ 靶机镜像ISO下载地址:(转链) f ...

  8. Qt编写地图综合应用10-点聚合

    一.前言 点聚合在地图相关应用中比较常用,比如在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症,密密麻麻的一大堆点 ...

  9. [转]idea中创建maven的Javaweb工程并进行配置(图文教程)

    原文链接: idea中创建maven的Javaweb工程并进行配置(图文教程)

  10. C#中字符串格式化string.Forma中需要使用t转义字符的情况处理

    此处汇总一下C#中字符串格式化string.Forma中需要使用t转义字符的情况处理. 1.C# string.Format() 方法中占位大括号的外面还有大括号,此时就需要使用转义大括号{}. 处理 ...