BZOJ 3514 LCT+主席树
思路:


//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n,m,k,type,ch[N][],fa[N],minn[N],rev[N],q[N],top,pre[N];
int root[N],tree[N*],lson[N*],rson[N*],cnt,xx,yy,ans;
struct Road{int x,y,wei;}road[N];
bool isroot(int p){return ch[fa[p]][]!=p&&ch[fa[p]][]!=p;}
void push_up(int p){
minn[p]=p;
if(road[minn[ch[p][]]].wei<road[minn[p]].wei)minn[p]=minn[ch[p][]];
if(road[minn[ch[p][]]].wei<road[minn[p]].wei)minn[p]=minn[ch[p][]];
}
void push_down(int p){rev[ch[p][]]^=,rev[ch[p][]]^=,rev[p]=,swap(ch[p][],ch[p][]);}
void rotate(int p){
int q=fa[p],y=fa[q],x=(ch[q][]==p);
ch[q][x]=ch[p][!x],fa[ch[q][x]]=q;
ch[p][!x]=q,fa[p]=y;
if(!isroot(q)){
if(ch[y][]==q)ch[y][]=p;
if(ch[y][]==q)ch[y][]=p;
}fa[q]=p;push_up(q);
}
void splay(int x){
q[++top]=x;
for(int i=x;!isroot(i);i=fa[i])q[++top]=fa[i];
while(top){if(rev[q[top]])push_down(q[top]);top--;}
for(int y=fa[x];!isroot(x);rotate(x),y=fa[x])if(!isroot(y)){
if((ch[y][]==x)^(ch[fa[y]][]==y))rotate(x);
else rotate(y);
}push_up(x);
}
void access(int x){for(int t=;x;t=x,x=fa[x])splay(x),ch[x][]=t,push_up(x);}
void makeroot(int x){access(x),splay(x),rev[x]^=;}
bool connected(int x,int y){while(fa[x])x=fa[x];while(fa[y])y=fa[y];return x==y;}
void link(int x,int y){makeroot(x),fa[x]=y;}
void split(int x,int y){makeroot(x),access(y),splay(y);}
void cut(int x,int y){split(x,y),ch[y][]=fa[x]=;push_up(y);}
void insert(int l,int r,int &pos,int last,int wei){
pos=++cnt,tree[pos]=tree[last]+;
if(l==r)return;
int mid=(l+r)>>;
if(mid<wei)lson[pos]=lson[last],insert(mid+,r,rson[pos],rson[last],wei);
else rson[pos]=rson[last],insert(l,mid,lson[pos],lson[last],wei);
}
int query(int l,int r,int pos,int last,int L,int R){
if(l>=L&&r<=R)return tree[pos]-tree[last];
int mid=(l+r)>>;
if(mid<L)return query(mid+,r,rson[pos],rson[last],L,R);
else if(mid>=R)return query(l,mid,lson[pos],lson[last],L,R);
else return query(l,mid,lson[pos],lson[last],L,R)+query(mid+,r,rson[pos],rson[last],L,R);
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&type);
for(int i=;i<=n;i++)road[i].wei=0x3f3f3f3f;
for(int i=n+;i<=n+m;i++)scanf("%d%d",&road[i].x,&road[i].y),road[i].wei=i;
for(int i=n+;i<=n+m;i++){
if(connected(road[i].x,road[i].y)){
if(road[i].x==road[i].y){pre[i-n]=i-n;continue;}
split(road[i].x,road[i].y);
int t=minn[road[i].y];
pre[i-n]=road[t].wei-n;
cut(road[t].x,t),cut(road[t].y,t);
}
link(road[i].x,i),link(road[i].y,i);
}
for(int i=;i<=m;i++)insert(,m,root[i],root[i-],pre[i]);
while(k--){
scanf("%d%d",&xx,&yy);
if(type)xx^=ans,yy^=ans;
printf("%d\n",ans=n-query(,m,root[yy],root[xx-],,xx-));
}
}
BZOJ 3514 LCT+主席树的更多相关文章
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
		
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1312 Solved: 501 ...
 - BZOJ 3514: Codechef MARCH14 GERALD07加强版(LCT + 主席树)
		
题意 \(N\) 个点 \(M\) 条边的无向图,询问保留图中编号在 \([l,r]\) 的边的时候图中的联通块个数. \(K\) 次询问强制在线. \(1\le N,M,K \le 200,000\ ...
 - BZOJ 3514 GERALD07加强版 (LCT+主席树)
		
题目大意:给定n个点m条边无向图,每次询问求当图中有编号为[L,R]的边时,整个图的联通块个数,强制在线 神题!(发现好久以前的题解没有写完诶) 我们要求图中联通块的个数,似乎不可搞啊. 联通块个数= ...
 - [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
		
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2177 Solved: 834 ...
 - [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]
		
题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...
 - 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
		
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
 - bzoj3514(LCT+主席树)
		
题目描述 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 题解 对于一个截止时间来说,越晚的变越好. 所以我们可以维护一颗以边的序号为关键字的最大生成树,然后用主席树维 ...
 - 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树
		
题解: 还是比较简单的 首先我们的思路是 确定起点 然后之后贪心的选择边(也就是越靠前越希望选) 我们发现我们只需要将起点从后向前枚举 然后用lct维护连通性 因为强制在线,所以用主席树记录状态就可以 ...
 - 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
		
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
 
随机推荐
- npm 使用教程
			
链接----------------------------------npm官网npm淘宝镜像 安装包----------------------------------npm install -g ...
 - Andrew and Chemistry(树的同构)
			
Andrew and Chemistry(树的同构) 题链 将一棵树转化为最小表示法,将此时的树哈希一下,同时用map进行标记,就可以判断树是否存在同构 #include <map> #i ...
 - dp专题备忘录
			
hdu 1024:基础dp题 hdu 1029:主元素问题,很快的解法,计数器 hdu 1069:LIS hdu 1074:数位dp,数位dp基础 hdu 1257:简单LIS,要仔细分析为什么是求最 ...
 - 【Codeforces 375B】Maximum Submatrix 2
			
[链接] 我是链接,点我呀:) [题意] 如果任意行之间可以重新排序. 问你最大的全是1的子矩阵中1的个数 [题解] 设cnt[i][j] 表示(i,j)这个点往右连续的1的个数 我们枚举列j 然后对 ...
 - JRebel 7.1.5 插件下载 安装 激活 结合 IntelliJ IDEA--自动编译进行热部署---
			
Intellij IDEA 安装和配置jrebel进行项目的热部署 https://www.cnblogs.com/a8457013/p/7866625.html Intellij IDEA 使用jr ...
 - hdu  5037  模拟网选1006
			
/* 模拟 实例: 33 1 10 5 5 2 10 3 3 6 1 3 2 1 1 4 2 1 1 5 2 1 1 6 2 1 1 7 2 1 5 20 8 1 2 3 4 5 1 20 8 5 0 ...
 - 模拟退火算fa
			
转载:http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html 优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 ...
 - CSS filter 模拟黑洞照片效果
			
今天被世界上第一张黑洞照片刷屏. 一整天,哪里都是这张照片.看的多了.我就想用css做一个吧. 建议在chrome上查看. 访问地址:http://suohb.com/work/blankHole.h ...
 - 飞思卡尔 imx6 GC0308 摄像头驱动配置调试过程
			
GC0308摄像头驱动程序使用的是linux v4l2协议,通过i2c信号进行控制.GC0308摄像头.对上电时序要求非常严格,一定要依据datasheet初始化摄像头. 本驱动使用的3.10内核,所 ...
 - vim学习笔记(1)——vim操作
			
仅记录一些自己最经常使用的vim操作.随时更新 文本操作 d 剪切.双击剪切一行 y 复制,双击复制一行 p 粘贴 x 删除当前光标下字符 r 替换当前光标字符.后面接替换的字符 :s/old/new ...