备战蓝桥杯---牛客寒假算法基础集训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.mfbz.cn/a/484600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

检索增强生成(RAG)技术:实现流程、作用及应用案例

一. RAG简介 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术巧妙地结合了信息检索与神经网络生成模型的力量&#xff0c;通过在生成过程中引入相关的外部信息&#xff0c;实现了在…

【Vue3】组件通信以及各种方式的对比

方式一&#xff1a;props 「父」向「子」组件发送数据 父组件&#xff1a; 定义需要传递给子组件的数据&#xff0c;并使用 v-bind 指令将其绑定到子组件的 props 上。 <template><child-component :message"parentMessage" /> </template><sc…

6. ping在windows中的常见用法

&#xff08;1&#xff09;ping简介 1.ping简介 &#xff08;2&#xff09;在windows上用法 1.直接ping 对方IP&#xff08;无参数时&#xff09; 2.ping -t IP (长ping) 3.ping -n 包数量 4.ping -l 字节大小 IP 5.如何批量的ping一个网段&#xff1f; &#xff08;1&a…

24计算机考研调剂 | 【官方】山东工商学院

山东工商学院 考研调剂招生信息 招生专业&#xff1a; 学院概况&#xff1a; 计算机科学与技术学院始建于1999年&#xff0c;拥有计算机科学与技术一级学科硕士点,在2022软科中国最好学科排名中&#xff0c;计算机科学与技术学科位列全国第104位。在2022年“软科”中国大学专…

【MySQL】2.MySQL数据库的基本操作

目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构&#xff08;字段&#xff09; 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL&#xff1a;数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…

音视频领域首个,阿里云推出华为鸿蒙 HarmonyOS NEXT 版音视频 SDK

近日&#xff0c;阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的操作文档和 SDK&#xff0c;官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。 此外&#xff0c;阿里云播放器 SDK 也在华为开发者联盟官网鸿蒙生态伙伴 SDK 专区同步上线&#xff0c;面向所…

SpringCloud-记

目录 什么是SpringCloud 什么是微服务 SpringCloud的优缺点 SpringBoot和SpringCloud的区别 RPC 的实现原理 RPC是什么 eureka的自我保护机制 Ribbon feigin优点 Ribbon和Feign的区别 什么是SpringCloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发…

STM32之HAL开发——系统定时器(SysTick)

系统定时器&#xff08;SysTick&#xff09;介绍 SysTick—系统定时器是属于 CM3 内核中的一个外设&#xff0c;内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器&#xff0c;计数器每计数一次的时间为 1/SYSCLK&#xff0c;一般我们设置系统时钟 SYSCLK等于 72M。当…

人工智能之Tensorflow变量作用域

在TensoFlow中有两个作用域&#xff08;Scope&#xff09;&#xff0c;一个时name_scope ,另一个是variable_scope。variable_scope主要给variable_name加前缀&#xff0c;也可以给op_name加前缀&#xff1b;name_scope给op_name加前缀。 variable_scope 通过所给的名字创建或…

【电路笔记】-场效应管(FET)电流源

场效应管(FET)电流源 文章目录 场效应管(FET)电流源1、概述2、偏置结 FET2.1 N沟道JFET偏置2.2 N沟道JFET输出特性3、JFET 作为恒流源4、JFET 零电压偏置5、JFET 负电压偏置6、FET 恒流源示例17、JFET电流源8、FET 恒流源示例29、FET 恒流源示例310、总结FET 恒流源使用 JFET 和…

Java学习笔记NO.26

T3.以面向对象的思想&#xff0c;编写自定义类描述IT从业者。 设定属性包括&#xff1a;姓名&#xff0c;年龄&#xff0c;技术方向&#xff0c;工作年限&#xff1b; 方法包括&#xff1a;工作。 要求&#xff1a; (1)设置属性的私有访问权限&#xff0c;通过公有的get,set…

业务服务:redisson

文章目录 前言一、配置1. 添加依赖2. 配置文件/类3. 注入redission3. 封装工具类 二、应用1. RedisUtils工具类的基本使用 三、队列1. 工具类2. 普通队列3. 有界队列&#xff08;限制数据量&#xff09;4. 延迟队列&#xff08;延迟获取数据&#xff09;5. 优先队列&#xff08…

Netty - 五种 I/O 多路复用机制 select、poll、epoll、kqueue、iocp(windows) 对比

文章目录 Preselect、poll、epoll、kqueue、iocp(windows) Pre 高性能网络编程 - select、 poll 、epoll 、libevent select、poll、epoll、kqueue、iocp(windows) 这里我将对比一下常见的多路复用技术&#xff1a;select、poll、epoll、kqueue 和 IOCP&#xff08;Windows&a…

分区表索引失效导致业务异常

业务无法正常进行&#xff0c;查看数据库后台进程&#xff0c;发现有大量阻塞 QL_ID WAIT_CLASS EVENT ------------- --------------- ------------------------- 1cpk7srb6cr0r User I/O db file scattered read 279knu21n06x6…

音视频开发之旅(78)- Docker使用和交互流程

目录 1.Docker是什么 2.DockerFile的使用 3.常用命令 4.Docker和Web服务的交互流程 5.资料 一、Docker是什么 Docker通过轻量级的容器化技术&#xff0c;使得应用程序及其依赖可以打包在一个可移植的容器中运行&#xff0c;确保应用在不同环境下的一致性和效率。 1.1 核心…

中断(NVIC)的使用--EXTI--TIM

目录 中断是什么 轮询 中断 中断调用情况 中断的分类 内部中断&#xff08;TIM、UART等&#xff09; tim.c tim.h 外部中断EXTI exti.c exti.h 中断是什么 在处理事件的时候有两种方式&#xff1a;轮询和中断。 轮询 顾名思义&#xff0c;就是每轮都询问一次。比如…

结构体类型详细讲解(附带枚举,联合)

前言&#xff1a; 如果你还对结构体不是很了解&#xff0c;那么本篇文章将会从 为什么存在结构体&#xff0c;结构体的优点&#xff0c;结构体的定义&#xff0c;结构体的使用与结构体的大小依次介绍&#xff0c;同样会附带枚举与联合体 目录 为什么存在结构体&#xff1a; 结构…

毕业设计:日志记录编写(3/17起更新中)

目录 3/171.配置阿里云python加速镜像&#xff1a;2. 安装python3.9版本3. 爬虫技术选择4. 数据抓取和整理5. 难点和挑战 3/241.数据库建表信息2.后续进度安排3. 数据处理和分析 3/17 当前周期目标&#xff1a;构建基本的python环境&#xff1a;运行爬虫程序 1.配置阿里云pytho…

【C++】如何用一个哈希表同时封装出unordered_set与unordered_map

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.哈希桶源码 2.哈希…

(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练

这里写目录标题 一、colmap解算数据放入高斯1. 将稀疏重建的文件放入高斯2. 将稠密重建的文件放入高斯 二、vkitti数据放入高斯 一、colmap解算数据放入高斯 运行Colmap.bat文件之后&#xff0c;进行稀疏重建和稠密重建之后可以得到如下文件结构。 1. 将稀疏重建的文件放入高…
最新文章