【CF603E】Pastoral Oddities

题意:有n个点,依次加入m条边权为$l_i$的无向边,每次加入后询问:当前图是否存在一个生成子图,满足所有点的度数都是奇数。如果有,输出这个生成子图中边权最大的边的权值最小可能是多少。

$n\le 10^5,m\le 10^6,l_i\le 10^9$

题解:可以证明如果存在一个生成子图满足所有点度数都是奇数,当且仅当所有连通块都有偶数个点。并且可以知道加边一定不会使答案更劣。正解有三种:1.LCT维护最小生成树;2.cdq分治(类似整体二分);3.线段树(类似按时间分治)。都比较神,本人采用了第二种。

官方题解:http://codeforces.com/blog/entry/21914

大神的第二种做法的题解:https://www.cnblogs.com/galaxies/p/cf603E.html

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
const int maxm=300010;
int f[maxn],g[maxn],siz[maxn],st[maxn],ans[maxm];
int n,m,cnt,top;
struct edge
{int a,b,c,tim;
}p[maxm],q[maxm];
bool cmp(const edge &a,const edge &b)
{return (a.c==b.c)?(a.tim<b.tim):(a.c<b.c);
}
inline void uni(int a,int b)
{int x=a,y=b,c=0,d=0;while(f[x]!=x)    x=f[x],c++;while(f[y]!=y)   y=f[y],d++;if(x==y)    return ;if(c>d)  swap(x,y),swap(a,b);cnt-=(siz[x]&1)+(siz[y]&1)-((siz[x]+siz[y])&1);siz[y]+=siz[x],f[x]=y;st[++top]=x;
}
inline void del(int x)
{int y=f[x];siz[y]-=siz[x],f[x]=x;cnt+=(siz[x]&1)+(siz[y]&1)-((siz[x]+siz[y])&1);
}
void solve(int l,int r,int L,int R)
{if(l>r) return ;int mid=(l+r)>>1,i,now=top,MID;for(i=l;i<=mid;i++)  if(p[i].c<=L)   uni(p[i].a,p[i].b);for(i=L;i<=R&&cnt;i++)    if(q[i].tim<=mid)   uni(q[i].a,q[i].b);MID=max(L,i-1);if(!cnt) ans[p[mid].tim]=q[MID].c;else  ans[p[mid].tim]=-1;while(top>now)   del(st[top--]);for(i=L;i<=MID;i++)   if(q[i].tim<=l) uni(q[i].a,q[i].b);solve(l,mid-1,MID,R);while(top>now)   del(st[top--]);for(i=l;i<=mid;i++)   if(p[i].c<=L)   uni(p[i].a,p[i].b);solve(mid+1,r,L,MID);while(top>now)  del(st[top--]);
}
inline int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')    f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd();int i;for(i=1;i<=m;i++) p[i].a=rd(),p[i].b=rd(),p[i].c=rd(),p[i].tim=i,q[i]=p[i];sort(q+1,q+m+1,cmp);for(i=1;i<=n;i++)   f[i]=i,siz[i]=1;for(i=1;i<=m;i++)  p[q[i].tim].c=i;cnt=n;solve(1,m,1,m);for(i=1;i<=m;i++) printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/8595001.html

【CF603E】Pastoral Oddities cdq分治+并查集相关推荐

  1. CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

    题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...

  2. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)

    题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...

  3. 【XSY2469】graph 分治 并查集

    题目大意 给你一张\(n\)个点\(m\)条边的无向图,问删去每个点后,原图是不是二分图. \(n,m\leq 100000\) 题解 一个图是二分图\(\Longleftrightarrow\)该图 ...

  4. 越野赛车问题——线段树分治+并查集

    题目 [题目描述] 小 $H$ 是一位优秀的越野赛车女选手.现在她准备在 $A$ 山上进行赛车训练. $A$ 山上一共有 $n$ 个广场,编号依次为 $1$ 到 $n$ ,这些广场之间通过 $n-1$ ...

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  6. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

    对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...

  7. bzoj4025-二分图【线段树分治,并查集】

    正题 题目链接:https://darkbzoj.tk/problem/4025 题目大意 nnn个点mmm条边,每条边会在一个TTT以内的时间段内出现,对于任意一个TTT以内的时刻求图是否是一个二分 ...

  8. Codeforces 1140F 线段树 分治 并查集

    题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...

  9. CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点,没有边. 依次加入mmm条带权的边,每次加入后询问是否存在一个边集,满足每 ...

最新文章

  1. windows部署微服务jar包 yml_杰克布开源项目,低代码开发框架,Docker快速部署
  2. 软工作业3: 词频统计
  3. 结合EM快速解决复杂的配置问题
  4. Windows PE变形练手1-用PE自己的机器码修改自己的逻辑
  5. [转载] 中华典故故事(孙刚)——07 二百五
  6. html的meta用法
  7. java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数
  8. MySQL的IFNULL() 函数使用
  9. python网格搜索法_Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据...
  10. 如何开始Java机器学习
  11. 安装新版的winetricks_20170506-最新WineQQ8.9.1安装教程和常见问题解决方法
  12. linux加密狗复制克隆教程,[求助]如何复制使用U盘做的加密狗
  13. 将多张图片合并为一张图片
  14. mysql全量备份命令_linux下进行定时mysql数据库全量备份
  15. php在线生成logo,logo在线生成 php在线生成ico文件的代码
  16. 三相全桥整流电路_三相全波整流电路原理?
  17. 推荐系统-协同过滤在Spark中的实现
  18. python定义一个triangle类_Python定义一个三角形类Python学习阶段综合练习2,python,triangle,二...
  19. 为什么amd显卡便宜却买的人少_为什么不推荐人选择AMD?
  20. JAVA实现生成原生二维码并上传至阿里云

热门文章

  1. vue事件委托传递节点防止向下传递穿透
  2. 移动端实现hover效果
  3. abap 转换成字符串_ABAP--关于字符串String到XString XString to String转换代码
  4. createprocess失败代码2_DevOPS | 基于sonarqube、jenkins和gitlab的持续集成代码检查
  5. CORS 请求未能成功_当遇到跨域开发时, 我们如何处理好前后端配置和请求库封装(koa/axios版)...
  6. android无感刷新下拉分页,GitHub - TakWolf/Android-RefreshAndLoadMore-Demo: 一种简单的并且优雅的方式实现下拉刷新和加载更多的分页效果。...
  7. 新概念英语第二册课文电子版_新概念英语第二册课文学生(Victoria)朗读
  8. Jmeter之逻辑控制器(Logic Controller)
  9. Markdown简单上手
  10. web前端开发怎么样学习?看这份web前端学习路线