http://acm.hdu.edu.cn/showproblem.php?pid=6072

题意:

给你$n*n$的矩阵,每次修改k条边,让你计算其中能相互到达的点对有多少。

思路:

其实就是求强连通分量,如果一个强连通分量里有n个点,那么这里面的点对就有$n*(n-1)/2$。用Kosaraju计算即可,但是这样是会超时的,还需要用bitset来优化。

__builtin_函数中处理二进制位的函数:

int __builtin_ffs (unsigned x) 返回x中最后一个1是从右往左第几位

int __builtin_popcount (unsigned x) 返回x中1的个数

int __builtin_ctz (unsigned x) 返回x末尾0的个数(x等于0时未定义)

int __builtin_clz (unsigned x) 返回x中前导0的个数(x等于0时未定义)

int __builtin_parity (unsigned x) 返回x中1的奇偶性

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn=+; int n, m;
int num;
char s[maxn]; struct Bitset//用unsigned数组实现bitset,为了使用__builtin_ctz()
{
unsigned v[];//8个unsigned表示8*32=256位 void reset()//清零
{
for(int i=;i<;++i) v[i]=;
}
void set(int x)//把某一位设为1
{
v[x>>]|=1u<<(x&);
}
void flip(int x)//翻转某一位
{
v[x>>]^=1u<<(x&);
}
bool test(int x)//返回某一位是否为1
{
return v[x>>]>>(x&)&;
}
}vis, G[maxn], rG[maxn]; vector<int> S; void dfs1(int u)
{
vis.flip(u);
for(int i=;i<;i++)
{
while(true)
{
unsigned tmp=vis.v[i]&G[u].v[i]; //tmp就计算出了可以访问的点
if(!tmp) break;
dfs1(i<<|__builtin_ctz(tmp)); //计算出tmp末尾有多少0,有多少0就代表了它是第几位,这儿的话一个点一个点的来
}
}
S.push_back(u);
} void dfs2(int u)
{
vis.flip(u);
++num;
for(int i=;i<;i++)
{
while(true)
{
unsigned tmp=vis.v[i]&rG[u].v[i];
if(!tmp) break;
dfs2(i<<|__builtin_ctz(tmp));
}
}
} void Kosaraju()
{
S.clear();
int ans=;
for(int i=;i<n;i++) vis.set(i);
for(int i=;i<n;i++) if(vis.test(i)) dfs1(i);
for(int i=;i<n;i++) vis.set(i);
for(int i=n-;i>=;i--)
{
if(vis.test(S[i]))
{
num=;
dfs2(S[i]);
ans+=num*(num-)/;
}
}
printf("%d\n",ans);
} int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) G[i].reset(),rG[i].reset();
for(int i=;i<n;i++)
{
scanf("%s",s);
for(int j=;j<n;j++) if(s[j]=='')
{
G[i].flip(j);
rG[j].flip(i);
}
}
while(m--)
{
int t; scanf("%d",&t);
while(t--)
{
int u,v;
scanf("%d%d",&u,&v);
G[u-].flip(v-);
rG[v-].flip(u-);
}
Kosaraju();
}
}
return ;
}

HDU 6072 Logical Chain(Kosaraju+bitset)的更多相关文章

  1. HDU 3980 Paint Chain (sg函数)

    Paint Chain Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. HDU - 3980 Paint Chain(SG函数)

    https://vjudge.net/problem/HDU-3980 题意 一串长度为n的柱子,每个人只能给连续的珠子涂色,涂过的不能再涂,不能涂的人就输了,问最后谁获胜. 分析 第一个人先涂m个, ...

  3. HDU 5860 Death Sequence(死亡序列)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  4. HDU 5877 Weak Pair(弱点对)

    HDU 5877 Weak Pair(弱点对) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Jav ...

  5. HDU 5813 Elegant Construction(优雅建造)

    HDU 5813 Elegant Construction(优雅建造) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65 ...

  6. HDU 5818 Joint Stacks(联合栈)

    HDU 5818 Joint Stacks(联合栈) Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  7. HDU 2222 Keywords Search(查询关键字)

    HDU 2222 Keywords Search(查询关键字) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...

  8. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  9. HDU 4548 美素数(打表)

    HDU  4548  美素数(打表)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/H 题目 ...

随机推荐

  1. [javascript]编码&i字符串格式化&nput历史记录&清空模态框

    js中编码问题 https://www.haorooms.com/post/js_escape_encodeURIComponent 我在前端js添加时候创建dom时候,有汉字,发现是乱码就研究了下 ...

  2. django的serializers

    views.py # get所需的 from snippets.serializers import SnippetSerializer from rest_framework.views impor ...

  3. 让Logstash每次都从头读文件及常见问题

    input { file { path => ["/data/test.log"] start_position => "beginning" si ...

  4. Java多线程的下载器(1)

    实现了一个基于Java多线程的下载器,可提供的功能有: 1. 对文件使用多线程下载,并显示每时刻的下载速度. 2. 对多个下载进行管理,包括线程调度,内存管理等. 一:单个文件下载的管理 1. 单文件 ...

  5. unity3D中 material中tiling和offset属性解释

    贴图有可能是多行多列的一些图案组成的.当我们需要一帧,一帧的播放时候.也就是帧序列动画, 我们就需要用到tiling和offset两个属性, 默认图片的左下角为坐标圆点即:(0,0) tiling是图 ...

  6. html03

    快速开发指南:1.新建页面之后,编写外部样式表文件,引入到HTML页面中2.用浏览器打开页面->F12->sources->打开css文件 右边编写样式,左边查看效果3.样式编写完成 ...

  7. sql server 视图的操作

    -- 判断要创建的视图名是否存在if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[视图名]') and OBJ ...

  8. Integer类之成员变量

    一.一共11个成员变量. 二.详情介绍. 1.value值.这个是Integer类的唯一标志.最重要的实例属性. 2.最小值和最大值常量.注意,计算机里面是以补码形式保存的,因此用十六进制时,给的数据 ...

  9. SV中的数据类型

    Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real). SV扩展了reg类型为logi ...

  10. 《Convolutional Neural Network Architectures for Matching Natural Language Sentences》句子匹配

    模型结构与原理 1. 基于CNN的句子建模 这篇论文主要针对的是句子匹配(Sentence Matching)的问题,但是基础问题仍然是句子建模.首先,文中提出了一种基于CNN的句子建模网络,如下图: ...