Description

N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数。

Input

第一行四个整数N、M、K、type,代表点数、边数、询问数以及询问是否加密。
接下来M行,代表图中的每条边。
接下来K行,每行两个整数L、R代表一组询问。对于type=0的测试点,读入的L和R即为询问的L、R;对于type=1的测试点,每组询问的L、R应为L xor lastans和R xor lastans。

Output

K行每行一个整数代表该组询问的联通块个数。

Sample Input

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

Sample Output

2
1
3
1

HINT

对于100%的数据,1≤N、M、K≤200,000。

Solution

$namespace$真是个好东西QAQ

每次往里加边,如果构成环的话就把最早的那条边删掉,这个可以用$LCT$随便做。

定义一个数组$Early[i]$,表示加第$i$条边的时候,会把哪条边删掉。

特殊的,如果不删边,$Early[i]=0$。如果第$i$条边是自环,$Early[i]=i$。

然后对$Early$数组建主席树,每次询问的答案就是$[l,r]$区间内小于等于$l-1$的数个个数。

正确性……如果一条边$i$的$Early[i]$在$l$后面的话,那么加入$i$的时候,因为会产生环所以不会对连通块情况产生影响。否则如果$Early[i]$在$l$的前面的话,加入$i$就会对连通块情况产生影响……

大体就是这样子具体我也不会

Code

 #include<iostream>
#include<cstdio>
#define N (400009)
using namespace std; int n,m,k,opt,Early[N],x[N],y[N]; namespace LCT
{
int Father[N],Son[N][],Val[N],Min[N],Rev[N]; int Get(int x)
{
return Son[Father[x]][]==x;
}
int Is_root(int x)
{
return Son[Father[x]][]!=x && Son[Father[x]][]!=x;
}
void Pushup(int x)
{
Min[x]=x;
int ls=Son[x][],rs=Son[x][];
if (Val[Min[ls]]<Val[Min[x]]) Min[x]=Min[ls];
if (Val[Min[rs]]<Val[Min[x]]) Min[x]=Min[rs];
}
void Pushdown(int x)
{
if (Rev[x])
{
Rev[Son[x][]]^=;
Rev[Son[x][]]^=;
swap(Son[x][],Son[x][]);
Rev[x]=;
}
}
void Rotate(int x)
{
int wh=Get(x);
int fa=Father[x],fafa=Father[fa];
if (!Is_root(fa)) Son[fafa][Son[fafa][]==fa]=x;
Father[fa]=x; Son[fa][wh]=Son[x][wh^];
if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
Father[x]=fafa; Son[x][wh^]=fa;
Pushup(fa); Pushup(x);
}
void Push(int x)
{
if (!Is_root(x)) Push(Father[x]);
Pushdown(x);
}
void Splay(int x)
{
Push(x);
for (int fa; !Is_root(x); Rotate(x))
if (!Is_root(fa=Father[x]))
Rotate(Get(fa)==Get(x)?fa:x);
}
void Access(int x)
{
for (int y=; x; y=x,x=Father[x])
Splay(x), Son[x][]=y, Pushup(x);
}
void Make_root(int x)
{
Access(x); Splay(x); Rev[x]^=;
}
int Find_root(int x)
{
Access(x); Splay(x);
while (Son[x][]) x=Son[x][];
return x;
}
void Link(int x,int y)
{
Make_root(x); Father[x]=y;
}
void Cut(int x,int y)
{
Make_root(x); Access(y); Splay(y);
Son[y][]=Father[x]=; Pushup(y);
}
int Query(int x,int y)
{
Make_root(x); Access(y); Splay(y);
return Min[y];
}
void Build_Early()
{
for (int i=; i<=m; ++i) Val[n+i]=i;
for (int i=; i<=n; ++i) Val[i]=2e8,Min[i]=i;
for (int i=; i<=m; ++i)
{
scanf("%d%d",&x[i],&y[i]);
if (x[i]==y[i]) {Early[i]=i; continue;}
if (Find_root(x[i])!=Find_root(y[i]))
Link(x[i],i+n), Link(y[i],i+n);
else
{
int p=Query(x[i],y[i]);
Early[i]=p-n;
Cut(x[p-n],p); Cut(y[p-n],p);
Link(x[i],i+n); Link(y[i],i+n);
}
}
}
} namespace Sgt
{
struct Sgt{int ls,rs,val;}Segt[N*];
int sgt_num,Root[N]; int Update(int pre,int l,int r,int x)
{
int now=++sgt_num;
Segt[now]=Segt[pre];
Segt[now].val++;
if (l==r) return now;
int mid=(l+r)>>;
if (x<=mid) Segt[now].ls=Update(Segt[now].ls,l,mid,x);
else Segt[now].rs=Update(Segt[now].rs,mid+,r,x);
return now;
}
int Query(int u,int v,int l,int r,int l1,int r1)
{
if (l>r1 || r<l1) return ;
if (l1<=l && r<=r1) return Segt[v].val-Segt[u].val;
int mid=(l+r)>>;
return Query(Segt[u].ls,Segt[v].ls,l,mid,l1,r1)+Query(Segt[u].rs,Segt[v].rs,mid+,r,l1,r1);
}
void Solve()
{
for (int i=; i<=m; ++i)
Root[i]=Update(Root[i-],,2e5,Early[i]);
int ans=,l,r;
for (int i=; i<=k; ++i)
{
scanf("%d%d",&l,&r);
if (opt) l^=ans, r^=ans;
ans=n-Query(Root[l-],Root[r],,2e5,,l-);
printf("%d\n",ans);
}
}
} int main()
{
scanf("%d%d%d%d",&n,&m,&k,&opt);
LCT::Build_Early();
Sgt::Solve();
}

BZOJ3514:GERALD07加强版(LCT,主席树)的更多相关文章

  1. [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2177  Solved: 834 ...

  2. 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树

    题解: 还是比较简单的 首先我们的思路是 确定起点 然后之后贪心的选择边(也就是越靠前越希望选) 我们发现我们只需要将起点从后向前枚举 然后用lct维护连通性 因为强制在线,所以用主席树记录状态就可以 ...

  3. BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1312  Solved: 501 ...

  4. BZOJ 3514: Codechef MARCH14 GERALD07加强版( LCT + 主席树 )

    从左到右加边, 假如+的边e形成环, 那么记下这个环上最早加入的边_e, 当且仅当询问区间的左端点> _e加入的时间, e对答案有贡献(脑补一下). 然后一开始是N个连通块, 假如有x条边有贡献 ...

  5. BZOJ 3514 GERALD07加强版 (LCT+主席树)

    题目大意:给定n个点m条边无向图,每次询问求当图中有编号为[L,R]的边时,整个图的联通块个数,强制在线 神题!(发现好久以前的题解没有写完诶) 我们要求图中联通块的个数,似乎不可搞啊. 联通块个数= ...

  6. GERALD07加强版:lct,主席树,边化点

    Description:N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 传送门. lct这么神仙的东西一个题解都不写怎么行??? 神仙思路啊. 其实不是很难但是的确不容 ...

  7. BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT

    BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. I ...

  8. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  9. bzoj3514 Codechef MARCH14 GERALD07加强版 lct预处理+主席树

    Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1951  Solved: 746[Submi ...

随机推荐

  1. java 对CSV 文件的读取与生成

    CSV文件是以逗号分隔值的文件格式,一般用WORDPAD或记事本(NOTE),EXCEL打开.CSV(逗号分隔值)是一种用来存储数据的纯文本文件,通常都是用于存放电子表格或数据的一种文件格式,对于CS ...

  2. gRPC的通讯过程

    在 HTTP2 协议正式开始工作前, 如果已经知道服务器是 HTTP2 的服务器, 通讯流程如下: 客户端必须首先发送一个连接序言,其逻辑结构: PRI * HTTP/2.0\r\n\r\nSM\r\ ...

  3. PL/SQL Developer 如何记住密码

    前言:使用时总结一下. 问题: 登录的时候不想每次都输入密码,能记住最好了. 解决方案: 1.点击配置->首选项 2.选择登录历史,勾上带口令存储,然后应用,确定即可.

  4. JSP学习笔记(1)-JSP简介

    1.什么是JSP? JSP是Java server page的缩写,有sun公司倡导,许多公司参与,于1999年推出的一种web服务设计标准.JSP基于Java Servlet以及整个java体系的W ...

  5. centos7下更新firefox

    下载最新版firefox 1.点击三条线-问号-firefox帮助-安装和更新-linux安装-系统和语言下载 保存到指定目录,比如home下 2.解压 tar xjf firefox-*.tar.b ...

  6. Spring学习手札(一)

    Spring能做什么 1. 能根据配置文件创建及组装对象之间的依赖关系: 2. 面向切面编程,能帮助我们无耦合的实现日志记录,性能统计,安全控制等: 3. 提供第三方数据访问框架(如Hibernate ...

  7. JXU1NDRBJXU0RTJBJXU1MjJCJXU1NDI3

    U2FsdGVkX19f62S3+iSZxxJBADqNOfYV6/XumpnG7VwzMlQz7T7SaFsjyQx9d4PWAYQwtmgr4T9wDGKnKJCrR0veUEul6Uj4mEkN ...

  8. HDU4336 Card Collector(期望 状压 MinMax容斥)

    题意 题目链接 \(N\)个物品,每次得到第\(i\)个物品的概率为\(p_i\),而且有可能什么也得不到,问期望多少次能收集到全部\(N\)个物品 Sol 最直观的做法是直接状压,设\(f[sta] ...

  9. 洛谷P4027 [NOI2007]货币兑换(dp 斜率优化 cdq 二分)

    题意 题目链接 Sol 解题的关键是看到题目里的提示... 设\(f[i]\)表示到第\(i\)天所持有软妹币的最大数量,显然答案为\(max_{i = 1}^n f[i]\) 转移为\(f_i = ...

  10. 【代码笔记】iOS-左右可滑动的选择条

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...