HDU6072 Logical Chain
题意:动态修改图 \(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
HDU6072 Logical Chain的更多相关文章
- 【hdu6072】Logical Chain
Kosaraju算法,然後bitset優化 主要是學習一下自寫bitset的姿勢 #include<cstring> #include<algorithm> #include& ...
- HDU 6072 Logical Chain(Kosaraju+bitset)
http://acm.hdu.edu.cn/showproblem.php?pid=6072 题意: 给你$n*n$的矩阵,每次修改k条边,让你计算其中能相互到达的点对有多少. 思路: 其实就是求强连 ...
- Linux命令:read
在shell中,内建(builtin)命令read,格式如下: read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] ...
- man bash
BASH(1) General Commands Manual BASH(1) NAME bash - GNU Bourne-Again SHell SYNOPSIS bash [options] [ ...
- bash5.0参考手册
Bash Reference Manual a.summary-letter { text-decoration: none } blockquote.indentedblock { margin-r ...
- [DFNews] Cellebrite UFED Logical/Physical Analyzer 3.8.1 维护性更新
Maintenance Release Cellebrite has released a maintenance version of UFED Physical / Log ...
- LVM Linear vs Striped Logical Volumes
转自:https://sysadmincasts.com/episodes/27-lvm-linear-vs-striped-logical-volumes About Episode - Durat ...
- Life of an Oracle I/O: tracing logical and physical I/O with systemtap
https://db-blog.web.cern.ch/blog/luca-canali/2014-12-life-oracle-io-tracing-logical-and-physical-io- ...
- PatentTips - Data Plane Packet Processing Tool Chain
BACKGROUND The present disclosure relates generally to systems and methods for providing a data plan ...
随机推荐
- Ubuntu下载搜狗输入法
实在...因为百度上写的就很好了,所以这里就直接“链”了.. https://jingyan.baidu.com/article/2d5afd6933a67b85a2e28e9f.html
- 【LEETCODE】41、905. Sort Array By Parity
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- Huawei重新开启隐藏桌面功能
在HUAWEI的EMUI系统7.0的时候我们都能发现桌面上靠手指操作的隐藏桌面的功能,像这样: 但是在之后的EMUI8.0.9.0,之后就没有办法用了.后来问了官方,这个功能确实是被去掉了.个人也很不 ...
- idea单行注释优化成不在行首注释
- Install Gnome desktop
Install Gnome desktop http://www.dinggd.com/index.php/freebsd-8-0-rc1-gnome%E6%A1%8C%E9%9D%A2%E5%AE% ...
- UML系列——OO Unit4分析和学期总结
一.本单元的架构设计 1.类图 第一次 第二次 2.关键方法和架构简述 总体而言是读取图的时候就完成大部分计算(完成缓存),调用查询方法时只是展示计算的结果,少部分直接计算.主要是设计了各种自己定义的 ...
- 【转载】C#使用Math.Ceiling方法对计算结果向上取整操作
在C#的数值运算中,有时候需要对计算结果进行向上取整操作,支持设定结算结果的有效位数,Math.Ceiling方法是C#中专门用来对数值进行向上取整的方法,此方法和Math.Round方法.Math. ...
- Tomcat - 控制台乱码
1.找到${CATALINA_HOME}/conf/logging.properties 2.找到java.util.logging.ConsoleHandler.encoding = UTF-8 修 ...
- Android数据存储原理分析
Android上常见的数据存储方式为: SharedPreferences是 Android 中比较常用的存储方法,本篇将从源码角度带大家分析一下Android中常用的轻量级数据存储工具SharedP ...
- PCM音频数据格式介绍
http://blog.csdn.net/ljxt523/article/details/52068241 1. What is PCM? PCM(Pulse-code-modulation)是模拟信 ...