winter week5 day5
2024牛客寒假算法基础集训营6
A
思路:暴力
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; void solve() { vector<int>pri(105); vector<int>ans; for(int i=2;i<=100;++i){ for(int j=2;j*j<=i;++j){ if(i%j==0){ pri[i]=1; break; } } } for(int i=2;i<=100;++i){ for(int j=2;j<=100;++j){ for(int z=2;z<=100;++z){ if(i*j*z>100)continue; if(i==j||i==z||j==z)continue; if(!pri[i]&&!pri[j]&&!pri[z]){ ans.push_back(i*j*z); } } } } sort(ans.begin(),ans.end()); int l,r; cin>>l>>r; auto it= std::lower_bound(ans.begin(), ans.end(),l); if(it!=ans.end()&&*it<=r)cout<<*it; else cout<<-1; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; // cin>>t; // init(); while(t--){ solve(); } return 0; }
B
思路:暴力
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; void solve() { int n; cin>>n; vector<int>a(n),b(n); for(auto &v:a)cin>>v; for(auto &v:b)cin>>v; sort(a.begin(),a.end()); int mi=3e9,p,tb; for(int i=0;i<n;++i){ auto it= std::lower_bound(a.begin(), a.end(),b[i]); int mii=3e9,k; if(it!=a.end()){ if(abs(*it-b[i])<mii)mii=abs(*it-b[i]),k=it-a.begin(); } if(it!=a.begin()){ it--; if(abs(*it-b[i])<mii)mii=abs(*it-b[i]),k=it-a.begin(); } if(mii<mi){ mi=mii,p=k,tb=i; } } vector<int>ans(n); for(int i=0,j=0;i<n;++i){ if(j==p)j++; if(i==tb)ans[i]=p; else ans[i]=j++; } for(int i=0;i<n;++i)cout<<a[ans[i]]<<' '; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; // cin>>t; // init(); while(t--){ solve(); } return 0; }
C
思路:暴力
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; void solve() { vector<int>ve(200); ve[1]=0,ve[2]=1; int k=45; for(int i=3;i<=k;++i){ ve[i]=ve[i-1]+ve[i-2]; } map<int,vector<int>>mp; for(int i=1;i<=k;++i){ for(int j=1;j<=k;++j){ for(int z=1;z<=k;++z){ vector<int>g(3); g[0]=ve[i],g[1]=ve[j],g[2]=ve[z]; int c=g[0]+g[1]+g[2]; if(c>1e9)continue; if(!mp.count(c))mp[c]=g; } } } int q,n; cin>>q; while(q--){ cin>>n; if(mp.count(n)){ vector<int>g=mp[n]; for(auto v:g)cout<<v<<' '; cout<<'\n'; }else cout<<-1<<'\n'; } } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; // cin>>t; // init(); while(t--){ solve(); } return 0; }
D
思路:两种情况
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; void solve() { double p; cin>>p; double ans=pow(p,2)*pow(1-p,3); p=1-p; ans+=pow(p,2)*pow(1-p,3); cout<<fixed<<setprecision(6)<<ans; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; // cin>>t; // init(); while(t--){ solve(); } return 0; }
E
思路:模拟,提BOx的x被坑了wa了一发😅
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; void solve() { string s,t; cin>>s>>t; s.erase(s.begin(),s.begin()+2); int k= stoi(s); int win=(k+1)/2; int cnt=0,r=0,p=0; for(int i=0;i<t.size();++i){ cnt++; if(t[i]=='R')r++; else p++; if(r==win){ win=-1;break; } if(p==win){ win=-2;break; } if(i+1==k)break; } if(win==-1)cout<<"kou!"; else if(win==-2)cout<<"yukari!"; else cout<<"to be continued."; cout<<"\n"<<cnt; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; // cin>>t; // init(); while(t--){ solve(); } return 0; }
F
思路:数不大,提取的质数因子也不多,将所有数按质数因子分类,并查集合并有同一因子的数,最后至少有两个集合即可
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; vector<int>fa(1e5+5); int find(int x){ if(x!=fa[x])fa[x]=find(fa[x]); return fa[x]; } void solve() { int n; cin>>n; map<int,vector<int>>ve; vector<int>a(n+1); for(int i=1;i<=n;++i){ cin>>a[i]; int x=a[i]; for(int j=2;j*j<=x;++j){ if(a[i]%j==0){ ve[j].push_back(i); while(x%j==0)x/=j; } } if(x>1)ve[x].push_back(i); } for(int i=1;i<=n;++i)fa[i]=i; for(auto [x,y]:ve){ // cout<<x<<':'<<y[0]<<' '; for(int i=1;i<y.size();++i){ // cout<<y[i]<<' '; int aa=find(y[i-1]),bb=find(y[i]); if(aa!=bb){ fa[bb]=aa; } } // cout<<'\n'; } set<int>se; int cnt=0,p=find(1); for(int i=1;i<=n;++i){ int aa=find(i); if(aa==p)cnt++; se.insert(aa); } if(se.size()==1)cout<<-1<<' '<<-1<<'\n'; else{ cout<<cnt<<' '<<n-cnt<<'\n'; for(int i=1;i<=n;++i){ int aa=find(i); if(aa==p)cout<<a[i]<<' '; }cout<<'\n'; for(int i=1;i<=n;++i){ int aa=find(i); if(aa!=p)cout<<a[i]<<' '; }cout<<'\n'; } } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; cin>>t; // init(); while(t--){ solve(); } return 0; }
G
ε=(´ο`*)))唉,真服了又读叉题了,以为V的y也要相同,所以对于n=2k+1的情况用扩欧求的,交了好几发都wa人都傻了。y不相同的话就很简单了
思路:首先把那些s,n不够的情况判掉,剩下只有两种情况,n=2k+1:那就是abacada.......a,这里保证bcd...最小为1,剩下的s分配给a且a最大,若还剩下s则分给bcd...;n>2k+1:让前2k+1个位置为2121.......2,剩下的为c111111,用c和1来把剩下的s补完
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; void solve() { int n,s,k; cin>>n>>s>>k; if(k==0){ if(n>s){ cout<<-1<<'\n'; return ; } vector<int>ans(n+1); ans[1]=s-n+1; for(int i=2;i<=n;++i)ans[i]=1; for(int i=1;i<=n;++i)cout<<ans[i]<<' '; cout<<'\n'; return ; } if(n>2*k+1){ if(n+k+1>s)cout<<-1<<'\n'; else{ vector<int>ans(n+1); for(int i=1;i<=2*k+1;++i){ if(i%2)ans[i]=2; else ans[i]=1; } ans[2*k+2]=s-n-k; for(int i=2*k+3;i<=n;++i)ans[i]=1; for(int i=1;i<=n;++i)cout<<ans[i]<<' '; cout<<'\n'; } }else if(n==2*k+1){ if(n+k+1>s){ cout<<-1<<'\n'; return ; } int a=(s-k)/(k+1),les=s-a*(k+1); if(a<=(les+k-1)/k){ cout<<-1<<'\n'; return ; } vector<int>ans(n+1); les-=k; for(int i=1;i<=n;++i){ if(i%2)ans[i]=a; else{ ans[i]=1+(les>0); les--; } cout<<ans[i]<<' '; }cout<<'\n'; }else cout<<-1<<'\n'; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; cin>>t; // init(); while(t--){ solve(); } return 0; }
I
sado(╥﹏╥)o,求非空区间和又坑了
思路:由式子可知,矩阵(xi,yi)到(xj,yj)的和为(axi+...+axj)*(byi+...+byj),那就是求a、b的非空区间和,由于有正负值,最大最小非空区间和都要求
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; void solve() { int n,m; cin>>n>>m; vector<int>a(n),b(m); for(auto &v:a)cin>>v; for(auto &v:b)cin>>v; int ama=-INF,bma=-INF,ami=INF,bmi=INF; for(int i=0,ta=0,ti=0;i<n;++i){ if(ta+a[i]>=0){ ta+=a[i]; ama=max(ama,ta); } else{ ama=max(ama,a[i]); ta=0; } if(ti+a[i]<=0){ ti+=a[i]; ami=min(ami,ti); } else { ami=min(ami,a[i]); ti=0; } } for(int i=0,tb=0,ti=0;i<m;++i){ if(tb+b[i]>=0){ tb+=b[i]; bma=max(bma,tb); } else{ bma=max(bma,b[i]); tb=0; } if(ti+b[i]<=0){ ti+=b[i]; bmi=min(bmi,ti); } else{ bmi=min(bmi,b[i]); ti=0; } } // cout<<ama<<' '<<ami<<'\n'; // cout<<bma<<' '<<bmi<<'\n'; int ans=max({ama * bma, ami * bmi,ama*bmi,ami*bma}); cout<<ans; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; // cin>>t; // init(); while(t--){ solve(); } return 0; }
J
思路:dfs。首先先判非法情况,那就是一节点R的子树除本身外的权值和%3为0,若不为0则一定可以通过对节点R赋值1或2使得整个子树%3为0
所以什么情况下节点R的子树除本身外的权值和%3一定为0呢
对于子节点R,此时的子节点的子树权值和%3一定是0,那么就不能更改子节点R的权值;
对于子节点W,则可对其权值进行更改。
所以无论节点的子树权值和%3为多少,如果存在子节点W,都可以通过对子节点W进行一次加1(1变2)或减1(2变1)使得节点的子树权值和%3不为0。
那非法情况就是存在一节点R,但是不存在其子节点W
对W赋值的话全为1或全为2都可以,因为遇到上面说的情况时(%3为0)其值都可修改
这里从叶子往根开始赋值
查看代码
#include<bits/stdc++.h> using namespace std; #define int long long //#define int __int128 #define double long double typedef pair<int,int>PII; typedef pair<string,int>PSI; typedef pair<string,string>PSS; const int N=1e6+5,INF=0x3f3f3f3f,mod=1e9+7,Mod=998244353; const int MAXN=1e8+5; const double eps=1e-9; const int dx[4]={-1,1,0,0}; const int dy[4]={0,0,-1,1}; vector<vector<int>>g; vector<int>ve,to; int n; string s; bool dfs(int u){ bool ok=false; for(auto v:g[u]){ if(s[v]=='W')to[u]=v,ok=true; if(!dfs(v))return 0; } if(s[u]=='R'&&!ok)return 0; ve.push_back(u); return 1; } void solve() { cin>>n>>s; g=vector<vector<int>>(n+1); vector<int>fa(n+1); to=vector<int>(n+1,-1); for(int i=2;i<=n;++i){ int x; cin>>x; g[x].push_back(i); fa[i]=x; } s.insert(s.begin(),' '); if(dfs(1)){ vector<int>sum(n+1),ans(n+1); for(auto v:ve){ if(s[v]=='W'){ ans[v]=2; sum[v]+=2; sum[fa[v]]+=sum[v]; }else{ if(sum[v]%3==0){ ans[to[v]]=1; ans[v]=1; sum[v]=0; }else if(sum[v]%3==1){ ans[v]=2; sum[v]=0; }else if(sum[v]%3==2){ ans[v]=1; sum[v]=0; } } } for(int i=1;i<=n;++i)cout<<ans[i]; }else cout<<-1; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t=1; // cin>>t; // init(); while(t--){ solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现