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. uva 104 Arbitrage (DP + floyd)

    uva 104 Arbitrage Description Download as PDF Background The use of computers in the finance industr ...

  2. VC双缓冲画图技术介绍

    双缓冲画图,它是一种主要的图形图像画图技术.首先,它在内存中创建一个与屏幕画图区域一致的对象,然后将图形绘制到内存中的这个对象上,最后把这个对象上的图形数据一次性地拷贝并显示到屏幕上. 这样的技术能够 ...

  3. Oracle修改表空间自增长

    下面列出详细过程: 1.通过sql plus 命令登录数据库. 在命令行下输入sqlplus “登录用户名/口令 as 登录类型”就可以登录,系统内建的用户名常用的是sys,密码是在安装oracle过 ...

  4. Codefroces B. T-primes

    http://codeforces.com/problemset/problem/230/B B. T-primes time limit per test 2 seconds memory limi ...

  5. VBA 字符串操作(基础篇)

    转自:http://blog.csdn.net/jyh_jack/article/details/2315345 mid(字符串,从第几个开始,长度) 在[字符串]中[从第几个开始]取出[长度个字符串 ...

  6. git pull 、git fetch、 git clone

    git clone 代表从远程克隆过来包括所有的版本信息 git fetch是从远程获取最新的版本 git pull相当于 git fetch 然后再git merge

  7. vue+ webpack中的animate.css实现的执行多个连续的动画

    1.安装 npm install animate.css 2.使用方法 入口文件App中进行引入 import animate from 'animate.css' 3.多个连续的动画 实现的效果:实 ...

  8. 【TC SRM 718 DIV 2 A】RelativeHeights

    [Link]: [Description] 给你n个数字组成原数列; 然后,让你生成n个新的数列a 其中第i个数列ai为删掉原数列中第i个数字后剩余的数字组成的数列; 然后问你这n个数列组成的排序数组 ...

  9. Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

    可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal  error  war ...

  10. Template template parameter(模板參数) example

    /********************************************************************************* Copyright (C), 19 ...