ps:最近碰到一些用bitset优化常数的题目,以前也有接触但是都没有记下来,所以来写一篇博文 记录以后碰到的类似的题目。


应用一: 优化boolean multiplication

在做dp的时候,有时候会需要将两个dp矩阵相乘,且矩阵的元素都是bool型。

计算矩阵A*B=C     C[i,j]=1 当且仅当存在k,A[i,k]=1 && B[k][j]=1 。

直接算需要O(n3)的时间。可以用bitset 优化常数。 做法如下:

 bitset<N> A[N],B[N],C[N];

 void Multi(bitset<N> A[],bitset<N> B[],bitset<N> C[])
{
for (int i=;i<N;i++)
{
for (int j=;j<N;j++)
{
if (A[i][j]) C[i]|=B[j];
}
}
}

大致思想是:

如果A[i][j]=1,  C[i][k] |= A[i][j] & B[j][k]    <->  C[i][k] |= B[j][k]     相当于把B的第j行拿去 和C的第i行做一次或操作。

题目:

http://codeforces.com/contest/781/problem/D

该题的dp矩阵是boolean矩阵,转移的时候可以用bitset来优化boolean multiplication。

 #include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <cmath>
#include <set>
#include <bitset>
using namespace std; typedef long long ll; #define N 510 bitset<N> dp[][][N]; int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout); int n,m,x,y,z;
scanf("%d%d",&n,&m);
while (m--)
{
scanf("%d%d%d",&x,&y,&z);
x--,y--,dp[][z][x][y]=;
} for (int l=;l<=;l++)
{
for (int i=;i<n;i++)
{
for (int j=;j<n;j++)
{
if (dp[l-][][i][j]) dp[l][][i]|=dp[l-][][j];
if (dp[l-][][i][j]) dp[l][][i]|=dp[l-][][j];
}
}
}
ll ans=; set<int> S; S.insert();
for (int l=,w=;l>= && ans<=1e18;l--)
{
set<int> SS;
for (set<int>::iterator iter=S.begin();iter!=S.end();iter++)
{
int x=*iter;
for (int j=;j<n;j++) if (dp[l][w][x][j]) SS.insert(j);
}
if (!SS.empty()) ans+=1ll<<l,S=SS,w^=;
}
if (ans>1e18) ans=-;
printf("%I64d\n",ans);
return ;
}

待补充...

bitset在acm中的应用的更多相关文章

  1. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  2. C++ STL泛型编程——在ACM中的运用

    学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应 ...

  3. 关于 矩阵在ACM中的应用

    关于矩阵在ACM中的应用 1.矩阵运算法则 重点说说矩阵与矩阵的乘法,不说加减法. 支持: 结合律  (AB)C = A(BC) 分配律 A(B+C) = AB + AB $\left( \lambd ...

  4. Java在ACM中的应用

    Java在ACM中的应用 —. 在java中的基本头文件(java中叫包) import java.io.*; import java.util.*; //输入Scanner import java. ...

  5. IO/ACM中来自浮点数的陷阱(收集向)

    OI/ACM中经常要用到小数来解决问题(概率.计算几何等),但是小数在计算机中的存储方式是浮点数而不是我们在作数学运算中的数,有精度的限制. 以下以GUN C++为准,其他语言(或编译器)也差不了多少 ...

  6. ACM中的浮点数精度处理

    在ACM中,精度问题非常常见.其中计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了.精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,让你debu ...

  7. ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏

    ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...

  8. ACM中Java的应用

    先说一下Java对于ACM的一些优点吧: (1) 对于熟悉C/C++的程序员来说Java 并不难学,两周时间基本可以搞定一般的编程,再用些时间了解一下Java库就行了.Java的语法和C++非常类似, ...

  9. 从ACM中删除一个已经创建的Library

    从ACM中删除一个已经创建的Library,无法通过界面操作,须要手工从DB中删除.须要删除的表记录有: RECENTUPDATE 找到字段Name等于该libraryName的那条记录删除掉 del ...

随机推荐

  1. css的checkbox样式变化

    1.CSS body{font-family:'微软简行楷'} ul li{list-style:none; margin:10px;color:#4985d7;} .myCheck { displa ...

  2. OpenGL ES 3.0之Fragment buffer objects(FBO)详解 (转)

    http://www.cnblogs.com/salam/p/4957250.html 片段操作图 这篇文章将介绍从写入帧缓冲和读取帧缓冲的方式. Buffers(缓冲) OpenGL ES支持三种缓 ...

  3. 大话JS神器之Promise

    前段时间的工作中,由于项目要在前端实现存储,于是便使用了websql,而websql的API涉及到了很多的异步问题,如果采取回调函数的方式处理,代码不够优雅,而且不利于理解,于是便找到了Promise ...

  4. mssql性能优化

    总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORA ...

  5. Android中Service概述

    Service是Android中一种非常重要的组件,一般来说有两种用途:用Service执行长期执行的操作,而且与用户没有UI界面的交互:某个应用程序的Service能够被其它应用程序的组件调用以便提 ...

  6. .sh文件怎么安装?

    实例:sh java_1.8.0.sh示例:sh filename.sh

  7. rabbitMq视频教程

    http://edu.51cto.com/index.php?do=lesson&id=83136

  8. python重置变量 sys.defaultencoding

    <span style="font-family: Arial, Helvetica, sans-serif;">比如重置变量defaultencoding为utf-8 ...

  9. hiredis中异步的实现小结

    hiredis中异步的实现小结 原文: http://blog.csdn.net/l1902090/article/details/3858... 时间: 2014-08-15 前言 一般情况下我们使 ...

  10. ExCEL操作技巧集锦,持续更新

    1.格式刷 word里面格式化的快捷键很好用,但是excel里面的快捷键用不了,经百度得知: excel双击格式化按钮,可以开启连续应用格式刷模式,单击之后关闭,这样比快捷键好用多了,如下图