AC修炼计划(AtCoder Regular Contest 165)

news2024/11/26 14:23:51

传送门:AtCoder Regular Contest 165 - AtCoder

本次习题参考了樱雪猫大佬的题解,大佬的题解传送门如下:Atcoder Regular Contest 165 - 樱雪喵 - 博客园 (cnblogs.com)

A - Sum equals LCM

第一题不算特别难

B - Sliding Window Sort 2

对于这道题而言,我们不难看出,如果想让该字符串尽可能的大,那最好的方式就是不改变,如果改变了,尽可能的向右边改变,同时尽可能的少改变。我们不如从前向后进行枚举,从而筛选出是第一个交换尽可能向右的下标,并记录。代码如下:

#include<bits/stdc++.h>
using namespace std;
// #define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
int n,k;
int b[5000005];
void icealsoheat(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	set<int>q;
	for(int i=1;i<=k;i++)q.insert(b[i]);
	vector<int>c(n+5,0);
	int id=0;
	int mx=0;
	for(int i=1;i<=n-k+1;i++){
		if(i-1)q.erase(b[i-1]),q.insert(b[i+k-1]);
		if(c[i])continue;
		int l=0;
		auto it=q.begin();
		for(int j=i;j<i+k;j++){
			if((*it)!=b[j]){
				l=j;
				break;
			}
			it++;
		}
		if(!l){
			id=0;
			break;
		}
		for(int j=i;j<=l;j++)c[j]=1;
		if(l>mx){
			mx=l;
			id=i;
		}
	}
	if(id)sort(b+id,b+id+k);
	for(int i=1;i<=n;i++)cout<<b[i]<<" ";
	
	
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	int _=1;
	// cin>>_;
	while(_--){
		icealsoheat();
	}

}

C - Social Distance on Graph

首先,没有重边,没有环,简单的无向图。最开始我想到了最小生成树,但是没搞出来,后来看佬的码,惊讶的发现确实是最小生成树,只是我想的还是太浅了,不够深入。

既然我们想让最小值最大,那么我们尽可能的让最小的边通过涂色和其他边和在一起。如果是不同的颜色的两个点,则这条边不存在,无法相连。所以我们可以用最小生成树来将最小的顶点优先考虑。并且将其进行染色,将这两个点儿染成不同的颜色。同时并继续向后慢慢更新,这里可以通过并查集来进行实现。在最后,我们比较出最小值即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,k,m;
int c[5000005];
int pre[1000005];
struct we{
    int l,r,w;
    bool operator <(const we &k)const{
        return w<k.w;
    }
}hh[1000005];
int find(int x){
    if(pre[x]==x)return x;
    return pre[x]=find(pre[x]);
}
bool cmp(PII ax,PII bx){
    return ax.second<bx.second;
}
void icealsoheat(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        pre[i]=i;
        c[i]=-1;
    }
    vector<vector<PII>>ve(n+5);
    for(int i=1;i<=m;i++){
        int l,r,w;
        cin>>l>>r>>w;
        hh[i].l=l;
        hh[i].r=r;
        hh[i].w=w;
    }
    sort(hh+1,hh+1+m);
    for(int i=1;i<=m;i++){
        int xx=find(hh[i].l);
        int yy=find(hh[i].r);
        if(xx==yy){
            continue;
        }
        pre[xx]=yy;
        ve[hh[i].l].push_back({hh[i].r,hh[i].w});
        ve[hh[i].r].push_back({hh[i].l,hh[i].w});
    }
    auto dfs=[&](auto self,int x,int fa)->void{
        for(auto [i,j]:ve[x]){
            if(i==fa||c[i]!=-1)continue;
            c[i]=c[x]^1;
            self(self,i,x);
        }
    };
    for(int i=1;i<=n;i++){
        if(pre[i]==i){
            c[i]=0;
            dfs(dfs,i,-1);
            break;
        }
    }
    int ans=MX;
    for(int i=1;i<=m;i++){
        if(c[hh[i].l]==c[hh[i].r]){
            ans=min(ans,hh[i].w);
        }
    }
    for(int i=1;i<=n;i++){
        sort(ve[i].begin(),ve[i].end(),cmp);
    }
    for(int i=1;i<=n;i++){
        if(ve[i].size()>1){
            ans=min(ans,ve[i][0].second+ve[i][1].second);
        }
    }
    cout<<ans;
    
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _=1;
    // cin>>_;
    while(_--){
        icealsoheat();
    }

}

D - Substring Comparison

本题对于算法的考察比较多,我认为是一道比较好的题。这题我没有一点思路,是直接看佬的代码和思路的,让我恍然大悟。既然n是2000,那就支持双重循环了。首先,如果a=c并且d>=b的话,那一定是输出no的,我们可以优先排前面的,最开始让a<c,当出现了环的情况的时候,才能确定出a==c,那就让下一位数作为比较,直到最后跳出。(思路不知道咋讲,但上面大佬樱雪喵的题解里讲的很清楚了)代码如下:

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,m;
bool f=0;
int b[1000005];
int pre[100005];
int dfn[10000];
int low[10000];
vector<int>ve[10000];
int find(int x){
    if(x==pre[x])return x;
    else return pre[x]=find(pre[x]);
}
struct we{
    int a,b,c,d;
}hh[20005];
int num;
int top,col;
int a[10000];
int c[10000];
void tarjan(int u){
    dfn[u]=low[u]=++num;
    a[++top]=u;
    for(auto i:ve[u]){
        if(dfn[i]==0){
            tarjan(i);
            low[u]=min(low[u],low[i]);
            // pre[find(i)]=find(u);
        }
        else{
            if(!c[i]){
                low[u]=min(low[u],dfn[i]);
            }
        }
    }
    if(low[u]==dfn[u]){
        c[u]=++col;
        while(a[top]!=u){
            if(find(a[top])!=find(u)){
                pre[find(a[top])]=find(u);
            }
            f=1;
            c[a[top]]=col;
            top--;
        }
        top--;
    }
}

void icealsoheat(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>hh[i].a>>hh[i].b>>hh[i].c>>hh[i].d;
    }
    for(int i=1;i<=n;i++)pre[i]=i;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            ve[j].clear();
        }
        for(int j=1;j<=m;j++){
            while(find(hh[j].a)==find(hh[j].c)&&hh[j].a<=hh[j].b&&hh[j].c<=hh[j].d){
                hh[j].a++;
                hh[j].c++;
            }
            if(hh[j].c>hh[j].d){
                cout<<"No";
                return;
            }
            if(hh[j].a<=hh[j].b){
                ve[find(hh[j].a)].push_back(find(hh[j].c));
                // ve[find(hh[j].c)].push_back(find(hh[j].a));               
            }

        }
        for(int j=1;j<=n;j++){
            dfn[j]=0;
            low[j]=0;
            c[j]=0;
            a[j]=0;
        }
        top=col=num=0;
        f=0;
        for(int j=1;j<=n;j++){
            if(!dfn[j]){
                tarjan(j);
            }
        }
        if(!f){
            cout<<"Yes";
            return;
        }
    }
    cout<<"Yes";

}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _=1;
    // cin>>_;
    while(_--){
        icealsoheat();
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Latex伪代码Switch Case(简单暴力版)

自己添加新命令的Switch Case&#xff0c;用的algorithm和algorithmicx安装包 格式可调整&#xff01; 效果图&#xff1a; 代码&#xff1a; \usepackage{algorithm} \usepackage{algorithmicx} \newcommand{\SWITCH}[1]{\textbf{switch} (#1)} \newcommand{\ENDSWITCH}{\t…

【python海洋专题二十二】在海图上text

上期出了四个子图 但是想标记A,B,C,D 或者春夏秋冬 本期内容 在海图上text 1:效果如图 未标记 标记 关键语句 # 添加文本注释 ax.text(104, 22, autumn, fontdict={family: serif, size: 4, color: blue}, ha=center, va=center, transform=ccrs.PlateCarree())往期推荐…

分享一下做一个电商小程序的步骤是什么呢

在当今互联网时代&#xff0c;电商小程序已经成为了一种新的商业模式&#xff0c;它不仅能够提高用户的购物体验&#xff0c;还能为商家带来更多的销售机会。本文将详细介绍电商小程序的步骤&#xff0c;帮助读者了解如何从零开始制作一个电商小程序 首先&#xff0c;让我们来了…

日期格式转换

标准格式转换&#xff1a; 1.这里获取当前系统的时 2.这里的Date类是 java.util 3.默认输出的日期格式是国外的方式&#xff0c;因此通常需要格式转换 Date date new Date();System.out.println("当前日期&#xff1a;"date);Date date1 new Date(954545424);Syst…

阿里云“玩转云上 StarRocks3.0 湖仓分析”,开启数据分析新范式

简介&#xff1a; 阿里云 EMR OLAP 团队与 StarRocks 社区联合出品&#xff0c;玩转云上 StarRocks3.0 湖仓分析训练营&#xff0c;围绕 StarRocks3.0 系列解读、EMR Serverless StarRocks 存算分离功能与应用场景介绍&#xff0c;开启数据分析新范式&#xff01; StarRocks3…

时间复杂度为 O(n^2) 的排序算法

大家好&#xff0c;我是 方圆。对于小规模数据&#xff0c;我们可以选用时间复杂度为 O(n2) 的排序算法&#xff0c;因为时间复杂度并不代表实际代码的执行时间&#xff0c;而且它也省去了低阶、系数和常数&#xff0c;仅代表的增长趋势&#xff0c;所以在小规模数据情况下&…

PAM从入门到精通(一)

本文参考以下博文&#xff1a; PAM模块详解及sudo命令 PAM 的应用开发和内部实现源码分析 PAM详解&#xff08;一&#xff09;PAM介绍 百度百科 —— PAM Oracle Solaris 10 开发者安全性指南 —— PAM 框架介绍 特此致谢&#xff01; 零、引言 身份认证是操作系统安全的…

Oracle-truncate误删数据恢复

前言&#xff1a; truncate操作误删数据之后想恢复数据通常比较困难&#xff0c;因为truncate操作属于ddl操作无法使用直接undo闪回查询方式恢复数据&#xff0c;并且由于空间大小、备份时间以及变更操作不规范原因&#xff0c;往往在执行操作之前没有对表进行CTAS备份或者其他…

【Java】枚举 Enum

枚举 Enum 枚举的使用Enum 类的常用方法枚举优缺点用枚举实现一个单例模式 枚举的主要用途是&#xff1a;将一组常量组织起来&#xff0c;在这之前表示一组常量通常使用定义常量的方式&#xff1a; public static int final RED 1; public static int final GREEN 2; publi…

vue3 状态管理pinia

1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 &#xff0c;是 Vuex 状态管理工具的替代品 特点优势: 提供更加简单的API(去掉了mutation)提供符合组合式风格的API(和Vue3新语法统一)去掉modules的概念,每一个store都是一个独立的模块配合TypeScript更加友好,提供可靠的…

微信里写周报添加到公司办公平台的方法

概要 微信和公司用的办公平台互通&#xff0c;我们已经说过几篇。 这次将给大家介绍&#xff0c;如何在微信里写周报内容&#xff0c;添加到公司办公平台的周报应用里。 工作中&#xff0c;如果出差在外&#xff0c;或者回到家想要汇报一周的工作情况的时候&#xff0c;不用…

Druid连接池最小连接数设置失效问题

问题发现&#xff1a; 配置 当项目启动后 线程池确实是初始化了5条连接&#xff0c;但是当项目运行一段时间后&#xff0c;5条连接确消失了&#xff0c;只会程序用到得时候&#xff0c;再去初始化连接&#xff0c;这样有点违背了参数设置得意义&#xff0c;后来通过查阅资料发…

简单好用的文档管理系统MinDoc

什么是 MinDoc &#xff1f; MinDoc 是一款针对 IT团队开发的简单好用的文档管理系统。MinDoc 的前身是 SmartWiki 文档系统。SmartWiki 是基于 PHP 框架 laravel 开发的一款文档管理系统。因 PHP 的部署对普通用户来说太复杂&#xff0c;所以改用 Golang 开发。可以方便用户部…

vue 01

安装vscode 按照如下方式汉化 给vscode 安装插件 Vetur 安装node.js 下载地址https://nodejs.org/en/download/&#xff0c;选择windows msi 在cmd下检查如下&#xff1a; 检查nodejs版本:node --version 检查npm的安装版本&#xff1a;npm -v 执行命令&#xff1a; npm i…

学习rsync

文章目录 一、rsync介绍二、rsync的特点三、本地文件同步四、远程文件同步五、免密文件同步和更改端口后的文件同步六、rsync作为系统服务七、应用举例七、给rsync服务添加密码八、rsync搭配inotify进行实时同步九、xinetd托管rsyncd服务 一、rsync介绍 1.sync同步&#xff1a…

Python玫瑰花

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

常见的作物模型应用技巧!DSSAT模型、APSIM模型、WOFOST模型与PCSE模型等应用

①最新DSSAT作物模型建模方法及应用 DSSAT模型内核算法是基于Fortran语言开发的&#xff0c;软件界面是基于C进行开发。了解和熟悉DSSAT模型的关键算法和软件的操作是学习DSSAT模型的基础。此外&#xff0c;想要成为一名优秀的作物模型使用者与科研团队不可或缺的人才&#xff…

Windows 安装 nvm 提示 ‘“node“‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

Windows 安装 nvm 提示 ‘“node”’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决办法 先卸载电脑中原有 nodejs 版本&#xff0c;再安装 nvm 即可。 安装完成之后记得重新打开终端 使用 安装 nodejs 18 添加环境变量 在 Path 里添加这两个变量名 结果 现…

XPS测试常见问题及解答(二)-科学指南针

在做X 射线光电子能谱(XPS)测试时&#xff0c;科学指南针检测平台工作人员在与很多同学沟通中了解到&#xff0c;好多同学仅仅是通过文献或者师兄师姐的推荐对XPS测试有了解&#xff0c;但是对于其原理还属于小白阶段&#xff0c;针对此&#xff0c;科学指南针检测平台团队组织…

认识京东联盟API,获取APPkey和APPsecret|直接调用KEY方式

做过淘客开发的一定接触过淘宝API开发。 而做京东联盟软件自然离不开京东联盟API。 京东联盟API目前上线的有很多。京东平台商品API。 https://jos.jd.com/api/list.htm?id117 Paste_Image.png 但是京东联盟API获取比较难&#xff0c;没办法在线申请&#xff0c;需要找官方…