学习笔记19:牛客寒假训练营(DFHJK)

D

数组长度为2*1e5 ,我们知道如果超过30个非(-1,1)的数字相乘一定是大于查询的值域的

所以如果超过60(30*2)个数字,那么一定不能构成查询的数,而如果小于60个则可以暴力预处理一下,求出并记录,每个值变化时数组的乘积,在查询中直接查询

需要注意的是0是一定可以达到的,只需把一个数变成0,那么数组的乘积都是0

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010;
int a[N];int n,q;
map<int,int>mp;void solve(){cin>>n>>q;set<int>s;for(int i=1;i<=n;i++){cin>>a[i];s.insert(a[i]);} int t=sqrt(1e9)+1;if(s.size()<=60){for(auto c:s){for(int j=c-t;j<=c+t;j++){int res=1;for(int i=1;i<=n;i++){res=res*(a[i]-j);if(abs(res)>1e9) break;}if(abs(res)<=1e9)mp[res]=1;}}}mp[0]=1;int m;while(q--){cin>>m;if(mp.count(m)) cout<<"Yes\n";else cout<<"No\n";}
}
signed main(){int t=1;//cin>>t;while(t--){solve();}
}

F

第二类斯特林数模板

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010,mod=1e9+7;
int a[N],v[N],w[N],ans[N];
int in[N],inv[N];
int n,m;
int qmi(int a,int b){int res=1;while(b){if(b&1) res=(res*a)%mod;a=(a*a)%mod;b>>=1;}return res;
}
void inti(){int res=1;in[0]=1;for(int i=1;i<=N;i++){in[i]=(in[i-1]*i)%mod;}
}
void solve(){cin>>n>>m;inti();int ans=0;for(int i=0;i<=m;i++){ans=(ans+(qmi(-1,m-i)*qmi(i,n))%mod*qmi(in[i]*in[m-i]%mod,mod-2))%mod;}cout<<ans<<endl;
}
signed main(){int t=1;while(t--){solve();}
}

H

让我们看这样一个二进制数

10010100

我们可以O(n)求出它对应的数组的和

如何考虑更优解

我们注意到如果把最高位的1改成0,我们就可以把更低的位全部变成1

10010100 => 01111111

这么做的贡献为所有 

\sum a[i] | 01111111=01111111

减去所有\sum a[i] &10000000=10000000

这样我们可以尝试去掉每一位1,然后O(n)求一下和,取最大值即是答案

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010;
int a[N],v[N],w[N],ans[N];int n,m;
int get(int x){int res=0;for(int i=1;i<=n;i++){if((w[i]&x)==w[i]) res+=v[i];}return res;
}
void solve(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>v[i]>>w[i];} int ans=get(m);for(int i=m;i;i-=(i&(-i))){ans=max(ans,get(i-1));}cout<<ans<<endl;
}
signed main(){int t=1;cin>>t;while(t--){solve();}
}

J

奇妙的二分

枚举最大距离

二分的过程中尝试

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010;
int a[N];void solve(){int x,y,w;int n;cin>>n>>x>>y;for(int i=1;i<=n;i++){cin>>a[i];}auto check=[&](int d){int last=y;set<int>s;if(abs(x-y)<=d) s.insert(x);for(int i=1;i<=n;i++){if(s.size() &&  abs(a[i]-last)<=d) s.insert(last); while(s.size() && *s.begin()<a[i]-d) s.erase(s.begin());while(s.size() && *s.rbegin()>a[i]+d) s.erase(*s.rbegin());last=a[i];}return s.size();};int l=0,r=1e9+1;while(l<r){int mid=l+r>>1;if(!check(mid)){l=mid+1;}else{r=mid;}}cout<<l<<endl;
}
signed main(){int t=1;while(t--){solve();}
}

K

模拟一下可知

部分题目连接在一起可以形成一个环(加上其他连向环的边形成基环树,这里如果环内确定下来,那么环外的选择就已经确定了,可以反推,所有只需要考虑环内的数量即可),如果环头和环尾不一致则不成一个方案。

我们直接从环上的点开始模拟,依次求出每个选择是否可行(根据上文的方法)

求出所有环的方案数相乘即是答案

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010,mod=998244353;
int a[N],d[N];
bool st[N];
string str[N];
void solve(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i]>>str[i];d[a[i]]++;}queue<int>q;for(int i=1;i<=n;i++){if(!d[i]) q.push(i);}while(q.size()){int t=q.front();q.pop();st[t]=1;if(--d[a[t]]==0){q.push(a[t]);}}int ans=1;for(int i=1;i<=n;i++){if(st[i]) continue;//cout<<i<<endl;int res=0;for(int j=0;j<5;j++){int now=i;st[now]=1;int nowop=j;while(1){nowop=str[now][nowop]-'A';now=a[now];st[now]=1;if(now==i)break;}if(nowop==j)res++;}ans=(ans*res)%mod;}cout<<ans<<endl;}
signed main(){int t=1;//cin>>t;while(t--){solve();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470008.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenSource - 一站式自动化运维及自动化部署平台

文章目录 orion-ops 是什么重构特性快速开始技术栈功能预览添砖加瓦License orion-ops 是什么 orion-ops 一站式自动化运维及自动化部署平台, 使用多环境的概念, 提供了机器管理、机器监控报警、Web终端、WebSftp、机器批量执行、机器批量上传、在线查看日志、定时调度任务、应…

php基础学习之函数

基本概念 是一种语法结构&#xff0c;将实现某一个功能的代码块封装到一个结构中&#xff0c;从而实现代码的重复利用 php函数的定义语法 &#xff08;与C/Java很类似&#xff0c;区别在于没有数据类型&#xff0c;因为php是弱类型语言&#xff09; function 函数名(参数){ //…

代码随想录算法训练营第50天 | 70.爬楼梯(进阶) + 322.零钱兑换 + 279.完全平方数

今日任务 70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数 70.爬楼梯(进阶) - Easy 题目链接&#xff1a;题目页面 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&a…

软件风险分类整理

软件项目风险分类整理 1.需求分析 2.软件设计 3.编码和单元测试 4.集成和测试 5.验收和维护 6.团队管理 7.成本管理 8.组织管理

【网站项目】228高校教师电子名片系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

第13讲创建图文投票

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b;、 <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&…

vuex中Actions详解,代码示例

Vuex 中的 Actions 是用于触发mutations 的一种方式&#xff0c;它可以包含异步操作&#xff0c;并通过提交(commit)mutations 来改变 store 的状态。以下是 Actions 的详细介绍、使用步骤和示例代码&#xff1a; Actions 的介绍&#xff1a; Actions 是 Vuex 中的一个重要概…

chatglm3-6b使用

源码地址 GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 创建环境 conda create -n chatglm36 python3.11.7 修改源码中依赖&#xff0c;使得使用cuda&#xff0c;否则太慢了 pip3 install torch2.1.2 torchvision0.16.2 to…

imazing怎么连接苹果手机

imazing怎么连接苹果手机 要连接苹果手机&#xff0c;您可以选择使用数据线或无线网络&#xff08;Wi-Fi&#xff09;两种方式。以下是具体的步骤&#xff1a; 使用数据线连接&#xff1a; 准备工具&#xff1a;确保您的Mac或Windows电脑已经安装了iMazing软件&#xff0c;并且…

神经网络:卷积介绍及代码实现

传统卷积运算是将卷积核以滑动窗口的方式在输入图上滑动&#xff0c;当前窗口内对应元素相乘然后求和得到结果&#xff0c;一个窗口一个结果。相乘然后求和恰好也是向量内积的计算方式&#xff0c;所以可以将每个窗口内的元素拉成向量&#xff0c;通过向量内积进行运算&#xf…

波奇学Linux:文件系统

磁盘认识 磁盘被访问的基本单元是扇区-512字节。 磁盘可以看成多个同心圆&#xff0c;每个同心圆叫做磁道&#xff0c;多个扇区组成同心圆。 我们可以把磁盘看做由无数个扇区构成的存储介质。 要把数据存到磁盘&#xff0c;先定位扇区&#xff0c;用哪一个磁头&#xff0c;…

辗转相除法和同余原理

辗转相除法和同余原理 辗转相除法同余原理 辗转相除法 辗转相除法就是用来求出两个数的最大公约数的方法&#xff0c;那么这个方法怎么用呢&#xff1f;举个例子&#xff1a;有两个数&#xff0c;a12,b8&#xff0c;要求这两个数的最大公约数&#xff0c;首先让a%b得到4&#x…