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

news/2025/1/15 22:08:57/

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.ppmy.cn/news/1351817.html

相关文章

【MATLAB】PSO_BP神经网络回归预测(多输入多输出)算法原理

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO-BP神经网络回归预测&#xff08;多输入多输出&#xff09;算法是一种结合粒子群优化算法&#xff08;PSO&#xff09;和反向传播&#xff08;BP&#xff09;神经网络的混合算法。该算…

【小沐学GIS】基于Python绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

基金分类

一、按基金运作方式分类 &#xff08;一&#xff09;封闭式基金 是基金份额总额在期限内固定不变&#xff0c;在期限内不可申购和赎回。 &#xff08;二&#xff09;开放式基金 是基金份额总额不固定&#xff0c;在期限内可以申购和赎回。 这里的开放式基金特指传统的开放式基…

变形金刚:第 2 部分:变形金刚的架构

目录 一、说明 二、实现Transformer的过程 第 1 步&#xff1a;代币化&#xff08;Tokenization&#xff09; 第 2 步&#xff1a;对每个单词进行标记嵌入 第 3 步&#xff1a;对每个单词进行位置嵌入 第 4 步&#xff1a;输入嵌入 第 5 步&#xff1a;编码器层 2.5.1 多头自注…

浅谈Linux环境

冯诺依曼体系结构&#xff1a; 绝大多数的计算机都遵守冯诺依曼体系结构 在冯诺依曼体系结构下各个硬件相互配合处理数据并反馈结果给用户 其中控制器和运算器统称为中央处理器&#xff08;CPU&#xff09;&#xff0c;是计算机硬件中最核心的部分&#xff0c;像人类的大脑操控…

steam游戏搬砖项目靠谱吗?有没有风险?

作为一款fps射击游戏&#xff0c;csgo在近几年可谓是火出圈&#xff0c;作为一款全球竞技游戏&#xff0c;深受玩家喜爱追捧&#xff0c;玩家追求的就是公平公正&#xff0c;各凭本事&#xff0c;像其他游戏可能还会有皮肤等装备属性加成&#xff0c;在csgo里面是不存在的。 纯…

gorm day7

gorm day7 gorm Belongs To关系gorm Has One关系 gorm Belongs To关系 在看文档之前先进行一些基本概念的学习&#xff1a; 什么是主键&#xff1f;&#xff08;Primary Key) 主键是一个表中的特定列&#xff08;或一组列&#xff09;&#xff0c;用来唯一标识表中的每一行记…

Java安全 CC链6分析

CC链6分析 前言CC链分析核心transform链Lazymap类TiedMapEntry类HashMap方法 最终exp 前言 CC链6不受jdk版本与cs版本的影响&#xff0c;在Java安全中最为通用&#xff0c;并且非常简洁&#xff0c;非常有学习的必要&#xff0c;建议在学习CC链6之前先学习一下 URLDNS链 和 CC…