备战蓝桥杯---牛客寒假算法基础集训6

1.并查集+数学

分析:

首先我们知道算数基本定理,如果两个数有大于1的质因子,那么我们就需要把他们放在同一个集合,因此我们可以用欧拉刷出1e6范围内的素数,然后依次看输入的数。

拿20=2*2*5举例子,我们在求质数时也得到了其最大质因子,我们取出来,如过它没有访问过,那么记下第一个访问它的,假如那个质因子已经被其他数访问了,那么就用并查集合并。

然后20/5=4,我们可以得到其质因子为2,依次循环。

最后我们以第1个元素为分节点,假如他们都在同一个集合说明无法分即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int q,fa[100010],a[100010],pri[1000000],cnt,p[1000100],n,b[1000100];
int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);
}
void solve(){for(int i=1;i<=n;i++) fa[i]=i;vector<int> A;for(int i=1;i<=n;i++){int x=a[i];while(x>1){int c=p[x];while(x%c== 0) x/=c;if(b[c]==0){b[c]=i;A.push_back(c);}else fa[find(i)]=find(b[c]);}}for(int i=0;i<A.size();i++) b[A[i]]=0;vector<int> B,C;for(int i=1; i<=n; ++i){if(find(1)!=find(i)) B.push_back(a[i]);else C.push_back(a[i]);}if(B.size()==0){cout<<-1<<" "<<-1<<endl;}else{cout<<B.size()<<" "<<C.size()<<endl;for(int i=0;i<B.size();i++) cout<<B[i]<<" ";cout<<endl;for(int i=0;i<C.size();i++) cout<<C[i]<<" ";cout<<endl;}
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>q;p[1]=1;for(int i=2;i<=1000000;i++){if(p[i]==0){p[i]=i;pri[++cnt]=i;}for(int j=1;j<=cnt;j++){if(pri[j]>p[i]||i*pri[j]>1000000) break;p[i*pri[j]]=pri[j];}}while(q--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];solve();}
}

2.构造题(细节题):

分类讨论的思想在这个题上体现的淋漓尽致。

首先我们特判k=0的情况,此时只要s>n即可,1111111,s-n.

当k!=0时,拼成k个三元组要2k+1个,此时,假如n<2k+1那就不行。

n=2k+1时,我们起先构造2,1,2,1,2这种,判断s与3k+2的关系,s<3k+2就不行,等于时可以。

大于时我们让每一个2先加一个值(给1的话就不满足关系了),加什么值呢?

一共有k+1个2,只要可以一次给出k+1,那就从答案中减(贪心一下就可以),没有时才考虑给1.

而若连给2的k+1个也给不起那肯定不行。

当n>2k+1时,我们在后面接上一段1,其开头把差值补上即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
long long t,n,s,k,a[100010];
void solve(){if(k==0){if(s<n){cout<<-1<<endl;return;}for(int i=1;i<=n;i++) a[i]=1;a[1]+=s-n;}else{if(n<2*k+1){cout<<-1<<endl;return;}else if(n==2*k+1){if(s<3*k+2){cout<<-1<<endl;return;}else if(s==3*k+2){for(int i=1;i<=n;i++){if(i%2==1) a[i]=2;else a[i]=1;}}else{s-=3*k+2;long long x=s/(k+1);if(x==0){cout<<-1<<endl;return; }else{for(int i=1;i<=n;i++){if(i%2==1) a[i]=x+2;else a[i]=1;}s-=x*(k+1);for(int i=1;i<=n;i++){if(i%2==0&&(s>0)){a[i]=2;s--;}if(s<0) break;}}}}else{if(s<3*k+2){cout<<-1<<endl;return;}for(int i=1;i<=2*k+1;i++){if(i%2==1) a[i]=2;else a[i]=1;}s-=3*k+2;for(int i=2*k+2;i<=n;i++){a[i]=1;s--;if(s<0){cout<<-1<<endl;return;}}a[2*k+2]+=s;}}for(int i=1;i<=n;i++) printf("%lld ",a[i]);cout<<endl;
}
int main(){cin>>t;while(t--){cin>>n>>s>>k;solve();}
}

3.构造题+DFS

首先当一个红点下面是一个红点时,它可以被忽略。

因此假如它的儿子节点只有红点或没有点,那么就不行。

而只要它有一个白点他就一定可以构造出3的倍数。

因此我们令白的所有点=1,红的为0,然后先维护一下子树和。

再DFS2一下判断红点下的子树和,若为1就自己改成2,为2的话不动,输出时改1即可。为0的话因为不能有权值为0的点,于是自己变成2,再找一个子节点变成2即可。

下面是AC代码:

#include <bits/stdc++.h>
using namespace std;
int n,x,ans[100010],sz[100010],f;
string s;
vector<int> edge[100010];
void dfs1(int root){int xx=0;if(s[root]=='W') xx++;ans[root]=xx;for(int i=0;i<edge[root].size();i++){dfs1(edge[root][i]);if(s[root]=='W') xx+=sz[edge[root][i]];}sz[root]=xx;
}
void dfs2(int root){int white=0;for(int i=0;i<edge[root].size();i++){dfs2(edge[root][i]);if(f==1) return;white+=sz[edge[root][i]];   }if(white==0&&s[root]=='R'){f=1;return;}white%=3;if(s[root]=='R'){if(white==1) ans[root]=2;if(white==0){ans[root]=2;for(int i=0;i<edge[root].size();i++){ans[edge[root][i]]=2;break;}}}
}
int main(){cin>>n>>s;s=' '+s;for(int i=1;i<n;i++){scanf("%d",&x);edge[x].push_back(i+1);}dfs1(1);dfs2(1);if(f==1) cout<<-1;else{for(int i=1;i<=n;i++) printf("%d",max(1,ans[i]));}
}

4.枚举+二维前缀和:

显然符合条件的只有3!*2种情况,我们先维护一下题目给的和那12个不同的地方(标为1),然后二维前缀和维护一下即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,q,a[13][510][510],sum[13][510][510],x1,x2,yy1,y2;
char ti[510][510],ans[13][510][510],x;
string ss[12][3]={{"red","dre","edr"},{"red","edr","dre"},{"rde","der","erd"},{"rde","erd","der"},{"erd","der","rde"},{"erd","rde","der"},{"edr","dre","red"},{"edr","red","dre"},{"dre","red","edr"},{"dre","edr","red"},{"der","rde","erd"},{"der","erd","rde"}};
int calc(int x1,int y1,int x2,int y2,int i){return sum[i][x2][y2]-sum[i][x1-1][y2]-sum[i][x2][y1-1]+sum[i][x1-1][y1-1];
}
int main(){cin>>n>>m>>q;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf(" %c",&x);ti[i][j]=x;}}for(int i=1;i<=12;i++){for(int j=1;j<=3;j++){for(int k=1;k<=3;k++){ans[i][j][k]=ss[i-1][j-1][k-1];}}for(int j=1;j<=3;j++){for(int k=4;k<=500;k++){ans[i][j][k]=ans[i][j][k-3];}}for(int j=4;j<=500;j++){for(int k=1;k<=500;k++) ans[i][j][k]=ans[i][j-3][k];}}for(int i=1;i<=12;i++){for(int k=1;k<=n;k++){for(int j=1;j<=m;j++){if(ti[k][j]!=ans[i][k][j]) a[i][k][j]=1;}}}for(int i=1;i<=12;i++){for(int k=1;k<=n;k++){for(int j=1;j<=m;j++){sum[i][k][j]=sum[i][k-1][j]+sum[i][k][j-1]-sum[i][k-1][j-1]+a[i][k][j];}}}for(int i=1;i<=q;i++){scanf("%d%d%d%d",&x1,&yy1,&x2,&y2);int ans=n*m;for(int i=1;i<=12;i++){ans=min(ans,calc(x1,yy1,x2,y2,i));}if (x2 - x1 == 1 && y2 - yy1 == 1 && ti[x1][yy1] == ti[x2][y2] && ti[x1][y2] == ti[x2][yy1] && ti[x1][yy1] != ti[x1][y2]) ans = 0;printf("%d\n",ans);}
}

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

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

相关文章

在Sequence中缓存Niagara粒子轨道

当Sequence中粒子特效较多时&#xff0c;播放检查起来较为麻烦&#xff0c;而使用Niagara缓存功能可将粒子特效方便的缓存起来&#xff0c;并且还可以更改播放速度与正反播放方向&#xff0c;便于修改。 1.使用Niagara缓存需要先在插件里打开NiagaraSimCaching 2.创建一个常…

【计算机网络篇】数据链路层(3)差错检测

文章目录 &#x1f95a;误码&#x1f354;两种常见的检错技术⭐奇偶校验⭐循环冗余校验&#x1f388;例子 &#x1f95a;误码 误码首先介绍误码的相关概念 &#x1f354;两种常见的检错技术 ⭐奇偶校验 奇校验是在待发送的数据后面添加1个校验位&#xff0c;使得添加该校验…

[MAUI]集成高德地图组件至.NET MAUI Blazor项目

文章目录 前期准备&#xff1a;注册高德开发者并创建 key登录控制台创建 key获取 key 和密钥 创建项目创建JS API Loader配置权限创建定义创建模型创建地图组件创建交互逻辑 项目地址 地图组件在手机App中常用地理相关业务&#xff0c;如查看线下门店&#xff0c;设置导航&…

python环境搭建及特定操作系统注意事项

文章目录 搭建Python环境通用的流程&#xff1a;**1. 下载并安装Python解释器****2. 验证安装****3. 安装包管理器&#xff08;pip&#xff09;****4. 安装必要的开发工具****5. 创建虚拟环境&#xff08;推荐&#xff09;****6. 安装项目所需的库****7. 配置IDE/编辑器** 特定…

简单易用的Nginx代理管理工具:体验便捷配置、高效管理

今天在浏览 GitHub 的时候&#xff0c;我发现了一个用于管理 Nginx 代理服务器的开源工具项目——Nginx Proxy Manager。作为一名后端开发人员&#xff0c;这个项目对我来说无疑是一个非常不错的发现。以往&#xff0c;当我们部署一些开源工具或者自己编写的小项目和小网站时&a…

【深度学习】四种天气分类 模版函数 从0到1手敲版本

引入该引入的库 import torch import torch.nn as nn import matplotlib.pyplot as plt import torch.nn.functional as F import torchvision import torch.optim as optim %matplotlib inline import os import shutil import glob os.environ["KMP_DUPLICATE_LIB_OK&q…

Docker搭建LNMP环境实战(02):Win10下安装VMware

实战开始&#xff0c;先安装 VMware 虚拟机。话不多说&#xff0c;上手就干&#xff01; 1、基本环境检查 1.1、本机Bios是否支持虚拟化 进入&#xff1a;任务管理器- 性能&#xff0c;查看“虚拟化”是否启用&#xff0c;如果已启用&#xff0c;则满足要求&#xff0c;如果未…

string类的详细模拟实现

string类的模拟实现 文章目录 string类的模拟实现前言1. 类的框架设计2. 构造函数与析构函数3. 拷贝构造与重载赋值运算符函数4. 运算符重载5. 成员函数6. 迭代器的实现7. 非成员函数8. 单元测试总结 前言 ​ 在现代编程中&#xff0c;字符串处理是每个程序员都会遇到的基本任…

亚稳态及其解决办法

异步电路 亚稳态 亚稳态亚稳态的产生原因什么是同步异步信号怎么消除亚稳态 亚稳态 在数字电路中&#xff0c;每一位数据不是1&#xff08;高电平&#xff09;就是0&#xff08;低电平&#xff09;。当然对于具体的电路来说&#xff0c;并非1&#xff08;高电平&#xff09;就是…

【JavaEE初阶系列】——带你了解volatile关键字以及wait()和notify()两方法背后的原理

目录 &#x1f6a9;volatile关键字 &#x1f388;volatile 不保证原子性 &#x1f388;synchronized 也能保证内存可见性 &#x1f388;Volatile与Synchronized比较 &#x1f6a9;wait和notify &#x1f388;wait()方法 &#x1f4bb;wait(参数)方法 &#x1f388;noti…

C# WPF编程-控件

C# WPF编程-控件 概述WPF控件类别包括以下控件&#xff1a;背景画刷和前景画刷字体文本装饰和排版字体继承字体替换字体嵌入文本格式化模式鼠标光标 内容控件Label&#xff08;标签&#xff09;Button&#xff08;按钮&#xff09; 概述 在WPF领域&#xff0c;控件通常被描述为…

xilinx的高速接口构成原理和连接结构

本文来源&#xff1a; V3学院 尤老师的培训班笔记【高速收发器】xilinx高速收发器学习记录Xilinx-7Series-FPGA高速收发器使用学习—概述与参考时钟GT Transceiver的总体架构梳理 文章目录 一、概述&#xff1a;二、高速收发器结构&#xff1a;2.1 QUAD2.1.1 时钟2.1.2 CHANNEL…