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

假如已经确认了所有加入的边,那么我们可以通过类似 \(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. uni-app生命周期小测

    标签: js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. ...

  2. new Date()在ios下的坑

    坑位 最新在开发一个时间轴功能,在使用new Date()的时候发现在IOS下全是NaN. Why new Date("2018-04-27 11:11")在chrome,fire ...

  3. 圆梦:借助云开发 CloudBase实现你的游戏开发梦想

    最近我发现AI产品在不断涌现新动向,尤其是一些技术巨头推出的创新产品.例如,今天我们要探讨的是腾讯云开发的云开发 CloudBase,如果你之前没有听说过这个名字,那可能还记得腾讯云推出的另一个产品- ...

  4. VTK 平面裁剪

    有些时候需要显示零件内部情况,所有会对零件显示进行平面裁剪,这里用到了vtkPlane和vtkClipPolyData. vtkPlane是定义一个平面,vtkClipPolyData使用vtkPla ...

  5. ksmbd 条件竞争漏洞挖掘:思路与案例

    ksmbd 条件竞争漏洞挖掘:思路与案例 ksmbd 条件竞争漏洞挖掘:思路与案例.drawio 本文介绍从代码审计的角度分析.挖掘条件竞争.UAF 漏洞思路,并以 ksmbd 为实例介绍审计的过程和 ...

  6. windows安装gitbook并部署发布到openEuler欧拉服务器

    1. 安装nodejs10 下载安装nvm https://github.com/coreybutler/nvm-windows/releases/download/1.1.9/nvm-setup.e ...

  7. Gitbook在Docker中安装插件的方法

    别光在那百度,什么先book.json添加plugin,然后在install? 哥,你现在用的是docker哎,docker都启动不了,你如何gitbook install呢? 乖乖听我的,按我的方法 ...

  8. iOS Aliyun语音识别&语音合成

    Aliyun 语音识别&语音合成 导入 SDK 将ZIP包中的nuisdk.framework添加到工程中,并在工程Build Phases的Link Binary With Librarie ...

  9. startup

    要提取startup/后面的字符,可以使用cut命令或awk命令.以下是两种方法: 使用cut命令: bash #!/bin/bash # 给定的字符串 STR1="startup/valu ...

  10. File and Code template

    /** * @author muzhi.zhong * @author <a href="mailto:muzhi.z@xxx.cn">muzhi.z</a> ...