AC修炼计划(AtCoder Beginner Contest 334)A~G

news2025/2/25 9:31:24

传送门:UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder

A题是最最基础的语法题就不再讲解。

B - Christmas Trees

该题虽然分低,但我觉得还是很不错的。

给你 l 和 r ,设满足题意的数字是x则让你找在区间中有多少个x是x%k==a%k。我们要算出左右满足题意的两端点值,而后可以求出。左端点向上取整,右端点向下取整。

分别是l+=((x-l%m)%m+m)%m    以及r-=((r%m-x)%m+m)%m。

最后可以算出答案。

// #pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,m;

void icealsoheat(){
    int a,l,r;
    cin>>a>>m>>l>>r;
    int x=a%m;

    l+=((x-l%m)%m+m)%m;
    r-=((r%m-x)%m+m)%m;
    if(l>r)cout<<"0";
    else cout<<(r-l)/m+1;


    

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

C - Socks 2

这题比较经典。看到绝对值我们首先就要想到拆绝对值,则有数量相等的正负数。2*n-k为偶数的话,我们就直接计算就可以了。若为奇数,我们可以提前预处理出前缀和而后遍历每一个数去除来求最小值。注意去除当前数,后面的后缀和应该变成相反数,才是最终答案。

// #pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,m;
int k;
void icealsoheat(){
    cin>>n>>k;
    vector<int>a(n+5,2);
    for(int i=1;i<=k;i++){
        int x;
        cin>>x;
        a[x]=1;
    }
    if((2*n-k)&1){
        int id=0;
        vector<int>sum(2*n+5,0);
        for(int i=1;i<=n;i++){
            id++;
            if(id&1){
                sum[id]=sum[id-1]-i;
            }
            else sum[id]=sum[id-1]+i;
            if(a[i]==2){
                id++;
                if(id&1)sum[id]=sum[id-1]-i;
                else sum[id]=sum[id-1]+i;
            }
        }
        int ans=MX;
        for(int i=1;i<=2*n-k;i++){
            ans=min(ans,sum[i-1]-(sum[2*n-k]-sum[i]));
        }
        cout<<ans;
    }
    else{
        int id=0;
        int ans=0;
        for(int i=1;i<=n;i++){
            id++;
            if(id&1)ans-=i;
            else ans+=i;
            if(a[i]==2){
                id++;
                if(id&1)ans-=i;
                else ans+=i;
            }
        }
        cout<<ans;
    }
    

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

D - Reindeer and Sleigh

前缀和加二分操作,太经典了就不多说了。

// #pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,q;
int k;
int a[500005];
int sum[500005];
void icealsoheat(){
    cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
    for(int i=1;i<=q;i++){
        int x;
        cin>>x;
        if(x<sum[1]){
            cout<<"0\n";
            continue;
        }
        int l,r,mid;
        l=1,r=n;
        while(l<r){
            int mid=(l+r+1)>>1;
            if(sum[mid]<=x)l=mid;
            else r=mid-1;
        }
        cout<<l<<"\n";
    }
    

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

E - Christmas Color Grid 1

通过dfs求解出联通量的个数,而后暴力枚举每一个红色,情况还是挺好特判的,要用到逆元。

// #pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,m;
int k;
string s[500005];
int kuai(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans%mod;
}
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void icealsoheat(){
    cin>>n>>m;
    vector<vector<int>>c(n+5,vector<int>(m+5,0));
    for(int i=1;i<=n;i++){
        cin>>s[i];
        s[i]='-'+s[i];
    }
    int an=0;
    auto dfs=[&](auto self,int x,int y)->void{
        for(int i=0;i<4;i++){
            int xx=dx[i]+x;
            int yy=dy[i]+y;
            if(xx>0&&xx<=n&&yy>0&&yy<=m&&c[xx][yy]==0&&s[xx][yy]=='#'){
                c[xx][yy]=an;
                self(self,xx,yy);
            }
        }
    };
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(s[i][j]=='#'&&!c[i][j]){
                an++;
                c[i][j]=an;
                dfs(dfs,i,j);
            }
        }
    }
    int sum=0;
    int cnt=0;
    // cout<<an<<"***\n";
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(s[i][j]=='.'){
                sum++;
                set<int>q;
                for(int o=0;o<4;o++){
                    int xx=dx[o]+i;
                    int yy=dy[o]+j;
                    if(xx>0&&xx<=n&&yy>0&&yy<=m&&s[xx][yy]=='#'){
                        q.insert(c[xx][yy]);
                    }
                }
                if(!q.size())cnt+=an+1;
                else cnt+=an-q.size()+1;
                // cout<<cnt<<"---\n";
            }
        }
    }
    // cout<<cnt<<"+++"<<sum<<"+++\n";
    cout<<cnt%mod*kuai(sum,mod-2)%mod;

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

F - Christmas Present 2

这题感觉还是挺好的。首先想到是dp的思想,但暴力dp是O(n*n)的复杂度,显然,会t。而后我们开始想他的优化。我们想要算得的就是贡献值也就是从当前点回到家所产生的距离值和正常到下一个点儿的差(三角形任意两边之和大于第三边,所以正常情况是比回家的情况小的)。这个差值越小越好,同时我们还要保证两个回家的点儿之间差不超过k。我们用dp来迭代这个差值。优化dp的方式我们可以用单调队列的方式进行求解,以此来满足条件,并尽可能的使改变的值变少。

代码如下:

// #pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f;
int n,k;
double s[500005];
double sum[500005];
double xx[500005];
double yy[500005];
double suan(double x1,double y1,double x2,double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void icealsoheat(){
    cin>>n>>k;
    double xe,ye;
    cin>>xe>>ye;
    for(int i=1;i<=n;i++)cin>>xx[i]>>yy[i],s[i]=suan(xx[i],yy[i],xe,ye);
    for(int i=2;i<=n;i++)sum[i]=sum[i-1]+suan(xx[i],yy[i],xx[i-1],yy[i-1]);
    vector<double>dp(n+5,0);
    int l=1,r=0;
    vector<int>id(n+5,0);
    #define d(i) dp[i]-sum[i+1]+s[i+1]

    for(int i=1;i<=n;i++){
        while(l<=r&&d(id[r])>d(i-1))r--;
        id[++r]=i-1;
        while(l<=r&&id[l]<i-k)l++;
        dp[i]=d(id[l])+s[i]+sum[i];
    }
    printf("%.10lf",dp[n]);

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

G - Christmas Color Grid 2

写的时候忘记了,其实也是很经典的双端强连通分量问题。也是很板子,双端强连通分量可以解决无向图中去掉一个点求剩下强两桶分量的问题。详情可以看AcWing 1183. 电力 - AcWing

代码如下:

#pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int mod=998244353;
const int MX=0x3f3f3f3f3f3f3f3f; 
int n,m;
// vector<string>s(500005);
string s[500005];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int kuai(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans%mod;
}
int co[1000005];
int dfn[1000005];
int low[1000005];
int hh[1000005];
int num;
int top;
int col;
void icealsoheat(){
    int ans=0;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>s[i];
        ans+=count(s[i].begin(),s[i].end(),'#');
    }
    int an=0;
    vector<vector<int>>c(n+5,vector<int>(m+5,0));
    vector<vector<int>>ve(1000005);
    auto dfs=[&](auto self,int x,int y)->void{

        for(int i=0;i<4;i++){
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]=='#'&&c[xx][yy]==0){
                c[xx][yy]=an;
                // ve[x*m+y].push_back(xx*m+yy);
                // ve[xx*m+yy].push_back(x*m+y);
                self(self,xx,yy);
            }
        }
    };
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i][j]=='#'&&c[i][j]==0){
                c[i][j]=++an;
                dfs(dfs,i,j);
            }
            if (s[i][j] == '#')
                for (int k = 0; k < 4; k ++ ){}
                    int av = i + dx[k], bv = j + dy[k];
                    if (av<0||av>=n||bv<0||bv>=m) continue;
                    if (s[av][bv]!='#') continue;
                    ve[i*m+j].push_back(av*m+bv);
                    ve[av*m+bv].push_back(i*m+j);
                }
        }
    }

    auto tarjan=[&](auto self,int u,int fa)->void{
        dfn[u]=low[u]=++num;
        int cnt=0;
        for(auto v:ve[u]){
            if(dfn[v]==0){
                self(self,v,u);
                low[u]=min(low[u],low[v]);
                if(dfn[u]<=low[v]){
                    cnt++;
                }
            }
            else low[u]=min(low[u],dfn[v]);
        }
        if(fa!=-1)cnt++;
        hh[u]=cnt;
    };

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i][j]=='#'&&!dfn[i*m+j]){
                tarjan(tarjan,i*m+j,-1);
            }
        }
    }

    // cout<<ans<<"---\n";
    int chu=kuai(ans,mod-2)%mod;
    ans=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i][j]=='#'){
                ans+=an-1+hh[i*m+j];
                // cout<<an-1+hh[i*m+j]<<"++++\n";
                ans%=mod;
            }
        }
    }
    cout<<ans*chu%mod;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _yq;
    _yq=1;
    // cin>>_yq;
    while(_yq--){
        icealsoheat();
    }
}

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

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

相关文章

TIFF转JPG助手:轻松批量转换,优化图片管理

在数字时代&#xff0c;图片已成为我们生活和工作中不可或缺的一部分。为了更好地管理和使用这些图片&#xff0c;我们需要一个强大的工具来帮助我们转换和优化图片格式。TIFF转JPG助手正是这样一款理想的解决方案 首先&#xff0c;我们进入首助编辑高手主页面&#xff0c;会看…

qayrup-switch开发文档

因为只是一个小组件,所以直接拿csdn当开发文档了 书接上文uniapp怎么开发插件并发布 : https://blog.csdn.net/weixin_44368963/article/details/135576511 因为我业没有开发过uniapp的组件,所以我看到下面这个文件还是有点懵的 也不清楚怎么引入, 然后去翻了翻官方文档,官方…

基于时域有限差分法的FDTD的计算电磁学算法-YEE网格下的更新公式推导

基于时域有限差分法的FDTD的计算电磁学算法&#xff08;含Matlab代码&#xff09;-YEE网格下的更新公式推导 参考书籍&#xff1a;The finite-difference time-domain method for electromagnetics with MATLAB simulations&#xff08;国内翻译版本&#xff1a;MATLAB模拟的电…

面试官问,如何在十亿级别用户中检查用户名是否存在?

面试官问&#xff0c;如何在十亿级别用户中检查用户名是否存在&#xff1f; 前言 不知道大家有没有留意过&#xff0c;在使用一些app注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;需要更换一个&#xff0c;这是如何实现的呢&#xff1f;你可能想这不是很简单吗…

StarRocks中有趣的点

最近在工作中&#xff0c;遇到有小伙伴使用StarRocks&#xff0c;所以看了下文档&#xff0c;感觉以下几点比较有趣。 支持MySQL协议 想必是为了通用性&#xff0c;StarRocks 提供MySQL协议接口&#xff0c;支持标准SQL语法。即可通过MySQL客户端连接StarRocks&#xff0c;并…

Linux系统SSH远程管理服务概述

目录 一.SSH协议 1.定义 2.优点 &#xff08;1&#xff09;加密 &#xff08;2&#xff09;压缩 3.SSH的客户端与服务端 &#xff08;1&#xff09;客户端 &#xff08;2&#xff09;服务端 4.原理 5.实验&#xff1a;使用ssh远程登录 二.OpenSSH服务器 1.概念 2.…

Wargames与bash知识17

Wargames与bash知识17 Bandit25&#xff08;Bandit26&#xff09; 关卡提示 从bandit25登录到bandit26应该相当容易…用户bandit26的shell不是/bin/bash&#xff0c;而是其他东西。找出它是什么&#xff0c;它是如何工作的&#xff0c;以及如何摆脱它。 推荐命令 ssh, cat, …

ssm基于vue的儿童教育网站的设计与实现论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;视频信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

Java锁的分类

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

关于Web Tours

Web Tours 文章目录 简介下载解压安装并启动地址注册登录特殊情况 简介 Web Tours是惠普loadrunner自带的一个飞机订票系统网站&#xff0c;默认支持SQL Server数据库、Access、Mysql等多种数据库&#xff0c;基于ie、Chrome、Firefox等浏览器&#xff0c;Web Tours网站主要提…

Jenkins-执行脚本案例-初步认识JenKins的使用

环境搭建 docker pull jenkins/jenkins:2.440 docker run -d -p 10240:8080 -p 10241:50000 -v /env/liyong/data/docker/jenkins_mount:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins:2.440 #在挂载的目录下去修改仓库地址 vim hudson…

mysql复制表的几种常用方法

遇到需要拷贝一个表及其数据的情况,总结了一下几种方法 1.使用 show create table 旧表 将结果拷贝出来,将旧表名换成新表名即可. 注意:该方法仅适用于拷贝表结构,不需要同步数据的情况 show create table 旧表名2.create table 新表 like 旧表 该语句将完全拷贝旧表结构, …

15个为你的品牌增加曝光的维基百科推广方法-华媒舍

维基百科是全球最大的免费在线百科全书&#xff0c;拥有庞大的用户群体和高质量的内容。在如今竞争激烈的市场中&#xff0c;利用维基百科推广品牌和增加曝光度已成为许多企业的重要策略。本文将介绍15种方法&#xff0c;帮助你有效地利用维基百科推广品牌&#xff0c;提升曝光…

代码随想录算法训练营第四天|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

【IDEA】瑞_IDEA模版注释设置_IDEA自动生成注释模版(详细图文步骤)

文章目录 1 概要2 类的自定义模版注释3 自定义模版注释3.1 方法的自定义模版注释3.2 属性的自定义模版注释 &#x1f64a; 前言&#xff1a;在Java开发中&#xff0c;注释具有不可或缺的重要性&#xff0c;注释负责解释代码&#xff0c;能帮助开发人员深入理解代码的逻辑和功能…

强化学习应用(三):基于Q-learning算法的无人车配送路径规划(提供Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法&#xff0c;用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤&#xff1a; 1. 定义环境&#xff1a;确定问题的状态和动作空间&#xff0c;并…

宝塔面板安装MySQL8数据库

第一步&#xff1a;搜索mysql 第二步: 点击安装 我这里选择安装8版本 第三步&#xff1a;给宝塔配置mysql防火墙 第四步&#xff1a;修改数据库密码 第五步&#xff1a;想要使用navicat连接 需要修改root的权限 &#xff08;1&#xff09;使用secureCRT先登录mysql (2) 输入u…

Sentinel限流、熔断

1、限流 单个服务节点限流 sentinel 提供了两种不同的隔离机制&#xff1a;信号量隔离和线程池隔离&#xff0c;它们的主要区别如下&#xff1a; 信号量隔离&#xff08;Semaphore Isolation&#xff09;&#xff1a; 原理&#xff1a;信号量隔离基于计数器&#xff08;或称令…

电池均衡管理

一、前言 在电芯批量生产过程中&#xff0c;由于原料及生产工艺的波动&#xff0c;电芯的容量、内阻、电压及自放电率均会有一定的偏差&#xff0c;同时在电芯使用过程中随着充放电循环次数增加及存储时间、温度等影响&#xff0c;电芯容量衰减也会出现不一致&#xff0c;导致在…

有趣可操控的无人机足球大赛首次亮相,CES2024上的那些黑科技(二)

今年的CES2024&#xff08;国际消费电子展&#xff09;可谓是黑科技的盛宴&#xff0c;前天我们分享了5个有意思的产品&#xff0c;今天继续带来5个&#xff0c;一同探寻那些令人兴奋的黑科技&#xff0c;让我们的未来更加有趣和智能。 1400元巴掌大小AI硬件&#xff0c;首日卖…