Codeforces Round #841 (Div. 2) and Divide by Zero 2022(A-D)

news2024/9/27 19:23:40

Codeforces Round #841 (Div. 2) and Divide by Zero 2022(A-D)

题目链接限制
AJoey Takes Moneystandard input/output1 s, 256 MB
BKill Demodogsstandard input/output1 s, 256 MB
CEven Subarraysstandard input/output2.5 s, 256 MB
DValiant’s New Mapstandard input/output2 s, 256 MB

综述

题目有一点点不友好,对于D,竟然…

但是总的难度还行

image

补题

A Joey Takes Money

image

image

image

input

3
3
2 3 2
2
1 3
3
1000000 1000000 1

output

28308
8088
2022000000004044

题目大意

给定一个数组,有下列操作

  • 选择两个数字 i 和 j (1≤i<j≤n)
  • 选择两个整数 x 以及 y,使得x⋅y=ai⋅aj
  • 然后使用x替换ai,使用y替换aj

可以使用任意数目的以上操作,使得所有的数字加起来最大。

思路

根据样例,可以猜想,最后把n-1个元素变为1,然后相加起来是最大的。

(贪心)证明:

假设有两个数字不是1,那么他们的值一定大于1,设两个数字为a, b

然后我:a --> a*b, b --> 1比较变化之前以及变化之后的数字大小:

a + b − ( a × b − 1 ) = ( a − 1 ) ( 1 − b ) a+b-(a\times b - 1) = (a-1)(1-b) a+b(a×b1)=(a1)(1b)

很小于1

所以变化之后更大。

代码

#include <bits/stdc++.h>
using namespace std;;
#define N 55
typedef long long ll;
ll a[N];
int n;

int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) scanf("%lld", a+i);
        ll ans = 1;
        for(int i = 1; i <= n; i++) ans *= a[i];
        ans += n - 1;
        ans *= 2022;
        printf("%lld\n", ans);
    }
    return 0;
}

B Kill Demodogs

image

image

input

4
2
3
50
1000000000

output

14154
44484
171010650
999589541

题目大意

给定一个 n × n n\times n n×n 的矩阵,主角开始在 ( 1 , 1 ) (1,1) 11处,目的地在 ( n , n ) (n, n) (n,n)处。

在每一个单元格上都有怪兽,在第 i 个单元格上的怪兽数量是 i × j i\times j i×j.

主角只能向下或者是向右移动。

问:主角最多杀死多少个怪兽。

在这一道题目中,矩阵显然关于斜对角线具有对称性,所以我们选择右上角的观察

image

先凭借知觉,我们观察到,好像中间的数字比较大,所以我们尽可能沿着中间的路走

所以猜想路线:右-下-右-下…

(贪心)证明:

由于每一个格子上的怪兽数目是 i × j i\times j i×j

现在我们假设最优解不是我们设想的路径。

image

现在到达(i+1, j+1)有两种路径。

比较通过蓝色路径以及通过红色路径的大小

蓝色路径: i ( j + 1 ) i(j+1) i(j+1)

红色路径: ( i + 1 ) j (i+1)j (i+1)j

作差: i ( j + 1 ) − ( i + 1 ) j = i − j i(j+1) - (i+1)j = i - j i(j+1)(i+1)j=ij

现在假如 j 大于 i ,那么我们就应该走红色路径。

就这样,对于不是最优解的情况,我们可以使用这一种方法不断变成我们的假设。所以我们的假设就是最优解。

然后计算的话就是

m a x v = ∑ i = 1 n i 2 + ∑ n = 1 n − 1 i ( i + 1 ) = ∑ i = 1 n i 2 + ∑ i = 1 n − 1 i 2 + ∑ i = 1 n − 1 i maxv = \sum_{i=1}^{n}i^2 + \sum_{n=1}^{n-1}i(i+1) = \sum_{i=1}^{n}i^2 + \sum_{i=1}^{n-1}i^2+\sum_{i=1}^{n-1}i maxv=i=1ni2+n=1n1i(i+1)=i=1ni2+i=1n1i2+i=1n1i

由于n最大是 1 0 9 10^9 109,所以应该使用公式计算

补充相关的数学公式

image

image

tim = int(input())
for T in range(tim):
    n = int(input())
    ans = 0
    ans += n*(n+1)*(2*n+1)//6
    ans += (n-1)*n*(2*n-1)//6
    ans += n*(n-1)//2
    ans = ans*2022%1000000007
    print(ans)

其实除法取模(除法逆元)也很简单

前提:

  1. 确保取模的哪一个数字是质数
  2. 确保可以整除

所以有 a / b = a ∗ b m o d − 2 % m o d a/b = a*b^{mod-2} \%mod a/b=abmod2%mod

C Even Subarrays

image

image

image

input

4
3
3 1 2
5
4 2 1 5 3
4
4 4 4 4
7
5 7 3 7 1 7 3

output

4
11
0
20

思路

这一道题目着实很妙。

首先:因数个数是奇数个的数字是非完全平方数。

但是非完全平方数比较多,我们考虑反方面:完全平方数!

首先,要是真的来枚举这一个区间,是不可行的。

对于一个区间来想,可能不是太清晰,所以可以利用前缀和思想,把区间问题转化为端点问题。

sum[L-1] XOR sum[R] == a[L] OXR .....XOR a[R]

然后我们可以枚举R,当务之急就是找到在R之前有多少个前缀与sum[R]异或之后的值是非完全平方数(枚举一遍非完全平方数)。

我们开一个数组cnt[x]记录在R之前的所有前缀中值为x的个数。

然后就可以O(1)求出个数。

总体时间复杂度为O(n*sqrt(2n))

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 200200
int a[N];
int sum[N];// a的前缀数组
int cnt[N*2];// 两个小于n的数进行异或,值最大不超过2N
signed main()
{
    int T;
    cin >> T;
    while(T--)
    {
        int n;
        scanf("%lld", &n);
        for(int i = 1; i <= n; i ++){
            scanf("%lld", a+i);
        }
        int ans = 0;// 答案的反面
        for(int i = 1; i <= n; i++){
            sum[i] = sum[i-1] ^ a[i];
      
        }
        cnt[0] = 1;
        // 这是因为如果sum[R] == 完全平方数,那么其实选择从1到R就可以,所以cnt[0]应该为1
        for(int i = 1; i <= n; i++){
            for(int x = 0; x * x <= 2*n; x++){
                int t = (x*x) ^ sum[i];
                if(t > 2 * n) continue;//因为x * x <= 2*n,所以可能整出来大于2n的
                ans += cnt[t];
            }
            cnt[sum[i]] ++;
        }
      
        printf("%lld\n", (long long)n * (n+1)/2 - ans);
        for(int i = 0; i <= n; i++) {
            sum[i] = 0;
        }
        for(int i = 0; i <= n * 2; i++){
            cnt[i] = 0;
        }
    }

    return 0;
}

D Valiant’s New Map

image

image

input

4
2 2
2 3
4 5
1 3
1 2 3
2 3
4 4 3
2 1 4
5 6
1 9 4 6 5 8
10 9 5 8 11 6
24 42 32 8 11 1
23 1 9 69 13 3
13 22 60 12 14 17

output

2
1
1
3

题目大意

给定一个 n × m n\times m n×m的矩阵,求一个最大值l,使得在矩阵中存在有 l × l l\times l l×l 的方格中的最小值大于等于 l

思路

首先容易证明具有单调性:

如果可以找到使得在矩阵中存在有 l × l l\times l l×l 的方格中的最小值大于等于 l,那么我就在这片区域中一定能找到 m × m m\times m m×m 的方格中的最小值大于等于 m ( m ≤ l m\le l ml)

然后问题就成了这样:给定一个框的大小,求有没有一种框法,使得框柱的数字的最小值是给定值。

如果暴力显然时间不够用,但是最小值又不能合起来表示(以一部分的最小值表示)。

但是这里我们的给定值是一个固定的值,所以我们并没有必要知道某一个区域中的最小值是多少,而是仅仅需要知道这一个区域的最小值是不是小于给定值就可以了。

所以我建立一个二维前缀和,如果大于等于给定值,那么我们假想值为0,否则值为1

然后查询前缀和中的值是不是0就可以判断这一种框法是否可行。

但是

这一道题目恶心在数组必须动态开

为此有两种方法:

  • 动态内存分配(额…)
    int **a = (int **)calloc(n, sizeof(int*));
    for(int i = 0; i < n; i++) a[i] = (int *)calloc(m, sizeof(int));

别忘了之后还要free!!

注意:开辟后自动有初始值0

  • 使用vector来实现

resize会分配空间,并且自动初始化为0

也可以resize(大小, 初始值)

shrink_to_fit()可以让已经分配的内存空间缩小到size的大小

#include <bits/stdc++.h>
using namespace std;
int n, m;
#define N 1100000
bool ck(int mid, int **a, int ** f)
{
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + (a[i][j] < mid);
            // printf("%d ", f[i][j]);
        }
        // puts("");
    }
    for(int i = mid; i <= n; i++){
        for(int j = mid; j <= m; j++){
            if(f[i][j] - f[i - mid][j] - f[i][j - mid] + f[i-mid][j-mid] == 0) return true;
        }
  
    }
    return false;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &n, &m);
        //int *a[m + 1] = (int *[m+1])calloc((n+1)*(m+1), sizeof(int));int** p = (int **)malloc(3*sizeof(int*));//申请指针数组
 
        int** a = (int **)malloc((n+1)*sizeof(int*));
 
        for(int i=0; i<n+1; i++)
        {
            a[i] = (int*)malloc((m+1)*sizeof(int));
        }

    	int** f = (int **)malloc((n+1)*sizeof(int*));
  
        for(int i=0; i<n+1; i++)
        {
            f[i] = (int*)malloc((m+1)*sizeof(int));
        }

        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
                scanf("%d", &a[i][j]);
            }
        }

        int l = 1, r = min(n, m);
        while(l < r)
        {
            int mid = (l + r + 1) >> 1;
            if(ck(mid, a, f)) l = mid;
            else r = mid - 1;
        }  
        printf("%d\n", l);
       for(int i=0; i<n+1; i++)
        {
            free(f[i]);
            free(a[i]);
        } 
        free(a);
        free(f);
    }
    return 0;
}

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

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

相关文章

数字经济指标构建-各省、地级市匹配上市公司数据、城市数字化指数

一、中国城市数字经济指数2017-2022年&#xff08;数据代码报告&#xff09; 中国城市数字化指数全面覆盖城市数字化规划、建设、运营的各个方面&#xff0c;能够有效评估城市各个领域的数字化建设水平和运营效果。 全国城市数字经济发展热图 数据来源&#xff1a;中国城市数字…

语音转换之CycleGan-VC2:原理与实战

非平行语音转换CycleGAN 之前学习了传统统计学习里的经典的语音转换模型GMM。随着深度学习的发展&#xff0c;出现了更好的语音转换方法&#xff0c;今天学习较为经典的CycleGan。 平行语音转换一般流程 典型代表就是基于GMM的语音转换。平行数据就是说源语音和目标语音一一…

矢量图斑局部狭长判断和定位局部狭长部分(PostGIS、Java、C#实现)

矢量数据在数据采集过程中由于数据处理导致出现局部狭窄的面状部分&#xff0c;如下图 1. 定义和解决方法 狭长结构是指图斑几何形态上窄而长的部分,符号化后出现图形粘连压盖现象,导致难以在图面上清晰地表达出来。因此,依据地图表达比例尺因素需要对狭长结构进行融解处理。在…

helm部署frps和连接

文章目录一. helm部署frps1.1 下载1.2 部署1.2.1 不开启dashboard界面1.2.2 开启dashboard界面1.2.3 卸载1.3 查看1.4 IP Port 允许端口1.5 Web Ingress二. frpc客户端连接2.1 IP Port 连接2.2 Web 域名连接一. helm部署frps 1.1 下载 mkdir -p /root/i/helm && cd…

并查集专题1_图篇

1.并查集介绍 并查集支持查询和合并操作&#xff0c;只回答两个节点是不是在一个连通分量中&#xff0c;并不回答路径问题。 如果一个问题具有传递性&#xff0c;可以考虑用并查集。并查集最常见的一种设计思想是把在同一个连通分量中的节点组织成一个树形结构。 2.并查集的…

动作捕捉技术应用于地面移动机器人协同

《一千零一夜》故事集中收录的《阿拉丁神灯》深受读者们的喜爱&#xff0c;其中阿拉丁拥有一块神奇的魔毯&#xff0c;它具有运载功能&#xff0c;可以将物体轻松便捷的从一个地方转移到另一个地方。在现实生活中&#xff0c;可变形布作为一种轻量便携且具有良好适应性的载体&a…

redhat9中mysql常用命令(持续更新)

目录 1、查看当前用户 2、查看选择的数据库 3、创建数据库 4、创建数据表 5、插入数据 6、查看表所以字段的内容 7、查看数据库当前密码策略 8、查看密码插件 9、更改密码策略为LOW&#xff0c;改为LOW或0 10、 更改密码长度 11、设置大小写、数字和特殊字符均不要求 …

微服务系列专栏介绍

文章目录一 专栏介绍1.1 微服务行业背景不同行业IT系统更新频率IT系统存在的问题微服务架构在企业中应用情况1.2 什么是微服务1.3 微服务的特点1.4 微服务诞生背景1.5 微服务架构的优势二 专栏目标三 专栏涉及技术四 专栏架构1.微服务架构&#xff1a;2.Go语言3.go-micro架构4.…

入侵无线WiFi的主要方式及防护要点

从攻击形态上看&#xff0c;无线网络攻击主要可以分为三个大类&#xff1a;被动型攻击、主动型攻击以及针对网络组件的攻击&#xff1a; 被动攻击一般发生在攻击者处于无线网络范围内并可以监视无线通信内容时&#xff0c;最常见的被动攻击是数据包嗅探。由于被动攻击者只是监…

HTTPS 的通信加解密过程,证书为什么更安全?

经典面试题 HTTPS 的通信加解密过程&#xff0c;证书为什么更安全&#xff1f; 考察点 《计算机网络》相关知识 了解 HTTPS 协议加解密的过程 了解数字证书认证的过程 技术点 对称加密和非对称加密 HTTPS 协议的加解密过程 数字证书认证过程 对称加密和非对称加密 对称加…

Mysql 小Tips

Mysql 小Tips 目录Mysql 小Tips1.group_concat2.char_length3.locate4.replace5.now6.insert into ... select7.insert into ... ignore8.select ... for update9.on duplicate key update10.show create table11.create table ... select12.explain13.show processlist14.mysq…

企业电子招投标采购系统源码之首页设计

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

字符设备驱动(二)

1. IO模型 &#xff08;1&#xff09;阻塞式IO&#xff1a;不能操作就睡觉 &#xff08;2&#xff09;非阻塞式IO&#xff1a;不能操作就返回错误 &#xff08;3&#xff09;IO复用 &#xff08;4&#xff09;信号驱动式IO &#xff08;5&#xff09;异步IO 2.阻塞与…

c++算法基础必刷题目——按位贪心

文章目录按位贪心1、毒瘤xor2、兔子的区间密码3、起床困难综合症按位贪心 1、毒瘤xor NC18979 毒瘤xor 题目描述 小a有N个数a1, a2, …, aN&#xff0c;给出q个询问&#xff0c;每次询问给出区间[L, R]&#xff0c;现在请你找到一个数X&#xff0c;使得 1、0⩽X<231 2、∑…

Vue(ref和$refs属性介绍与使用)

一、 Vue(ref和$refs属性介绍与使用) 在Vue中一般很少会用到直接操作DOM&#xff0c;但不可避免有时候需要用到&#xff0c;这时我们可以通过ref和$refs这两个来实现&#xff0c;本文我们就来详细的介绍下这个内容 除了自定义属性外&#xff0c;Vue实例还暴露一些有用的实例属性…

Educational Codeforces Round 140 (Rated for Div. 2)

A. Cut the Triangle 题目链接&#xff1a;Problem - A - Codeforces 样例输入&#xff1a; 44 7 6 8 3 54 5 4 7 6 85 8 1 8 2 53 6 6 6 6 3 样例输出&#xff1a; YES YES YES NO题意&#xff1a;在二维平面上给定一个非退化三角形的三个顶点&#xff0c;问我们能不能用…

NVIDA CUDA和cuDNN安装教程

文章目录一. 查看自己的GPU版本是否支持cuda二 .安装CUDA三. 安装cuDNN一. 查看自己的GPU版本是否支持cuda 打开显卡的控制面板&#xff0c;查看显卡是否支持cuda 二 .安装CUDA 去官网查看cuda版本与所需系统固件的对应关系 从官网下载所需的CUDA Toolkit Archive,这里下载…

04-Css+Nginx

前端入门——CSS 1 CSS入门 1.1 初识CSS 1.1.1 概述 在学习了基本HTML标签和样式后&#xff0c;接下来学习前端开发的第二门技术。 我们发现&#xff0c;虽然标签的属性可以调整一些样式&#xff0c;但是效果不够理想&#xff0c;而我们更愿意把样式编写在<style> 标…

CSS 实现七彩圆环loading动画

前言 &#x1f44f;CSS 实现七彩圆环loading动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义父容器宽度为–w&#xff0c;每个圆环之间的gap间距为–gap&#xff0c;圆环的border边框宽为–border&am…

7个从Windows计算机上恢复Word文档的方法

你是否有受到Windows上损坏或丢失的Word文件的困扰&#xff1f;好吧&#xff0c;你并不孤单&#xff01; 文件损坏是 Word 文档的常见问题。此外&#xff0c;人们不小心删除了文件或忘记保存最新版本。 由于Word文件通常包含您在个人或职业生涯中所需的重要数据&#xff0c;因…