BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ3514
题意概括
N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数。
N,M,Q<=200000
题解
这题hzwer还是写的很好的……
代码
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=200005,S=N*2,Inf=23333333;
int n,m,k,type,prev_e[N];
struct Edge{
int x,y;
}e[N];
int fa[S],son[S][2],rev[S],val[S],Min[S];
void clear(int x,int v){
fa[x]=son[x][0]=son[x][1]=rev[x]=0;
val[x]=Min[x]=v;
}
bool isroot(int x){
return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
}
void pushup(int x){
Min[x]=min(val[x],min(Min[son[x][0]],Min[son[x][1]]));
}
void pushdown(int x){
if (rev[x]){
rev[x]=0;
rev[son[x][0]]^=1;
rev[son[x][1]]^=1;
swap(son[x][0],son[x][1]);
}
}
void pushadd(int x){
if (!isroot(x))
pushadd(fa[x]);
pushdown(x);
}
int wson(int x){
return son[fa[x]][1]==x;
}
void rotate(int x){
if (isroot(x))
return;
int y=fa[x],z=fa[y],L=wson(x),R=L^1;
if (!isroot(y))
son[z][wson(y)]=x;
fa[x]=z,fa[y]=x,fa[son[x][R]]=y;
son[y][L]=son[x][R],son[x][R]=y;
pushup(y),pushup(x);
}
void splay(int x){
pushadd(x);
for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
if (!isroot(y))
rotate(wson(x)==wson(y)?y:x);
}
void access(int x){
int t=0;
while (x){
splay(x);
son[x][1]=t;
pushup(x);
t=x;
x=fa[x];
}
}
int find(int x){
access(x);
splay(x);
while (son[x][0])
x=son[x][0];
return x;
}
void rever(int x){
access(x);
splay(x);
rev[x]^=1;
}
void link(int x,int y){
rever(x);
fa[x]=y;
}
void split(int x,int y){
rever(x);
access(y);
splay(y);
}
void cut(int x,int y){
split(x,y);
fa[x]=son[y][0]=0;
}
const int T=5200005;
int ls[T],rs[T],sum[T],root[N],total;
void Tpushup(int rt){
sum[rt]=sum[ls[rt]]+sum[rs[rt]];
}
void build(int &rt,int L,int R){
rt=++total;
if (L==R){
ls[T]=rs[T]=sum[T]=0;
return;
}
int mid=(L+R)>>1;
build(ls[rt],L,mid);
build(rs[rt],mid+1,R);
Tpushup(rt);
}
void add(int prt,int &rt,int L,int R,int pos){
rt=++total;
if (L==R){
sum[rt]=sum[prt]+1;
return;
}
int mid=(L+R)>>1;
if (pos<=mid)
add(ls[prt],ls[rt],L,mid,pos),rs[rt]=rs[prt];
else
add(rs[prt],rs[rt],mid+1,R,pos),ls[rt]=ls[prt];
Tpushup(rt);
}
int query(int rt,int L,int R,int pos){
if (R<=pos)
return sum[rt];
if (L>pos)
return 0;
int mid=(L+R)>>1;
return query(ls[rt],L,mid,pos)+query(rs[rt],mid+1,R,pos);
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&type);
for (int i=1;i<=m;i++)
scanf("%d%d",&e[i].x,&e[i].y);
int s=n+m;
for (int i=0;i<S;i++)
clear(i,Inf);
for (int i=1;i<=m;i++){
int x=e[i].x,y=e[i].y;
if (x==y){
prev_e[i]=i;
continue;
}
if (find(x)==find(y)){
split(y,x);
int ce=prev_e[i]=Min[x];
cut(e[ce].x,ce+n);
cut(e[ce].y,ce+n);
}
else
prev_e[i]=0;
clear(i+n,i);
link(x,i+n);
link(y,i+n);
}
total=n-1;
build(root[0],0,m);
for (int i=1;i<=m;i++)
add(root[i-1],root[i],0,m,prev_e[i]);
int lastans=0;
for (int i=1;i<=k;i++){
int L,R;
scanf("%d%d",&L,&R);
if (type)
L^=lastans,R^=lastans;
int res=query(root[R],0,m,L-1)-query(root[L-1],0,m,L-1);
res=n-res;
printf("%d\n",lastans=res);
}
return 0;
}
BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT的更多相关文章
- [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2177 Solved: 834 ...
- bzoj3514 Codechef MARCH14 GERALD07加强版 lct预处理+主席树
Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1951 Solved: 746[Submi ...
- BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)
Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT+可持久化线段树
自己独自想出来并切掉还是很开心的~ Code: #include <bits/stdc++.h> #define N 400005 #define inf 1000000000 #defi ...
- BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树
题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...
- 【LCT+主席树】BZOJ3514 Codechef MARCH14 GERALD07加强版
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2023 Solved: 778 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版( LCT + 主席树 )
从左到右加边, 假如+的边e形成环, 那么记下这个环上最早加入的边_e, 当且仅当询问区间的左端点> _e加入的时间, e对答案有贡献(脑补一下). 然后一开始是N个连通块, 假如有x条边有贡献 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1312 Solved: 501 ...
- 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树
题解: 还是比较简单的 首先我们的思路是 确定起点 然后之后贪心的选择边(也就是越靠前越希望选) 我们发现我们只需要将起点从后向前枚举 然后用lct维护连通性 因为强制在线,所以用主席树记录状态就可以 ...
随机推荐
- STM32建立基本项目
1.下载固件库解压 2.Keil建立项目,项目下建立三个文件夹3.各目录下从固件库中拷贝对应的目录 4.修改main.c文件 5.修改C++ 6.修改Include 7,编译.
- mysql手工注入总结
mysql -u 用户名 -p 密码 -h IP地址 show databases; 查看数据库 select version(); php注入的版本号 use database(表名): sho ...
- Linq 中的 in 与 not in 的使用
接 触 LINQ 也有很长的一段时间了,有些在 SQL 语句中用的很顺手的东西在 Linq 中却不知道如何实现了,最近遇到了一个问题,在 LINQ 的 Where 条件式中要如何使用 IN 与 NOT ...
- JavaScript之函数调用与被调用的上下文对象this
不同的调用机制决定了函数上下文对象的不同: 1. 作为普通函数进行调用时,其上下文是全局对象window; 2. 作为(对象)方法进行调用时,其上下文对象时拥有该方法的对象; 3. 作为构造器( ...
- luogu P1979 [NOIP2013] 华容道
传送门 这道题中,棋子的移动是要移动到空格上去,所以空格要在棋子旁边才能移动棋子;而棋子移动的方向由空格决定 所以我们可以记三维状态\(di_{i,j,k}\),表示状态为棋子在\((i,j)\),空 ...
- 记录一个PHP安装redis扩展时的问题
安装过程:https://www.cnblogs.com/pengyunjing/p/8688320.html 由于我之前安装过该扩展,重新安装时没有执行make clean命令,所以安装好出现了下面 ...
- 第三周结对项目--小学生四则运算CAI软件汇报及总结(UI/web)
前言: 这周是和我队友苏卫喜一起结对开发,我主要是写项目文档需求分析,她是通过我的需求文档来进行做思维导图,之后我们通过思维导图一起讨论用户界面设计. 以下就是我的需求分析1.0版本 1. 软件名 ...
- js遍历对象的方法
1. for ... in 语句 for (let variable in object) { ... } https://developer.mozilla.org/zh-CN/docs/Web/ ...
- 【docx4j】docx4j操作docx,实现替换内容、转换pdf、html等操作
主要是想要用此功插件操作docx,主要的操作就是操作段落等信息,另外,也想实现替换docx的内容,实现根据模板动态生成内容的效果,也想用此插件实现docx转换pdf. word的格式其实可以用xml来 ...
- Python写黑客小工具,360免杀
构思: client:反向连接server,执行shell命令 server:发送命令,控制客户端 import subprocess import socket import threading t ...