洛谷 P4219 [BJOI2014]大融合
查询,就相当于先删去这条边,然后查询边的两个端点所在连通块大小,乘起来得到答案,然后再把边加回去
可以用线段树分治做
#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]大融合的更多相关文章
- 洛谷 P4219 [BJOI2014]大融合 解题报告
P4219 [BJOI2014]大融合 题目描述 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的 ...
- 洛谷P4219 - [BJOI2014]大融合
Portal Description 初始有\(n(n\leq10^5)\)个孤立的点,进行\(Q(Q\leq10^5)\)次操作: 连接边\((u,v)\),保证\(u,v\)不连通. 询问有多少条 ...
- 洛谷P4219 [BJOI2014]大融合(LCT,Splay)
LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...
- 洛谷P4219 [BJOI2014]大融合(LCT)
LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...
- 洛谷4219 BJOI2014大融合(LCT维护子树信息)
QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...
- P4219 [BJOI2014]大融合(LCT)
P4219 [BJOI2014]大融合 对于每个询问$(u,v)$所求的是 ($u$的虚边子树大小+1)*($v$的虚边子树大小+1) 于是我们再开个$si[i]$数组表示$i$的虚边子树大小,维护一 ...
- P4219 [BJOI2014]大融合
传送门 动态维护森林 显然考虑 $LCT$ 但是发现询问求的是子树大小,比较不好搞 维护 $sum[x]$ 表示节点 $x$ 的子树大小,$si[x]$ 表示 $x$ 的子树中虚儿子的子树大小和 那么 ...
- P4219 [BJOI2014]大融合 LCT维护子树大小
\(\color{#0066ff}{ 题目描述 }\) 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一 ...
- luogu P4219 [BJOI2014]大融合
题解:原来LCT也能维护子树信息,我太Naive了 用LCT维护当前子树节点个数 具体做法维护siz[x]=当前Splay子树和指向当前Splay子树的虚边所代表的节点个数 auxsiz[x]=指向x ...
随机推荐
- Golang-interface(二 接口与nil)
github: https://github.com/ZhangzheBJUT/blog/blob/master/nil.md 一 接口与nil 前面解说了go语言中接口的基本用法,以下将说一说nil ...
- NullpointerException真的一定要被预防?
毫无疑问,空指针NullpointerException是我们最常遇到异常,没有之一! 在刚进入编程职业时,我想,大部分进入的同学肯定会受到前辈们的叮咛:一定要防止空指针,这是个低级错误.你们不是?好 ...
- gradle配置远程仓库(以及使用本地maven仓库)
allprojects{ repositories { mavenLocal() def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content ...
- 常用SQL备忘录
联表删除: delete t1,t2 from table_name t1 left join t2 on t1.id=t2.id where t1.id=23 (ps:该语句在mysql 5.0之前 ...
- nginx配置实战以及查看并发数
http://www.cnblogs.com/kevingrace/p/6095027.html http://www.cnblogs.com/lianzhilei/p/6025267.html
- JS/TS 的 import 和 export 用法小结
ES6 export 和 export default的区别 昨天帮一个网友解决一个typescript的问题,看了一下,归根结底还是对js的import和export用法的不熟悉.让我想起来当年学这 ...
- oracle:rman恢复----通过增量备份来恢复
试验计划:先rman进行一个0级备份,插入表相关数据,再进行level 1级增量备份,进行rman恢复 实验环境:归档模式下,oracle10.2.0.1 开始试验: 1. rman level 0级 ...
- MyBatis学习 之 五、MyBatis配置文件
在定义sqlSessionFactory时需要指定MyBatis主配置文件: <bean id="sqlSessionFactory" class="org.myb ...
- fastText(三):微博短文本下fastText的应用(二)
上一篇讲到,fastText在训练数据中过拟合的问题.接下来将介绍一些提高fastText泛化能力的尝试. 模型泛化使用过fastText的人,往往会被它的很多特性征服,例如训练速度.兼具word e ...
- javascript switch..... case
switch(条件表达式) { case 常量: { 语句a; } break; case 常量: { 语句b; } break; case 常量: { 语句c; } break; ... case ...