题意:动态修改图 \(G\) 的边集,求每次修改后的 \(\sum c\times (c−1) / 2\) (记每个强连通分量中的点数量为 \(c\) )。其中修改操作共 \(m\) 次,每次最多改 \(k\) 条边。\(1≤m≤25000,1≤k≤10\),图 \(G\) 中点数为 \(n\) ,\(1≤n≤250\)。

题解:\(tarjan\)由于要遍历所有边,复杂度 \(\mathcal{O}((V+E)\times m)\),在稠密图中效率较低;而使用邻接矩阵存储边集状态,利用 \(Kosaraju\) 解决的复杂度将达到 \(\mathcal{O}(V^2\times m)\) ,然后可以利用 bitset 优化边集的存储,加速后继点的查找,复杂度 \(\mathcal{O}(\frac{V^2\times M}{32})\)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char s; while(!isdigit(s=getchar())) f=s=='-'?-1:f;
do x=x*10+(s^48); while(isdigit(s=getchar())); return x*f;
} const int B=8,D=5,L=31,N=260;
struct bitset {
unsigned dat[B];
inline void reset() {memset(dat,0,B<<2);}
inline void set() {memset(dat,0xff,B<<2);}
inline void set(int x) {dat[x>>D]|=1u<<(x&L);}
inline void flip(int x) {dat[x>>D]^=1u<<(x&L);}
inline bool test(int x) {return dat[x>>D]>>(x&L)&1;}
}vis,e[N],re[N];
vector<int> s;
int n,m,num,T;
#define u32 unsigned
inline void dfs1(int u) {
vis.flip(u);
for(R i=0;i<B;++i) {
while(20040109) {
register u32 tmp=vis.dat[i]&e[u].dat[i];
if(!tmp) break;
dfs1(i<<D|__builtin_ctz(tmp));
}
} s.push_back(u);
}
inline void dfs2(int u) {
vis.flip(u),++num;
for(R i=0;i<B;++i) {
while(20021204) {
register u32 tmp=vis.dat[i]&re[u].dat[i];
if(!tmp) break;
dfs2(i<<D|__builtin_ctz(tmp));
}
}
}
inline void Kosaraju() {
s.clear(),vis.set(); R ans=0;
for(R i=0;i<n;++i) if(vis.test(i)) dfs1(i);
vis.set(); for(R i=n-1;~i;--i) {
if(vis.test(s[i])) {
num=0;
dfs2(s[i]);
ans+=num*(num-1)/2;
}
} printf("%d\n",ans);
}
inline void main() {
T=g(); while(T--) {
n=g(),m=g();
for(R i=0;i<n;++i) e[i].reset(),re[i].reset();
for(R i=0;i<n;++i) { register char s[N];
scanf("%s",s);
for(R j=0;j<n;++j) if(s[j]=='1')
e[i].flip(j),re[j].flip(i);
}
while(m--) { R t=g();
while(t--) { R u,v;
u=g(),v=g();
e[u-1].flip(v-1),re[v-1].flip(u-1);
} Kosaraju();
}
}
}
} signed main() {Luitaryi::main(); return 0;}

2019.12.18

最新文章

  1. ubuntu15.04 nginx1.6.5 配置虚拟主机
  2. 利用C#自带组件强壮程序日志
  3. 在计算机 . 上没有找到服务 WAS
  4. EL算术表达式
  5. c :set标签的陷阱(未解决)
  6. ckeditor插件
  7. angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
  8. 三种JS方法确定元素在数组中的索引值
  9. Topcoder SRM583 DIV 2 250
  10. Excel Interactive View - 让页面表格的功能更强大
  11. CSS打造经典鼠标触发显示选项
  12. Innodb中的事务隔离级别和锁的关系(转)
  13. SGU 185.Two shortest (最小费用最大流)
  14. hdu 1502 Regular Words_高精度+dp
  15. Mybatis+Struts2的结合:实现用户插入和查找
  16. iOS解析crash日志:
  17. java继承与覆写小练习
  18. Mock测试接口
  19. Linux确认网口对应配置文件
  20. SAP自开发程序

热门文章

  1. gorm 处理时间戳
  2. H5新特性 本地存储---cookie localStorage sessionStorage
  3. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 错误解决
  4. java 堆 排序学习
  5. C# vb实现浮雕特效滤镜效果
  6. css3可拖动的魔方3d
  7. flutter报错--ProcessException: Process... gradlew.bat ...exited abnormally
  8. Duplicate zip entry [com/umeng/analytics/a.class==analytics-5.5.3.jar:com/umeng/analytics/AnalyticsConfig.class
  9. Map转url ,url转Map工具类
  10. kubernetes 配置网络插件 flannel