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

可以用线段树分治做

 #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 ;
}

最新文章

  1. 对 griview获取的数据添加方法 6月
  2. windows页面打印div(弹出新页面)
  3. java并发编程系列
  4. jquery分页插件
  5. nyoj-71
  6. [简介]HTML5 and CSS3
  7. MongoDB安装、配置和基本使用
  8. 《JavaScript高级程序设计》第6章 面向对象程序设计
  9. ubuntu安装jira步骤
  10. FoxMail邮件设置
  11. react-native-table-component, react-native 表格
  12. 微信小程序(一)快递查询
  13. rod cutting
  14. django通用视图(类方法)
  15. SpringMVC-DispatcherServlet配置(Spring-servlet.xml)
  16. bzoj3491: PA2007 Subsets
  17. 【May Be DNK】JSON.parse() and JSON.stringify()的两个实用技巧
  18. python 入门基础22 --复习 面向对象
  19. 浅谈Android View滑动冲突
  20. POJ-1129 Channel Allocation (DFS)

热门文章

  1. C++类使用static小例子(新手学习C++)
  2. JOIN ,LEFT JOIN ,ALL JOIN 等的区别和联系
  3. eclipse4.3 解决没有check out as maven project
  4. Java 快速失败( fail-fast ) 安全失败( fail-safe )
  5. linux 一个超简单的makefile
  6. Android设备adb授权的原理【转】
  7. YTU 2424: C语言习题 字符串比较
  8. js程序开发-1
  9. Python-Django使用MemcachedCache缓存
  10. JAVA 布局控制