bitset优化例题

2023-11-11

1. bitset 优化背包 

https://loj.ac/p/515

题意:

给 n 个 <= n 的数,每个数有取值范围 a[ i ] - b[ i ],令 x 为 n 个数的平方和,求能构成的 x 的个数

样例:

5
1 2
2 3
3 4
4 5
5 6

 26

思路:

背包dp,dp[ i ][ j ] 表示用前 i 个数能不能组成 j ,用 bitset 优化

用一个 bitset dp 维护 当前的数 可以组成哪几个 x ,用 bitset tmp 维护 当前的状态 可以转移到哪几个状态,滚动优化空间,复杂度为O(n^5 / 64)

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=1e6+5;
bitset<N>dp,tmp;

void solve(){
    int n;
    cin>>n;
    dp.set(0);    //初始化
    for(int i=1;i<=n;i++){
        int a,b;
        cin>>a>>b;
        tmp.reset();
        for(int j=a;j<=b;j++){
            tmp|=(dp<<(j*j));
        }
        dp=tmp;
    }
    cout<<dp.count()<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

2. bitset 优化图上问题(可达性统计问题)

https://www.acwing.com/problem/content/166/

题意:

给一个 n 个点,m 条边的 有向无环图,求每个点能到达的 点的个数

样例:

10 10
3 8
2 3
2 5
5 9
5 9
2 3
3 9
4 8
2 10
4 9

1
6
3
3
2
1
1
1
1

思路:

反向建图,然后利用 拓扑排序,进行图上dp,dp[ i ][ j ]表示从点 i 出发能不能到达 点 j ,用 bitset优化,若存在 u - > v 的边,则 dp[ u ] | = dp[ v ]

复杂度为 O(n^2 / 64)

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=3e4+5;

int head[N],cntt=0;
struct Edge{
    int to,next,val;
}edge[N];
void add(int u,int v,int x){
    edge[++cntt].to=v;
    edge[cntt].val=x;
    edge[cntt].next=head[u];
    head[u]=cntt;
}

int deg[N];
bitset<N>dp[N];
void solve(){
    int n,m;
    cin>>n>>m;
    while(m--){
        int u,v;
        cin>>u>>v;
        add(v,u,1);
        deg[u]++;
    }
    queue<int>q;
    for(int i=1;i<=n;i++){
        dp[i][i]=1;
        if(deg[i]==0)q.push(i);
    }
    while(!q.empty()){
        int tmp=q.front();
        q.pop();
        for(int i=head[tmp];i;i=edge[i].next){
            int y=edge[i].to;
            dp[y]|=dp[tmp];
            deg[y]--;
            if(deg[y]==0)q.push(y);
        }
    }
    for(int i=1;i<=n;i++)cout<<dp[i].count()<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

3. bitset 优化枚举

https://codeforces.com/contest/333/problem/E

题意:

给 n 个点,找 3 个点,以这三个点为圆心,画 3 个半径相同互不相交的圆,求最大的半径

可以转化为,给 n 个点,找出 最小边最大 的三角形,求最大的最小边

思路:

将所有边按边长降序排列,依次枚举当前边作为最小边,然后枚举其它点,若存在某点 和 当前的边的两个点都已经连有边(即存在以当前边为最小边的三角形),则找到答案,否则连上这条边

直接枚举的复杂度是 O ( n^3 ) ,可以用一个标记数组 vis [ i ] [ j ] 表示有没有 i - j 的边,用 bitset 优化这个数组,每次 对于 x-y 的边,通过 vis[x] & vis[y] 可以在 O ( n/64 ) 时间内快速判断有没有符合条件的点,在 O ( n^3/64 ) 复杂度下通过本题

样例:

7
2 -3
-2 -3
3 0
-3 -1
1 -2
2 -2
-1 0

1.58113883008418980000 

代码:

#include<bits/stdc++.h>
using namespace std;

const int N=3e3+5;

double x[N],y[N];
double length(int a,int b){
    return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
struct node{
    int x,y;
    double len;
    bool operator<(const node a)const{
        return len>a.len;
    }
};
vector<node>edge;
bitset<N>vis[N];
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            edge.push_back((node){i,j,length(i,j)});
        }
    }
    sort(edge.begin(),edge.end());
    for(auto e:edge){
        int x=e.x,y=e.y;
        double len=e.len;
        if((vis[x]&vis[y]).any()){
            cout<<fixed<<setprecision(8)<<len/2<<endl;
            return;
        }
        vis[x].set(y);
        vis[y].set(x);
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

4. bitset 优化 01 矩阵乘法

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

题意:

给一张无向图,求图中有多少个 下图形状的子图

思路:

对无向图建邻接矩阵,对邻接矩阵进行平方,新矩阵 a[ i ] [ j ] 表示 从 i 点到 j 点 长为2的路径个数,枚举子图中 度为6和4的两个点,通过组合数计算子图数量即可,复杂度为 O(n^3)

利用 bitset 优化,01矩阵的平方 可以通过 b [ i ] [ j ] = ( r [ i ] & c [ j ] ) . count () 计算,由于无向图的邻接矩阵是 对称矩阵,所以直接用 ( vis [ i ] & vis [ j ] ) . count () 表示矩阵平方,复杂度为 O(n^3/64)

样例:

1

8 10

1 2

1 3

1 4

1 5

1 6

1 7

8 4

8 5

8 6

8 7

1

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

inline int read(){  //快读快写
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x;
}
inline void write(int x){
    if(x>9)write(x/10);
    putchar(x%10+'0');
}

const int N=1005;
const int mod=1e9+7;

int fact[N],inv[N];        //O(1)求组合数
inline int qpow(int a,int b){
    int ans=1;
    while(b>0){
        if(b&1)
        ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
void Cinit(){
    fact[0]=1,inv[0]=1;
    for(int i=1;i<=N-1;i++){
        fact[i]=fact[i-1]*i%mod;
    }
    inv[N-1]=qpow(fact[N-1],mod-2)%mod;
    for(int i=N-2;i>=1;i--){
        inv[i]=inv[i+1]*(i+1)%mod;
    }
}
inline int C(int a,int b){
    if(a<0||b<0||a<b)return 0;
    return fact[a]*inv[a-b]%mod*inv[b]%mod;
}

bitset<N>vis[N];
void solve(){
    int n=read(),m=read();
    for(int i=1;i<=n;i++)vis[i].reset();
    while(m--){
        int u=read(),v=read();
        vis[u].set(v);
        vis[v].set(u);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            int cnt1=vis[i].count(),cnt2=vis[j].count();
            int cnt=(vis[i]&vis[j]).count();    // 矩阵乘
            if(vis[i][j]){      //不能选两点直接相连的边
                cnt1--,cnt2--;
            }
            ans+=C(cnt1-4,2)*C(cnt,4);
            ans%=mod;
            ans+=C(cnt2-4,2)*C(cnt,4);
            ans%=mod;
        }
    }
    write(ans);
    putchar('\n');
    return;
}


signed main(){
    Cinit();
    int T=read();
    while(T--){
        solve();
    }
    return 0;
}

5. bitset 优化 floyd

https://www.luogu.com.cn/problem/P4306

题意:

给一张有向图,求每个点能到达的点的个数的和

样例:

3
010
001
100

思路:

考虑 floyd 上 dp,dp [ i ] [ j ] 表示点 i 能到达点 j ,转移方程为 dp[ i ][ j ] |= (dp[ i ][ k ] &dp[ k ][ j ] )

用 bitset 优化转移,复杂度为 O(n^3/64) 

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=2e3+5;
bitset<N>dp[N];
void solve(){
    int n;
    cin>>n;
    vector<string>s(n+1);
    for(int i=1;i<=n;i++){
        cin>>s[i];
        s[i]=' '+s[i];
        dp[i].set(i);
        for(int j=1;j<=n;j++){
            if(s[i][j]=='1'){
                dp[i].set(j);
            }
        }
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            if(dp[i][k]){
                dp[i]|=dp[k];
            }
//            dp[i][j]|=dp[i][k]|dp[k][j];
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)ans+=dp[i].count();
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bitset优化例题 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 区块链共识算法的发展现状与展望

    区块链共识算法的发展现状与展望 袁勇等 1 传统分布式一致性算法 2 主流区块链共识算法 3 共识算法的模型与分类 4 区块链共识算法的新进展 4 1 主线 1 PoW 与 PoS 算法的有机结合 4 2 主线 2 原生 PoS 算法的改进
  • 翻转数组

    题目描述 给定一个长度为n的整数数组a 元素均不相同 问数组是否存在这样一个片段 只将该片段翻转就可以使整个数组升序排列 其中数组片段 l r 表示序列a l a l 1 a r 原始数组为 a 1 a 2 a l 2 a l 1 a l
  • 数据挖掘顶级比赛---综合整理

    整理所有可以参加的数据挖掘顶级比赛 1 DrivenData https www drivendata org 2 CrowdANALYTIX https www crowdanalytix com solutions community
  • loss-FSCE 小样本识别

    FSCE Few Shot Object Detection via Contrastive Proposal Encoding 以Faster RCNN 作为小样本目标检测的基本框架 采用两阶段的训练方法 第一阶段的训练集是大量标注的基本
  • OpenCV4 视频目标检测 场景文本检测 手写数字识别 案例

    转载 一直想找本书 能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡 让感兴趣的同学拿到就有能用的代码 还有基本原理的介绍 因为了解原理才知道什么时候用什么算法最合适 以及如何调整参数 一直没找到合适的 所以动手写了一本 p 拖
  • 片内外设、片上外设和片外外设的区别

    片内外设就是片上外设 同一种意思不同说法而已 片内外设和片外外设的区别 片内 外设是两个概念 片内指做成芯片的集成电路内部 简称片内 片外同理显而易见 外设是外部设备的简称 是指集成电路芯片外部的设备 集成电路芯片与外部设备的连接一般需要专
  • 2023.6.3 华为机试题小记(附c++题解)

    华为机试小记 导语 进阶题 堆积木 200分 思路 代码 基础题一 寻找最后一个匹配子序列的下标 100分 思路 代码 基础题二 种植白杨树 100分 思路 导语 机试一共三个题 分为两个基础题和一个进阶题 两个基础题各100分 进阶题20
  • 数字统计 题解(c++)

    先看题目 当然 你可以看原题 题目描述 请统计某个给定范围 L R L R L R 的所有整数中 数字 2 2 2 出现的次数 比如给定范围 2 22 2 22 2 22 数字 2 在数 2 中出现了 1 1 1 次 在数 12 中出现 1
  • matlab获取矩阵的行数与列数

    matlab里面与其他高级语言里面获取数据的长度length方法不一样 matlab里面通过size 矩阵变量 返回一个 行数m 列数n 比如一个m n的矩阵A 通过size A 可以得到 m n 通过size A 1 可以得到行数m 通过
  • 关于如何使用neo4j-admin工具批量导入已处理好的csv数据(neo4j 社区版 5.5)

    数据格式有两种 一个是节点 一个是关系 节点类型数据头格式 xxx ID name LABEL 关系类型数据头格式 START ID END ID TYPE 这里不多赘述关于csv数据处理的问题 可以通过搜索找相关资料 本文主要解决的问题是
  • LSTM原理图解

    在解释LSTM原理前先来理解一下RNN的原理 RNN基本原理 原理简介 当我们处理与事件发生的时间轴有关系的问题时 比如自然语言处理 文本处理 文字的上下文是有一定的关联性的 时间序列数据 如连续几天的天气状况 当日的天气情况与过去的几天有
  • sqli-labs(39关-53关)

    目录 第三十九关 第四十关 第四十一关 第四十二关 第四十三关 第四十四关 第四十五关 第四十六关 第四十七关 第四十八关 第四十九关 第五十关 第五十一关 第五十二关 第五十三关 第三十九关 id 1 and 1 1 id 1 and 1
  • 图像处理-双边滤波原理

    双边滤波 Bilateral filter 是一种可以去噪保边的滤波器 之所以可以达到此效果 是因为滤波器是由两个函数构成 一个函数是由几何空间距离决定滤波器系数 另一个由像素差值决定滤波器系数 原理示意图如下 双边滤波器中 输出像素的值依
  • Midjourney如何集成到自己(个人/企业)的平台(二)

    前面一篇写了需要准备东西 如何注册discord平台账号 如何登录discord创建个人服务器把Midjourney机器人授权添加到个人服务器中 并且开通订阅 这篇文章主要讲如何自定义机器人 设置自定义机器人 并授权添加到个人服务器中 1
  • 【Arthas】Arthas mc内存动态编译原理

    1 概述 转载 Arthas mc内存动态编译原理 2 开篇 Arthas支持通过mc命令进行java文件的内存动态编译 mc Memory Compiler 内存编译器 编译 java文件生成 class 从JDK1 6开始引入了Java
  • 手握6项特许经营权,慧居科技如何展现“光与热”?

    作为国内三北地区第二大跨省供热服务供应商 慧居科技在7月10日即将港股上市 尽管目前受经济影响 港股市场处在低迷状态 但供热行业作为公用事业板块属刚性需求 由于受经济周期影响小 经营业绩稳定 反而成为市场的优质板块 吸引了不少的资本关注 7
  • Mac 电脑鼠标和触摸板滚动方向不一致的问题【已解决】

    当我们使用鼠标连接到 MacBook 时 会发现无论怎么设置 鼠标和触摸板的滚动方向都是相反的 导致不能同时使用鼠标和触摸板 解决方法 我安装了下面的程序 它只允许您反转鼠标的滚动行为 Scroll Reverser for Mac OS
  • 【人脸生成】HiSD-通过层级风格解耦实现图到图的迁移

    Image to image Translation via Hierarchical Style Disentanglement 厦大 西交 腾讯 清晰易读 用公布的模型在自有数据上实测不及预期 但仍是值得尝试的方法 这是我看的第一篇人脸
  • SQL基础常用语句:DDL、 DML、DQL

    下面跟我一起来学习SQL基础知识 一 SQL基础与DDL 1 1 SQL的概述 SQL全称 Structured Query Language 结构化查询语言 用于访问和处理数据库的标准的计算机语言 SQL语言1974年由Boyce和Cha
  • bitset优化例题

    1 bitset 优化背包 https loj ac p 515 题意 给 n 个 lt n 的数 每个数有取值范围 a i b i 令 x 为 n 个数的平方和 求能构成的 x 的个数 样例 5 1 2 2 3 3 4 4 5 5 6 2