CF603E Pastoral Oddities

度数不好处理。转化题意:不存在连通块为奇数时候就成功了(自底向上调整法证明)

暴力:从小到大排序加入。并查集维护。全局变量记录奇数连通块的个数

答案单调不增?

类似整体二分。(其实类似决策单调性)

横纵劈开,提前加入不会影响的边,复杂度得以保证

按秩合并并查集撤销

值域的访问,不用每次排序,答案一定是某个边的边权,提前排好序。直接访问即可

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const int M=+;
int n,m;
struct node{
int a,b,c;
int id;
bool friend operator <(node a,node b){
return a.c<b.c;
}
}q[M],p[M];
int fa[N],sz[N];
struct po{
int x,y,del;
po(){}
po(int xx,int yy,int dd){
x=xx;y=yy;del=dd;
}
}sta[M];
int top;
int odd;
int ans[M];
int fin(int x){
return fa[x]==x?x:fin(fa[x]);
}
void merge(int x,int y){
x=fin(x),y=fin(y);
if(x==y) return;
if(sz[x]>sz[y]) swap(x,y);
po now=po(x,y,);
if((sz[x]&)&&(sz[y]&)){
now.del=;
odd-=;
}
sta[++top]=now;
fa[x]=y;
sz[y]+=sz[x];
}
void dele(){
po now=sta[top];
odd+=now.del;
sz[now.y]-=sz[now.x];
fa[now.x]=now.x;
--top;
}
void divi(int l,int r,int lo,int hi){
if(l>r) return;
// cout<<" divi "<<l<<" "<<r<<" : "<<lo<<" "<<hi<<endl;
int las=top;
//cout<<" las "<<las<<endl;
int mid=(l+r)>>;
int ans_mid=-;
for(reg i=l;i<=mid;++i){
if(q[i].id<lo) merge(q[i].a,q[i].b);
}
for(reg i=lo;i<=hi;++i){
if(p[i].id<=mid) merge(p[i].a,p[i].b);
if(odd==) {
ans_mid=i;break;
}
}
while(top!=las) dele(); //cout<<mid<<" ans_mid "<<ans_mid<<endl;
if(ans_mid==-){
for(reg i=l;i<=mid;++i) ans[i]=-;
for(reg i=l;i<=mid;++i){
if(q[i].id<lo) merge(q[i].a,q[i].b);
}
divi(mid+,r,lo,hi);
while(top!=las) dele();
return;
}
ans[mid]=p[ans_mid].c; for(reg i=lo;i<ans_mid;++i){
if(p[i].id<l) merge(p[i].a,p[i].b);
}
divi(l,mid-,ans_mid,hi);
while(top!=las) dele(); for(reg i=l;i<=mid;++i){
if(q[i].id<lo) merge(q[i].a,q[i].b);
}
divi(mid+,r,lo,ans_mid);
while(top!=las) dele(); }
int main(){
rd(n);rd(m);
odd=n;
if(n&){
for(reg i=;i<=m;++i){
puts("-1");
}return ;
}
for(reg i=;i<=m;++i){
rd(q[i].a);rd(q[i].b);rd(q[i].c);
p[i]=q[i];p[i].id=i;
}
sort(p+,p+m+);
for(reg i=;i<=m;++i) q[p[i].id].id=i;
for(reg i=;i<=n;++i) fa[i]=i,sz[i]=;
divi(,m,,m);
for(reg i=;i<=m;++i){
printf("%d\n",ans[i]);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/5 19:27:14
*/

从整体入手,发现答案不增。类似二分缩小范围。不会影响答案的边提前加上减少复杂度。

CF603E Pastoral Oddities的更多相关文章

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

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

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

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

  3. Codeforces603E - Pastoral Oddities

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

  4. Codeforces 603E Pastoral Oddities

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

  5. cf Round 603

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

  6. 【做题】cf603E——线段树分治

    首先感谢题解小哥,他在标算外又总结了三种做法. 此处仅提及最后一种做法. 首先考虑题目中要求的所有结点度数为奇数的限制. 对于每一个联通块,因为所有结点总度数是偶数,所以总结点数也必须是偶数的.即所有 ...

  7. CF603EPastoral Oddities

    /* LCT管子题(说的就是你 水管局长) 首先能得到一个结论, 那就是当且仅当所有联通块都是偶数时存在构造方案 LCT动态加边, 维护最小生成联通块, 用set维护可以删除的边, 假如现在删除后不影 ...

  8. ccpc 2018 final G - Pastoral Life in Stardew Valley

    #include <iostream> #include<cstdio> #include<cstring> #include<queue> using ...

  9. On having layout

    英文原文在此:http://www.satzansatz.de/cssd/onhavinglayout.htm 介绍 Internet Explorer 中有很多奇怪的渲染问题可以通过赋予其“layo ...

随机推荐

  1. 一文让你完全弄懂Stegosaurus

    国内关于 Stegosaurus 的介绍少之又少,一般只是单纯的工具使用的讲解之类的,并且本人在学习过程中也是遇到了很多的问题,基于此种情况下写下此文,也是为我逝去的青春时光留个念想吧~ Stegos ...

  2. Redis常见问题和解决办法梳理

    =============Redis主从复制问题和解决办法 ================= 一.Redis主从复制读写分离问题 1)数据复制的延迟读写分离时,master会异步的将数据复制到sla ...

  3. pair project elevator

    结对编程——电梯调度 12061181 高孟烨 12061182 郝倩 1.结对编程的优缺点: 优点:结对编程可以结合两个人各自擅长之地,充分发挥两个人各自的优势,两个人一起合作效率会更高.一份工作两 ...

  4. Week 2 代码规范

    Question 1: 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. My opinion: 我认为恰恰相反,这个可以提高人们的开发效率. 在团队合作当中,如果 ...

  5. Leetcode——171.宝石与石头

    水题: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符 ...

  6. 推广App篇

    推广App篇 团队github地址:https://github.com/ouqifeng/EasyGoOperation.git 在完成该项目工程后,我们开始寻找合适的方法推广我们的软件. 经过一番 ...

  7. CI框架--数据库Query_Builder中的方法

    下面是DB_Query_Builder.php中,各个方法的声明: 选择字段(select) public function select($select = '*', $escape = NULL) ...

  8. NODE中解决跨域请求的问题

    1.Node Express 解决请求跨域请求 标签(空格分隔): 跨域 1是Access-Control-Allow-Origin 允许的域 2是Access-Control-Allow-Heade ...

  9. Mordern Effective C++ --auto

    5. 优先使用auto而非显示类型声明 在C++之中,使用auto关键字声明类型可以将程序员从输入繁琐的类型中解放出来,编译器会自动推导出变量的实际类型. template<typename I ...

  10. Java中的浮点型(Double&Float)计算问题

    在刚刚做完的一个项目中,遇到了double型计算不精确的问题.到网上查找后,问题得到解决.经验共享,在这里总结一下. Java中的浮点数类型float和double不能够进行精确运算.这个问题有时候非 ...