传送门——BZOJ

传送门——VJ


考虑使用LCT维护时间最大生成树,那么对于第\(i\)条边,其加入时可能会删去一条边。记\(pre_i\)表示删去的边的编号,如果不存在则\(pre_i = 0\),如果是自环则\(pre_i = i\)。

因为连通块数量等于点数减树边数量,而对于一组询问\([l,r]\),当\(pre_i < l \leq i \leq r\)的时候就会在这张图上额外增加一条树边。所以我们只需要使用主席树做一个二维数点就可以了。

时空复杂度\(O(nlogn)\)

#include<bits/stdc++.h>
using namespace std; int read(){
int a = 0; char c = getchar(); bool f = 0;
while(!isdigit(c)){f = c == '-'; c = getchar();}
while(isdigit(c)){
a = a * 10 + c - 48; c = getchar();
}
return f ? -a : a;
} const int _ = 4e5 + 7; namespace segt{
const int __ = _ * 30;
int sum[__] , lch[__] , rch[__] , cnt; #define mid ((l + r) >> 1) void modify(int &x , int l , int r , int tar){
int t = ++cnt; sum[t] = sum[x] + 1; lch[t] = lch[x]; rch[t] = rch[x]; x = t;
if(l == r) return;
mid >= tar ? modify(lch[x] , l , mid , tar) : modify(rch[x] , mid + 1 , r , tar);
} int qry(int x , int l , int r , int L , int R){
if(!x || l >= L && r <= R) return sum[x];
int sum = 0;
if(mid >= L) sum = qry(lch[x] , l , mid , L , R);
if(mid < R) sum += qry(rch[x] , mid + 1 , r , L , R);
return sum;
}
}using segt::modify; using segt::qry; namespace LCT{
int fa[_] , ch[_][2] , val[_] , mn[_]; bool rmrk[_]; bool nroot(int x){return ch[fa[x]][0] == x || ch[fa[x]][1] == x;}
bool son(int x){return ch[fa[x]][1] == x;}
void up(int x){mn[x] = min(min(ch[x][0] ? mn[ch[x][0]] : (int)1e9 , ch[x][1] ? mn[ch[x][1]] : (int)1e9) , val[x]);}
void mark(int x){rmrk[x] ^= 1; swap(ch[x][0] , ch[x][1]);}
void down(int x){if(rmrk[x]){mark(ch[x][0]); mark(ch[x][1]); rmrk[x] = 0;}}
void dall(int x){if(nroot(x)) dall(fa[x]); down(x);} void rot(int x){
bool f = son(x); int y = fa[x] , z = fa[y] , w = ch[x][f ^ 1];
fa[x] = z; if(nroot(y)) ch[z][son(y)] = x;
fa[y] = x; ch[x][f ^ 1] = y;
ch[y][f] = w; if(w) fa[w] = y;
up(y);
} void splay(int x){
dall(x);
while(nroot(x)){
if(nroot(fa[x])) rot(son(fa[x]) == son(x) ? fa[x] : x);
rot(x);
}
up(x);
} void access(int x){for(int y = 0 ; x ; y = x , x = fa[x]){splay(x); ch[x][1] = y; if(y) fa[y] = x; up(x);}}
void mkrt(int x){access(x); splay(x); mark(x);}
void split(int x , int y){mkrt(x); access(y); splay(y);}
void link(int x , int y){mkrt(x); fa[x] = y;}
void cut(int x , int y){split(x , y); ch[y][0] = fa[x] = 0; up(y);}
int fdrt(int x){access(x); splay(x); while(down(x) , ch[x][0]) x = ch[x][0]; splay(x); return x;}
}using namespace LCT;
int rt[_] , pre[_] , s[_] , t[_] , N , M , K , TP , lastans; int main(){
N = read(); M = read(); K = read(); TP = read();
for(int i = 1 ; i <= M ; ++i){
s[i] = read() , t[i] = read(); LCT::val[i + N] = LCT::mn[i + N] = i;
} for(int i = 1 ; i <= N ; ++i) LCT::val[i] = LCT::mn[i] = 1e9;
for(int i = 1 ; i <= M ; ++i)
if(s[i] != t[i]){
if(fdrt(s[i]) == fdrt(t[i])){
split(s[i] , t[i]); int id = mn[t[i]];
pre[i] = id; cut(s[id] , id + N); cut(t[id] , id + N);
}
link(s[i] , i + N); link(t[i] , i + N);
}
else pre[i] = i; for(int i = 1 ; i <= M ; ++i) segt::modify(rt[i] = rt[i - 1] , 0 , M , pre[i]);
for(int i = 1 ; i <= K ; ++i){
int l = read() ^ (TP * lastans) , r = read() ^ (TP * lastans);
printf("%d\n" , lastans = N - (segt::qry(rt[r] , 0 , M , 0 , l - 1) - (l - 1)));
}
return 0;
}

BZOJ3514 / Codechef GERALD07 Chef and Graph Queries LCT、主席树的更多相关文章

  1. [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]

    题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...

  2. [CodeChef - GERALD07 ] Chef and Graph Queries

    Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...

  3. 【CodeChef】Chef and Graph Queries

    Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...

  4. [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)

    [BZOJ3514] Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES) 题意 \(N\) 个点 \(M\) 条边的无向图,\(K\) 次询问保 ...

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

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

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

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

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

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

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

    题意 \(N\) 个点 \(M\) 条边的无向图,询问保留图中编号在 \([l,r]\) 的边的时候图中的联通块个数. \(K\) 次询问强制在线. \(1\le N,M,K \le 200,000\ ...

  9. BZOJ3514:GERALD07加强版(LCT,主席树)

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...

随机推荐

  1. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  2. CentOS 7上安装Apache

    安装apache yum install httpd vi /etc/httpd/conf/httpd.conf 修改默认端口为81 service httpd start netstat -nltp ...

  3. pathlib.Path 类的使用

    from pathlib import Path 参考 https://www.jb51.net/article/148789.htm

  4. nginx php-fpm 配置问题(1)

    nginx php-fpm 配置问题(1) 1.问题    Nginx/FPM/PHP all php files say 'File not found.' nginx error日志: [erro ...

  5. OpenFOAM——前台阶

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL037:Turbulent Flow Over a Forward Facing ...

  6. Spring Boot集成Mybatis注解相关

    mybatis3开始支持java注解,使用java注解可以替代xml配置文件,简化代码.下面来看一下怎么在spring boot中使用mybatis注解. 1 使用mybatis注解需要的配置.如下面 ...

  7. 4款五星级的3D模型资源包

    HI,晚上好各位,今晚我们将为大家介绍4款五星级的3D模型资源包. ANIMALS FULL PACK ANIMALS FULL PACK包含了由PROTOFACTOR制作的24款高质量的动物模型,包 ...

  8. gradle/gradle plugin/Android studio关系

    gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...

  9. java ali支付服务端对接

    引入SDK: <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --><dependen ...

  10. docker swarm 集群搭建

    创建一个集群 [vagrant@node1 ~]$ docker swarm init --advertise-addr 192.168.9.101 Swarm initialized: curren ...