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

解题思路:

LCT维护连通图,维护最早被删除的边。

像HH的项链那样搞就好了。

只不过是主席树。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
const int N=;
class PST{
#define lll tr[spc].ls
#define rrr tr[spc].rs
public:
void update(int l,int r,int &spc,int lst,int pos,int v)
{
spc=++siz;
tr[spc]=tr[lst];
tr[spc].val+=v;
if(l==r)
return ;
int mid=(l+r)>>;
if(pos<=mid)
update(l,mid,tr[spc].ls,tr[lst].ls,pos,v);
else
update(mid+,r,tr[spc].rs,tr[lst].rs,pos,v);
return ;
}
int query(int l,int r,int ll,int rr,int spc)
{
if(!spc)
return ;
if(l>rr||ll>r)
return ;
if(ll<=l&&r<=rr)
return tr[spc].val;
int mid=(l+r)>>;
return query(l,mid,ll,rr,lll)+query(mid+,r,ll,rr,rrr);
}
void fit(int array_size)
{
size=array_size;
return ;
}
int Query(int l,int r)
{
int ans=;
ans=query(,size,l,r,root[r]);
return ans;
}
void ops(int pos)
{
root[pos]=root[pos-];
return ;
}
void Add(int i,int pos,int v)
{
update(,size,root[i],root[i],pos,v);
return ;
}
private:
struct trnt{
int ls;
int rs;
int val;
}tr[N*];
int root[N];
int siz;
int size;
#undef lll
#undef rrr
}P;
class LCT{
#define lll tr[spc].ch[0]
#define rrr tr[spc].ch[1]
#define ls ch[0]
#define rs ch[1]
public:
bool whc(int spc)
{
return tr[tr[spc].fa].rs==spc;
}
void pushup(int spc)
{
tr[spc].mv=tr[spc].sl;
if(lll)
tr[spc].mv=std::min(tr[spc].mv,tr[lll].mv);
if(rrr)
tr[spc].mv=std::min(tr[spc].mv,tr[rrr].mv);
return ;
}
void trr(int spc)
{
if(!spc)
return ;
std::swap(lll,rrr);
tr[spc].lzt^=;
return ;
}
void pushdown(int spc)
{
if(tr[spc].lzt)
{
trr(lll);
trr(rrr);
tr[spc].lzt=;
}
return ;
}
void recal(int spc)
{
if(!tr[spc].anc)
recal(tr[spc].fa);
pushdown(spc);
return ;
}
void rotate(int spc)
{
int f=tr[spc].fa;
bool k=whc(spc);
tr[f].ch[k]=tr[spc].ch[!k];
tr[spc].ch[!k]=f;
if(tr[f].anc)
{
tr[f].anc=;
tr[spc].anc=;
}else
tr[tr[f].fa].ch[whc(f)]=spc;
tr[spc].fa=tr[f].fa;
tr[f].fa=spc;
tr[tr[f].ch[k]].fa=f;
pushup(f);
pushup(spc);
return ;
}
void splay(int spc)
{
recal(spc);
while(!tr[spc].anc)
{
int f=tr[spc].fa;
if(tr[f].anc)
{
rotate(spc);
return ;
}
if(whc(spc)^whc(f))
rotate(spc);
else
rotate(f);
rotate(spc);
}
return ;
}
void access(int spc)
{
int lst=;
while(spc)
{
splay(spc);
tr[rrr].anc=;
tr[lst].anc=;
rrr=lst;
pushup(spc);
lst=spc;
spc=tr[spc].fa;
}
return ;
}
void Mtr(int spc)
{
access(spc);
splay(spc);
trr(spc);
return ;
}
void split(int x,int y)
{
Mtr(x);
access(y);
splay(y);
return ;
}
void link(int x,int y)
{
Mtr(x);
tr[x].fa=y;
return ;
}
bool check(int x,int y)
{
Mtr(x);
access(y);
splay(y);
pushdown(y);
while(tr[y].ls)
{
y=tr[y].ls;
pushdown(y);
}
return x==y;
}
int minplace(int x,int y)
{
split(x,y);
return tr[y].mv;
}
void cut(int x,int y)
{
split(x,y);
tr[y].ls=;
tr[x].fa=;
tr[x].anc=true;
pushup(y);
return ;
}
void fit(int size1,int size2)
{
siz=size1+size2;
for(int i=;i<=size1;i++)
tr[i].sl=0x3f3f3f3f;
for(int i=;i<=size2;i++)
tr[i+size1].sl=i;
for(int i=;i<=siz;i++)
{
tr[i].anc=true;
pushup(i);
}
return ;
}
private:
struct int_2{
int v;
int p;
};
struct trnt{
int ch[];
int fa;
int lzt;
bool anc;
int sl;
int mv;
}tr[N];
int siz;
#undef lll
#undef rrr
#undef ls
#undef rs
}T;
int n,m,k,t;
int lastans;
int from[N];
int plc[N];
int to[N];
int no[N];
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&t);
for(int i=;i<=m;i++)
{
scanf("%d%d",&from[i],&to[i]);
no[i]=i;
plc[i]=n+i;
}
T.fit(n,m);
P.fit(m);
for(int i=;i<=m;i++)
{
P.ops(i);
int a=from[i],b=to[i];
if(a==b)
continue;
if(T.check(a,b))
{
int pos=T.minplace(a,b);
P.Add(i,pos,-);
T.cut(plc[pos],from[pos]);
T.cut(plc[pos],to[pos]);
}
T.link(plc[i],a);
T.link(plc[i],b);
P.Add(i,i,);
}
while(k--)
{
int l,r;
scanf("%d%d",&l,&r);
if(t)
{
l^=lastans;
r^=lastans;
}
lastans=n-P.Query(l,r);
printf("%d\n",lastans);
}
return ;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树

    题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...

  8. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树

    自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...

  9. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3514 题意概括 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. N ...

随机推荐

  1. localStorage 以及UserData[IE6 IE7]使用

    说在前头: UserData:属于IE6 IE7的老东西.麻烦且体验差,暂且不表 localStorage 属于HTML5的东西,兼容IE8以及其它W3C标准的主流浏览器.所以尽可能的具体解说 注意: ...

  2. uvalive 4730王国kingdom(并查集+线段树)

     题意:有T组測试数据.每组数据的N表示有N个城市,接下来的N行里每行给出每一个城市的坐标(0<=x,y<=1000000),然后有M(1<M<200000)个操作,操作有 ...

  3. Spring MVC 返回视图时添加的模型数据------POJO

    POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和 EJB混淆起来, 而且简 ...

  4. Spring security工作流程及集成

    A user enters their username and password into a login screen and clicks a login button. The entered ...

  5. 分享vue ui时间组件用法

    //js code var jiaban = { template:` <i-form v-ref:form_jb :model="form_jb" :rules=" ...

  6. Java Web学习总结(10)——Session详解

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...

  7. Lua刚開始学习的人(一)--Lua 简单教学

    近期因为工作原因.临时木有<Oracle起步学习>续集.领导知道学习下Lua脚本语言.看了一周了.趁热打铁,留下点实用的东西吧. 本系列会主要针对宿主语言为 Delphi,原理都是一样的, ...

  8. 自己定义控件-DownSlidingDrawer

    一.描写叙述 能够下拉的 SlidingDrawer 二.效果图 图片是网上找到,可是效果是一样的 三.源代码 https://github.com/mentor811/Demo_MySlidingD ...

  9. Justinmind使用教程(5)——Justinmind破解

    今天继续用Justinmind的时候.提示快到期啦. 所以今天学习的课题比較简单了,就是怎样破解Justinmind. 眼下没有无敌的注冊码,大家依照例如以下方式操作一定就解决全部问题了 1.删除两个 ...

  10. js插件---markdown如何使用

    js插件---markdown如何使用 一.总结 一句话总结:看文档,看api,看参数列表,看js调用插件的调用函数的参数(json) 1.js和css的问题:如何知道插件要引入哪些js和css? a ...