bitset优化

news/2024/11/24 9:22:27/

bitset优化背包
d p i , k ∣ = d p i − 1. k − j ∗ j dp_{i,k}|=dp_{i-1.k-j*j} dpi,k=dpi1.kjj 其中 i i i代表到第 i i i个区间,选完数得到的平方和为 k k k 这种情况是否存在
j j j表示第 i i i次选数为 j j j

枚举 i , j , k i,j,k i,j,k时间复杂度为 O ( n l 3 ) O(nl^3) O(nl3)

用bitset表示dp中的第二维,将枚举 k k k这一部分 O ( l 2 ) O(l^2) O(l2)优化为 O ( l 2 / 64 ) O(l^2/64) O(l2/64)

std::bitset<1000005> dp[105];
void solve()
{int n;cin>>n;std::vector<int> l(n+1),r(n+1);for (int i=1;i<=n;i++)std::cin>>l[i]>>r[i];dp[0][0]=1;for (int i=1;i<=n;i++)for (int j=l[i];j<=r[i];j++)dp[i]|=dp[i-1]<<(j*j);std::cout<<dp[n].count();
}

简单字符串问题
暴力枚举中心点 O ( n 2 ) O(n^2) O(n2),用两个bitset顺逆标记每个字母所在的位置上,之后直接枚举中心点,利用位运算求重合部分数量 O ( n 2 / 64 ) O(n^2/64) O(n2/64)

char a[100005];
void solve(){int n;cin>>n;vector<bitset<100000>> vis1(26),vis2(26);for (int i=0;i<n;i++){cin>>a[i];vis1[a[i]-'a'][i]=1;vis2[a[i]-'a'][n-i-1]=1;}ll ans=0;for (int i=0;i<n;i++){ans+=((vis2[a[i]-'a']>>(n-i))&(vis1[a[i]-'a']>>(i+1))).count();}cout<<ans<<"\n";
}

CF333E Summer Earnings
暴力做法直接枚举三个点,看最小的一条边,不断更新最大值 O ( n 3 ) O(n^3) O(n3)

换种角度:考虑枚举某个三角形中最小的边(两点),判断是否存在另一点到两点的距离大于此边

转换一下,先求出所有的边,然后进行从小到大排序,不断加边。如果当前加的这条边(枚举的最小的边)的两端点 x , y x,y x,y,存在合法的另外一点 z z z(此前存在 x x x z z z, y y y z z z的两条边),则该边即为答案

如果用数组打标记,枚举 z z z的方法,复杂度仍为 O ( n 3 ) O(n^3) O(n3)
所以用bitset代替数组,直接用位运算和count判断是否存在某个 z z z 复杂度降为 O ( n 3 / 64 ) O(n^3/64) O(n3/64)

struct segment{int x,y;double len;
};
double road(int x1,int y1,int x2,int y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main(){int n;cin>>n;vector<int> ax(n+1),ay(n+1);for (int i=1;i<=n;i++){cin>>ax[i]>>ay[i];}vector<segment> b;for (int i=1;i<=n;i++){for (int j=i+1;j<=n;j++){b.push_back({i,j,road(ax[i],ay[i],ax[j],ay[j])});}}sort(b.begin(),b.end(),[&](segment i,segment j){return i.len>j.len;});vector<bitset<3005>> vis(n+1);for (auto i:b){if ((vis[i.x]&vis[i.y]).count()){cout<<fixed<<setprecision(9)<<(double)(sqrt(i.len)/2);return 0;}vis[i.x][i.y]=1;vis[i.y][i.x]=1;}return 0;
}

http://www.ppmy.cn/news/75213.html

相关文章

使用Ceph对象存储的Amazon S3接口(基于nautilus版本)

使用Ceph对象存储的Amazon S3接口&#xff08;基于nautilus版本&#xff09; Ceph是一个分布式存储系统&#xff0c;提供了多种数据存储方式&#xff0c;包括对象存储。Amazon S3是一个流行的对象存储服务&#xff0c;Ceph提供了Amazon S3接口的兼容性&#xff0c;使得Ceph可以…

Chrome 的骑士盾,谷歌 Security Princess 访谈

童话故事里的公主都有一种需要被保护的感觉&#xff0c;就像马里奥大叔在这么多年来都要在库巴手上拯救出碧姬公主一样。不过在谷歌的这位 Security Princess 却手执盾牌&#xff0c;守护着大家的 Chrome 浏览器免受恶意程序攻击。小编这次就乘着世界网络安全日的机会&#xff…

使用AWS S3 为同一账户拥有的源桶和目标桶配置复制

复制是在相同或跨不同 AWS 区域 的桶自动、异步地复制对象。复制操作会将源桶中新创建的对象和对象更新复制到目标桶 配置复制时&#xff0c;需要向源桶添加复制规则。复制规则定义要复制的源桶对象和存储已复制对象的目标桶。您可以创建一条规则&#xff0c;以复制桶中的所有…

Ubuntu crontab定时任务

1. crontab 相关的命令&#xff1a; 安装&#xff1a;apt-get install cron 启动&#xff1a;service cron start 重启&#xff1a;service cron restart 停止&#xff1a;service cron stop 检查状态&#xff1a;service cron status 查询cron可用的命令&#xff1a;service …

Java基础-面向对象总结(3)

本篇文章主要讲解Java面向对象的知识点 面向对象的三大特性类的扩展(抽象类,接口,内部类,枚举) 目录 面向对象和面向过程的区别? 面向对象的五大基本原则 面向对象三大特性 继承 怎么理解继承 ? 继承和聚合的区别&#xff1f; 封装 多态 什么是多态 什么是运行时多…

David Silver Lecture 9:Exploration and Exploitation

1 Introduction 1.1 Outline 1.1.1 Exploration vs. Exploitation Dilemma 1.1.2 examples 1.1.3 principles Naive Exploration 在前面的章节主要使用的是naive exploration的方法Optimistic Initialisation 这种方法的思想是&#xff0c;我们对每个动作的奖励给出一个乐观的…

红旗软件正式发布龙蜥社区版国产高可靠操作系统

近日&#xff0c;北京红旗软件有限公司&#xff08;以下简称“红旗软件”&#xff09;作为龙蜥社区的理事单位&#xff0c;经过长时间的打磨&#xff0c;正式发布了一款龙蜥社区版操作系统——Red Flag Anolis Linux V8.5 &#xff0c;为广大用户提供安全、稳定、高性能、高可靠…

express的使用(二) response的常用类型

文章链接&#xff1a;express的使用(二) response的常用类型,欢迎关注订阅号&#xff0c;提供更多技术文章 看前提示 在开发中&#xff0c;很多时候我们不需要写中间件&#xff0c;比较多的时候是做一个api接口&#xff0c;但是api接口的类型有很多&#xff0c;比如文章下载&…