查询,就相当于先删去这条边,然后查询边的两个端点所在连通块大小,乘起来得到答案,然后再把边加回去

可以用线段树分治做

 #pragma GCC optimize("Ofast")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
#define N 100100
struct Q
{
int type,x,y,l,r,num;
}q[N*];
ll ans[N];
int nq,n,qq,tm,an;
char ss[];
int fa[N],sz[N],dp[N];
map<pi,int> ma;
int find(int x)
{
for(;x!=fa[x];x=fa[x]);
return x;
}
int bx[N*],bfa[N*],bsz[N*],bdp[N*],mem;
void unionn(int x,int y)
{
x=find(x),y=find(y);
++mem;bx[mem]=x;bfa[mem]=fa[x];bsz[mem]=sz[x];bdp[mem]=dp[x];
++mem;bx[mem]=y;bfa[mem]=fa[y];bsz[mem]=sz[y];bdp[mem]=dp[y];
if(dp[x]<dp[y]) {fa[x]=y;sz[y]+=sz[x];}
else
{
fa[y]=x;sz[x]+=sz[y];
if(dp[x]==dp[y]) dp[x]++;
}
}
void backn(int nn)
{
for(int i=;i<=nn;i++)
{
fa[bx[mem]]=bfa[mem];sz[bx[mem]]=bsz[mem];dp[bx[mem]]=bdp[mem];--mem;
fa[bx[mem]]=bfa[mem];sz[bx[mem]]=bsz[mem];dp[bx[mem]]=bdp[mem];--mem;
}
}
void solve(int pl,int pr,int l,int r)//[l,r]为线段树上区间
{
if(pl>pr) return;
int i,nn=;
if(l==r)
{
for(i=pl;i<=pr;i++)
if(q[i].type==)
unionn(q[i].x,q[i].y),++nn;
for(i=pl;i<=pr;i++)
if(q[i].type==)
ans[q[i].num]=ll(sz[find(q[i].x)])*sz[find(q[i].y)];
backn(nn);
return;
}
int mid=l+((r-l)>>),p=pl-;
for(i=pl;i<=pr;i++)
{
if(q[i].l<=l&&r<=q[i].r) unionn(q[i].x,q[i].y),++nn;
else if(q[i].l<=mid) swap(q[++p],q[i]);
}
solve(pl,p,l,mid);p=pl-;
for(i=pl;i<=pr;i++)
{
if((q[i].l>l||r>q[i].r)&&mid<q[i].r) swap(q[++p],q[i]);
}
solve(pl,p,mid+,r);
backn(nn);
}
int main()
{
int i,x,y;
scanf("%d%d",&n,&qq);
for(i=;i<=qq;i++)
{
scanf("%s%d%d",ss,&x,&y);
if(x>y) swap(x,y);
if(ss[]=='A')
{
ma[mp(x,y)]=++tm;
}
else
{
q[++nq]=(Q){,x,y,ma[mp(x,y)],++tm,};
++tm;q[++nq]=(Q){,x,y,tm,tm,++an};
ma[mp(x,y)]=++tm;
}
}
for(auto xx:ma) q[++nq]=(Q){,xx.fi.fi,xx.fi.se,xx.se,tm,};
for(i=;i<=n;i++) fa[i]=i,sz[i]=;
solve(,nq,,tm);
for(i=;i<=an;i++) printf("%lld\n",ans[i]);
return ;
}

洛谷 P4219 [BJOI2014]大融合的更多相关文章

  1. 洛谷 P4219 [BJOI2014]大融合 解题报告

    P4219 [BJOI2014]大融合 题目描述 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的 ...

  2. 洛谷P4219 - [BJOI2014]大融合

    Portal Description 初始有\(n(n\leq10^5)\)个孤立的点,进行\(Q(Q\leq10^5)\)次操作: 连接边\((u,v)\),保证\(u,v\)不连通. 询问有多少条 ...

  3. 洛谷P4219 [BJOI2014]大融合(LCT,Splay)

    LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...

  4. 洛谷P4219 [BJOI2014]大融合(LCT)

    LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...

  5. 洛谷4219 BJOI2014大融合(LCT维护子树信息)

    QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...

  6. P4219 [BJOI2014]大融合(LCT)

    P4219 [BJOI2014]大融合 对于每个询问$(u,v)$所求的是 ($u$的虚边子树大小+1)*($v$的虚边子树大小+1) 于是我们再开个$si[i]$数组表示$i$的虚边子树大小,维护一 ...

  7. P4219 [BJOI2014]大融合

    传送门 动态维护森林 显然考虑 $LCT$ 但是发现询问求的是子树大小,比较不好搞 维护 $sum[x]$ 表示节点 $x$ 的子树大小,$si[x]$ 表示 $x$ 的子树中虚儿子的子树大小和 那么 ...

  8. P4219 [BJOI2014]大融合 LCT维护子树大小

    \(\color{#0066ff}{ 题目描述 }\) 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一 ...

  9. luogu P4219 [BJOI2014]大融合

    题解:原来LCT也能维护子树信息,我太Naive了 用LCT维护当前子树节点个数 具体做法维护siz[x]=当前Splay子树和指向当前Splay子树的虚边所代表的节点个数 auxsiz[x]=指向x ...

随机推荐

  1. Json的简单介绍和解析

    Json:JavaScript对象表示法(JavaScript Object Noatation) Json是存储和交换文本信息的语法,类似XML.它采用键值对的方式来组织,易于人们阅读和编写,同时也 ...

  2. js编程精解--笔记

    看这本书的目的是为了更好的使用mongodb,所以只看js编程语言基础,不看浏览器和画布. 需要看1-11章,共160页 第一章 值.类型和运算符 第二章 程序结构 第三章 函数 第四章 数据结构:对 ...

  3. CH 5302 金字塔(区间DP)

    CH 5302 金字塔 \(solution:\) 很神奇的一道题目,当时看到还以为是一道字符串求回文子串的题目.但是数据范围很小,而且只知道回文串也不好做.但是我们观察可得,如果是深度搜索便利,那么 ...

  4. BZOJ2327: [HNOI2011]勾股定理

    BZOJ2327: [HNOI2011]勾股定理 Description 题解Here! 这是一道神题... 我一开始把题目看错了,我以为是在$n$根木棒中选两个$i,j$满足$gcd(i,j)==1 ...

  5. rails elasticsearch searchkick用法

    1.安装elasticsearch 之前要先安装java8: 参考https://www.elastic.co/guide/en/elasticsearch/reference/current/zip ...

  6. IOS中调用系统拨打电话发送短信

    一.调用打电话界面 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat ...

  7. DFS Used%: NaN%问题

    一.问题描述: [root@master sbin]# hdfs dfsadmin -report Configured Capacity: 0 (0 B) Present Capacity: 0 ( ...

  8. 状态空间搜索好题UVA10603

    题目 分析:注意这里求的是最少流量, 二不是最少步数!!!所以我们用优先队列去维护一个最小流量,然后进行bfs即可,解释一下一个重要的数组ans[i],表示的是杯子中的水为i时的最小流量 #inclu ...

  9. bzoj2431逆序对数列——递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2431 考虑新加入一个数i,根据放的位置不同,可以产生0~i-1个新逆序对: 所以f[i][j ...

  10. In-App Purchase Programming Guide----(六) ----Working with Subscriptions

    Working with Subscriptions Apps that use subscriptions have some additional behaviors and considerat ...