BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)

Description

Input

Output

Sample Input

4 5
1 2
2 3
3 4
4 1
2 4
3
1 5
2 2 3
2 1 2

Sample Output

Connected
Disconnected
Connected

HINT

N<=100000 M<=200000 K<=100000

Solution

线段树分治,根据询问把每条边存在的时间区间拆成几个区间,然后覆盖到线段树上,最后$DFS$一遍线段树。用带撤销的并查集维护一下连通块个数,到线段树叶子节点的时候根据连通块个数输出答案。

常数有点大……离$TLE$只有$0.3s$……在被卡的边缘疯狂试探……

Code

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #define N (100009)
 5 using namespace std;
 6 
 7 int n,cnt,m,q,top,u[N<<1],v[N<<1];
 8 int fa[N],dep[N];
 9 pair<int,int>stack[N];
10 vector<int>p[N<<1],Segt[N<<2];
11 
12 char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
13 #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
14 
15 inline int read()
16 {
17     int x=0,w=1; char c=getchar();
18     while (c<'0' || c>'9') {if (c=='-') w=-1; c=getchar();}
19     while (c>='0' && c<='9') x=x*10+c-'0', c=getchar();
20     return x*w;
21 }
22 
23 void Update(int now,int l,int r,int l1,int r1,int k)
24 {
25     if (l>r1 || r<l1) return;
26     if (l1<=l && r<=r1) {Segt[now].push_back(k); return;}
27     int mid=(l+r)>>1;
28     Update(now<<1,l,mid,l1,r1,k); Update(now<<1|1,mid+1,r,l1,r1,k);
29 }
30 
31 int Find(int x)
32 {
33     return x==fa[x]?x:Find(fa[x]);
34 }
35 
36 void DFS(int now,int l,int r)
37 {
38     int mid=(l+r)>>1,tmp=top;
39     for (int i=0; i<Segt[now].size(); ++i)
40     {
41         int x=u[Segt[now][i]],y=v[Segt[now][i]];
42         int fx=Find(x),fy=Find(y);
43         if (fx==fy) continue;
44         if (dep[fx]>dep[fy]) swap(fx,fy);
45         fa[fx]=fy; dep[fy]+=(dep[fx]==dep[fy]); cnt--;
46         stack[++top]=make_pair(fx,fy);
47     }
48     if (l<r) DFS(now<<1,l,mid), DFS(now<<1|1,mid+1,r);
49     else puts(cnt==1?"Connected":"Disconnected");
50     for (int i=top; i>tmp; --i)
51     {
52         int fx=stack[i].first,fy=stack[i].second;
53         fa[fx]=fx; dep[fy]-=(dep[fx]==dep[fy]); cnt++;
54     }
55     top=tmp;
56 }
57 
58 int main()
59 {
60     n=cnt=read(); m=read();
61     for (int i=1; i<=n; ++i) fa[i]=i, dep[i]=1;
62     for (int i=1; i<=m; ++i) u[i]=read(), v[i]=read();
63     q=read();
64     for (int i=1; i<=q; ++i)
65     {
66         int c=read();
67         for (int j=1; j<=c; ++j) p[read()].push_back(i);
68     }
69     for (int i=1; i<=m; ++i)
70     {
71         p[i].push_back(q+1);
72         int last=1;
73         for (int j=0; j<p[i].size(); ++j)
74             Update(1,1,q,last,p[i][j]-1,i), last=p[i][j]+1;
75     }
76     DFS(1,1,q);
77 }

转载于:https://www.cnblogs.com/refun/p/10521591.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 像处理方面** 像识别、像分割、像检测、像隐藏、像配准、像拼接、像融合、像增强、像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值