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

可以用线段树分治做

 #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. 4. 基本TCP套接字编程

    基本函数接口 socket函数 #include <sys/socket.h> int socket(int family, int type, int protocol); 成功时返回一 ...

  2. Ajax的简单实现(Json)

    之前写的是一般的Ajax if (request.status === 200) { document.getElementById("createResult").innerHT ...

  3. dsp端编译异常之max和min未定义

    (1)在函数之前 声明__stdcall 时 在linux 端或dsp端 linux 之前的加上宏定义 __stdcall是MS的编译器使用的只需要#define __stdcall定义一个宏就可以 ...

  4. sanic官方文档解析之logging和request Data

    1,sanic的logging: Sanic允许有做不同类型的日志(通过的日志,错误的日志),在基于Python3的日志API接口请求,你必须具备基本的Python3的日志知识,在你如果想创建一个新的 ...

  5. Mac使用小结

    1.修改pip的镜像地址及更新pip https://www.cnblogs.com/techroad4ca/p/5922389.html 2.更新python的库,比如更新six sudo pip ...

  6. 两篇C++和VC++字符串的文章

    有空挨个摘录写点心得 http://www.cnblogs.com/maowang1991/p/3572304.html http://www.cnblogs.com/maowang1991/p/35 ...

  7. Linux系统(Centos)下安装Java环境配置步骤详述

    1.首先要去下载好JDK,Java SE 8的官方网址是http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...

  8. TFS Server 2017 自动化部署步骤

    1 第一步,在服务器上安装TFS 2 第二步,安装完TFS后需要配置你的项目,选择管理代码的方式,这里我们可以选择传统的TFS 也可以选择GIT 方式,此处我选择的GIT 方式 3 第三步,设置代理. ...

  9. springboot 多数据源(三种数据库连接池--JDBC,dbcp2,Druid)

    本文使用的是springboot2.0(在配置数据源时和springboot1.X略有区别) 首先:springboot默认支持的连接池有dbcp,dbcp2, tomcat, hikari四种连接池 ...

  10. MySQL性能优化-I/O相关配置参数

    本文介绍InnoDB和MyISAM两种存储引擎的I/O相关参数配置. 1.InnoDB  I/O相关配置 Innodb是一种事务型的存储引擎,为了减少提交事务时产生的io开销,innodb采用了写日志 ...