AC修炼计划(AtCoder Regular Contest 167)

news2024/12/29 8:51:56

传送门:AtCoder Regular Contest 167 - AtCoder

再次感谢樱雪喵大佬的题解,讲的很详细,Orz。

大佬的博客链接如下:Atcoder Regular Contest 167 - 樱雪喵 - 博客园 (cnblogs.com)

第一题很签到,就省略掉了。

第二题其实也不算难,要想清楚因子之间的关系(可是本人没长脑子被卡了俩小时)。通过分解质因数来得出最后的数有多少个因子,然后两两匹配,如果因子个数是奇数,说明存在完全平方数因子的情况,于是单独计算出这样的贡献。

代码如下:

#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; 
// void read(__int128 &x)
// {
//     x=0;
//     int f=1;
//     char ch;
//     if((ch=getchar())=='-') 
//     f=-f;
//     else 
//     x=x*10+ch-'0';

//     while((ch=getchar())>='0'&&ch<='9')
//         x=x*10+ch-'0';
//     x*=f;
// }
// void print(__int128 x){
    
//     if(x<0){
//         putchar('-');
//         x=-x;
//     }
//     if(x>9)
//         print(x/10);
        
//     putchar(x%10+'0');
// }
int n,m;
int an;
int su[1000005];
bool c[1000005];

void suu(int x){
    for(int i=2;i<=x;i++){
        if(!c[i])su[++an]=i;
        for(int j=1;j<=an&&su[j]*i<=x;j++){
            c[su[j]*i]=1;
            if(i%su[j]==0)break;
        }
    }
}
int kuai(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=ans*a%N;
        b>>=1;
        a=a*a%N;
    }
    return ans%N;
}
void icealsoheat(){
    cin>>n>>m;
    int bn=n;
    if(m==0){
        cout<<0;
        return;
    }
    vector<PII>ve;
    for(int i=1;i<=an&&su[i]<=sqrt(n);i++){
        if(n%su[i]==0){
            ve.push_back({su[i],0});
            while(n>1&&n%su[i]==0){
                ve.back().second++;
                n/=su[i];
            }
        }
    }
    if(n>1){
        ve.push_back({n,1});
    }
    int sum=1;
    int cnt=0;
    for(auto [i,j]:ve){
        if(m%2==1&&j%2==1)cnt=1;
        sum=sum*(m%N*j%N+1ll)%N;
    }
    int ans=0;
    // ans=sum*kuai(2ll,N-2)%N*(m%N)%N;
    // // if(cnt==0)ans=(ans+m/2)%N;
    // if(cnt==0){
    //     ans=((ans-1)%N+N)%N;
    //     ans=ans=(ans+m/2)%N;
    // }
    if(cnt==0){
        sum=((sum-1)%N+N)%N;
    }
    ans=sum*kuai(2ll,N-2)%N*(m%N)%N;
    if(cnt==0)ans=(ans+m/2)%N;
    cout<<ans;


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

C - MST on Line++

c,写着题的时候真的很想骂娘。没想到要在限制下标并且在各种顺序的情况下,还得考虑最小生成树的贡献。。。。。。。脑子快炸了,看大佬的代码,好不容易才磕出来。同时也学到了一种新思路。首先,计算这种排列组合题,一般都会想到求出每一个值对答案的贡献,然后相加。在用kruskal算法求最小生成树的时候,我们发现我们只用考虑边全值的大小,对其优先排列。那我们只要求出每一个Ai对应的有几个边的长度就好了。因为我们需要求的是最小值,所以,尽可能的让所有数小才是最优的,按照数值顺序来说,相邻的会尽可能的小。这里看Atcoder Regular Contest 167 - 樱雪喵 - 博客园 (cnblogs.com)

佬的博客吧,解释的特别清楚。

代码如下:

#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;
int an;
int a[500005];
int c[5005][5005];
int f[500005];
int be[500005];
void init(int mx)
{
    for(int i=0;i<=mx;i++)
        for(int j=0;j<=i;j++) c[i][j]=j?(c[i-1][j-1]+c[i-1][j])%N:1;
}
void icealsoheat(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    be[0]=1;
    for(int i=1;i<=n;i++){
        be[i]=be[i-1]*i%N;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            f[i]=(f[i]+(i-1)*c[n-j][i-1]%N)%N;
        }
        f[i]=be[i]*be[n-i]%N*f[i]%N;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans=(ans+((f[i]-f[i-1])%N+N)%N*a[i]%N)%N;
    }
    cout<<ans;

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

D - Good Permutation

这道题最开始我是用优先队列来维护的,因为我们要找在改变次数最小的基础上,要求词序也要最小。我们不妨把所有的序列都涂上各自的颜色,看看有几种颜色,然后每个都取最小的那个,进行不断的替换。但出现了问题。因为存在会误删一些边和点的情况。

后来看了佬的思路,感觉很奇妙,通过并查集来找所有所有的环,然后用set去维护这个环的最小值,如果当前的最小值小于后面环的最小值的话,就替换并且将两个环合并。否则我们不希望字典序变大,尽量不换。但如果这是它所在连通块的最后一个位置,必须要换,那就找后面最小的环值来替换这个值。

代码如下:

#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;
int an;
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int col,tot,top,num;
// int co[200010];
// int dfn[200010];
// int low[200010];
// int a[200010];
int b[200005];
int pre[200005];
int fa[200005];
int c[200005];
int siz[200005];
int mn[200005];
set<PII>q;
int find(int x){
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
void icealsoheat(){
    cin>>n;
    q.clear();
    for(int i=1;i<=n;i++){
        cin>>b[i];
        pre[b[i]]=i;
        fa[i]=i;
        siz[i]=1;
        mn[i]=i;
        q.insert({i,i});
    }
    auto add=[&](int x,int y)->void{
        x=find(x);
        y=find(y);
        if(x==y)return;
        q.erase({mn[x],x});
        q.erase({mn[y],y});
        fa[x]=y;
        siz[y]+=siz[x];
        mn[y]=min(mn[x],mn[y]);
        q.insert({mn[y],y});
    };
    for(int i=1;i<=n;i++){
        add(i,b[i]);
    }
    // for(int i=1;i<=n;i++){
        // cout<<fa[i]<<"+++\n";
        // cout<<mn[fa[i]]<<"---\n";
    //     cout<<pre[b[fa[i]]]<<"\n";
    // }
    for(int i=1;i<=n;i++){
        if(q.size()==1)break;
        auto it=q.begin();
        if(find(it->second)==find(i))it++;
        if(it->first<b[i]||siz[find(i)]==1){
            int j=pre[it->first];
            // cout<<i<<":"<<j<<"\n";
            swap(b[j],b[i]);
            swap(pre[b[j]],pre[b[i]]);
            add(i,j);
        }
        siz[find(i)]--;
    }
    for(int i=1;i<=n;i++)cout<<b[i]<<" ";
    cout<<"\n";    
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _;
    _=1;
    cin>>_;
    while(_--){
        icealsoheat();
    }
}

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

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

相关文章

函数设计心得:尽量避免布尔型参数

通常来说&#xff0c;我认为在设计一个函数原型的时候&#xff0c;应该尽量避免使用布尔类型的参数&#xff0c;除非函数名称能十分清楚的将这个参数的意思表达出来。 我并没有想教你做事&#xff0c;但是请听我细说 先举两个正面的例子&#xff0c;有一个 API 函数 EnableWi…

系统韧性研究(2)|系统韧性如何关联其他质量属性?

对大多数人来说&#xff0c;如果一个系统在逆境中继续执行它的任务&#xff0c;那么它会被认为具有韧性。换句话说&#xff0c;尽管过度的压力或多或少都会导致系统中断&#xff0c;但如果系统依然能够正常运行并提供所需的能力&#xff0c;则可认为该系统具备韧性。 系统韧性…

显示杂谈(二)winscope的使用

WinScope 提供了用于在窗口转换期间和转换后记录和分析 WindowManager 状态和 SurfaceFlinger 状态的基础架构和工具。WinScope 将所有相关的系统服务状态记录在一个跟踪文件中&#xff0c;您可以使用该文件重现并逐步查看转换。 抓winscope相关文件: 通过快捷设置记录跟踪情…

git初学者使用教程(包含Android studio中git使用)

文章目录 1、登录 / 注册git账号2、创建git仓库3、设置git的用户名和邮箱4、创建git仓库5、已有仓库推送代码到远程仓库6、进阶使用&#xff0c;命令行和Android studio软件使用1. 克隆&#xff08;Clone&#xff09;源码仓库2. 查看仓库状态&#xff08;Status&#xff09;3. …

JAVA获取30天或某段范围日期的方法

JAVA获取30天或某段范围日期的方法,在项目使用中比较频繁。 public class Main {public static void main(String[] args) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate now = LocalDate.now();List<String> dateLi…

在云上使用 OpenText 实现业务关键型应用程序的现代化

通过在云中进行信息管理建立持久的竞争优势 创新在云中发生的速度比以往任何时候都快 企业面临着数字经济快速转型的挑战&#xff0c;充分释放业务信息的能力对于建立持久的竞争优势至关重要。为分散的员工扩大安全可靠的协作范围将是生产力和创新的关键驱动力。 如今大多数企…

发电机组负载测试的工作原理

发电机组负载箱是用于连接发电机组和负载设备的设备&#xff0c;其通过电源输入端与发电机组连接&#xff0c;接收发电机组输出的电能&#xff0c;发电机组负载箱内部设有多个电路分支&#xff0c;根据负载需求和优先级&#xff0c;将电能分配给不同的负载设备&#xff0c;这些…

性能评测 | GreatDB VIP PLUGIN方案 VS MySQL InnoDB Cluster高可用方案

前言 最近&#xff0c;我们与许多数据库用户进行了沟通和调研&#xff0c;了解到&#xff0c;目前仍有相当一部分投产的MySQL高可用或故障转移方案&#xff0c;用到了读写分离功能或业务接入VIP&#xff08;Virtual IP Address&#xff09;的方式&#xff0c;来屏蔽后端数据库架…

Crypto(4)NewStarCTF 2023 week2 Crypto Rotate Xor

题目代码: # 导入所需的库和从secret模块加载"flag" from secret import flag from os import urandom from pwn import xor from Cryptodome.Util.number import *# 生成两个随机的 64 位素数&#xff0c;分别存储在变量 k1 和 k2 中 k1 getPrime(64) k2 getPrim…

科普丨语音芯片烧录流程概述

语音芯片的烧录是将特定的固件或软件加载到芯片中&#xff0c;以使其能够执行特定的语音处理功能。以下是一般的语音芯片烧录过程&#xff1a; 1. 准备固件或软件&#xff1a;开发人员需要编写或获取特定的固件或软件&#xff0c;这些固件或软件包含了语音处理算法和功能的代码…

Lake Formation 和 IAM 之间的区别与联系

IAM 和 Lake Formation 都是 AWS 上的权限管理服务,且默认都是自动开启并生效的,只是如果你没有特别配置过它们,可能感觉不到它们的存在,特别是Lake Formation(后文简写为 LF),通常情况下都是“透明”的,虽然但它确实在每次请求时进行了权限检查。本文会详细介绍一下两…

22款奔驰S400L升级原厂360全景影像 倒车更加的安全

您是否经历过这种场面呢&#xff1f; 停车位&#xff0c;狭窄障碍停车困难 避免盲区&#xff0c;倒车盲区危及生命安全 狭窄路段&#xff0c;无法判断是否安全通过 视角盲区&#xff0c;小孩站在视野盲区看不到&#xff0c;Xjh15863 360度无缝3D全车可见&#xff0c;解决各…

手撸大文件上传:实现切片上传,断点上传和文件秒传的功能。

一、前提说明 此文章主要讲述后端服务代码和前后端实现思路部分&#xff0c;不涉及前端代码。 二、应用场景 上传视频等大文件的时候&#xff0c;调用服务器的上传接口&#xff0c;可能出现因为文件过大&#xff0c;连接时间超时导致的上传失败&#xff0c;如果文件太大了&…

如何修复Python中的缩进错误?

目录 缩进的概念和规则 缩进错误的类型 &#xff08;1&#xff09;缩进量错误 &#xff08;2&#xff09;缩进范围错误 修复缩进错误的方法 &#xff08;1&#xff09;检查代码块的层次结构 &#xff08;2&#xff09;统一使用空格或制表符 &#xff08;3&#xff09;使…

java三层架构/表现层-业务层-持久层

三层架构 什么是 Java 三层架构 三层架构是指&#xff1a;视图层view&#xff08;表现层&#xff09;&#xff0c;服务层service&#xff08;业务逻辑层&#xff09;&#xff0c;持久层Dao&#xff08;数据访问层&#xff09;&#xff0c; Java的三层架构是指将Java程序分为三…

公众号留言功能卖多少钱?报价多少?

为什么公众号没有留言功能&#xff1f;2018年2月12日之后直到现在&#xff0c;新注册公众号的运营者会发现一个问题&#xff1a;无论是个人还是企业的公众号&#xff0c;在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验&#xff0c;少了一个这么重要的功能&…

Vue2基础知识(二) 计算属性/侦听器/生命周期

&#x1f48c; 所属专栏&#xff1a;【Vue2】&#x1f600; 作 者&#xff1a;长安不及十里&#x1f4bb;工作&#xff1a;目前从事电力行业开发&#x1f308;目标&#xff1a;全栈开发&#x1f680; 个人简介&#xff1a;一个正在努力学技术的Java工程师&#xff0c;专注基础和…

vue记住密码

<div class"checkbox-login"><input type"checkbox" id"defaults" v-model"loginForm.rememberMe" /><label class"label" for"defaults">记住密码</label></div> .checkbox-logi…

RPA的尽头是超自动化?

超自动化在经过数年的发酵期后&#xff0c;已从一个科技概念崛起为市值近千亿元的新赛道&#xff0c;包括各大互联网巨头、科技公司都纷纷围绕超自动化进行战略布局。 一方面&#xff0c;是行业巨头选择纷纷跻身超自动化新赛道&#xff0c;另一方面&#xff0c;RPA行业的领军企…

邯郸学院软件学院软件工程专业教师参加“火焰杯”软件测试颁奖典礼

近日&#xff0c;全国第三届“火焰杯”软件测试河北赛区颁奖典礼在河北工程技术学院举行。我院软件工程教研室主任张颖、教师王金如受邀参与此次颁奖典礼。王金如老师获得大赛优秀指导教师二等奖&#xff0c;软件学院荣获优秀组织单位奖。 赛事开始之际&#xff0c;学院就积极…