牛客网提高组6 解题报告

本文提供了牛客网提高组6的三道编程题的解题报告,包括题目描述、输入输出示例、解题分析及代码实现。题目涉及积木表面积计算、回文数列恢复和班级分组问题,通过分析和代码展示了解题思路和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A

题目描述

Venn非常喜欢积木,所以这是一道和积木有关的题。
BLUESKY007和Venn在堆积木。Venn有一个 n × m n×m n×m的场地,BLUESKY007有 q q q次操作。
BLUESKY007每次会选定一个矩形区域。具体的每次给一组 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2)表示矩阵的左下角和右上角。在这个矩阵所覆盖的每一个格子里,累加一个积木块。每个积木块可以可以抽象为一个 1 × 1 × 1 1×1×1 1×1×1的正方体。
现在,Venn想知道他们堆出来的物体的表面积。
注意:堆出物体的底面积也算作表面积,请结合样例理解.

输入描述:

第一行三个整数 n , m , q n,m,q n,m,q
接下来q行,每行四个整数 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 x1,y1,x2,y2

表示BLUESKY007选择的矩阵的左下角和右上角坐标。

输出描述:

一行一个整数表示物体的表面积

示例1
输入

4 4 3
1 1 4 4
1 1 2 2
3 3 4 4

输出

64

示例2
输入

4 4 1
1 1 2 2

输出

16

在这里插入图片描述

分析

因为只有 1 1 1 次询问,所以先先二维差分,然后再求前缀和还原原数组。得到原数组后怎么求表面积呢?(我特喵就是表面积求错了真自闭了,比赛最后下载完大样例才发现5555)。
对于每个点,如果有积木,先算上上下部分, s = s + 2 s = s + 2 s=s+2。再考虑四周,每个面的表面积怎么算入答案呢?我们需要比较四周积木和它的高度,如果比它小,就要加上他们的高度差作为表面积。

代码如下
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int mp[5005][5005];
LL s, sum;
int main(){
    int i, j, n, m, q, a, b, c, d, maxn;
    scanf("%d%d%d", &n, &m, &q);
    while(q--){
        scanf("%d%d%d%d", &a, &b, &c, &d);
        mp[a][b]++, mp[c+1][b]--, mp[a][d+1]--, mp[c+1][d+1]++;
    }
    for(i = 1; i <= n + 1; i++){
        for(j = 1; j <= m + 1; j++){
            mp[i][j] += mp[i-1][j] + mp[i][j-1] - mp[i-1][j-1];
            //printf("%d %d %d\n", i, j, mp[i][j]);
        }
    }
    for(i = 1; i <= n; i++){
        for(j = 1; j <= m; j++){
            if(mp[i][j]) sum += 2;
            if(mp[i][j] > mp[i][j-1]) sum += (mp[i][j] - mp[i][j-1]);
            if(mp[i][j] > mp[i][j+1]) sum += (mp[i][j] - mp[i][j+1]);
            if(mp[i][j] > mp[i-1][j]) sum += mp[i][j] - mp[i-1][j];
            if(mp[i][j] > mp[i+1][j]) sum += (mp[i][j] - mp[i+1][j]);
        }
    }
    printf("%lld", sum);
    return 0;
}

B

题目描述

BLUESKY007鸽鸽又在玩她的数列了。
这次BLUESKY007有一个长度为n的正整数数列,里面每一个数值都不超过k。一个数列 b 1 , b 2 , b 3 . . . b n b_1,b_2,b_3...b_n b1,b2,b3...bn

为回文数列,当且仅当该数列满足 ∀ i ∈ [ 1 , n ]   , b i = b n − i + 1 \forall i \in [1,n]\ ,b_i=b_{n-i+1} i[1,n] bi=bni+1
BLUESKY007非常关注序列的回文性质,并且她关注的回文种类和她的心情有关。
当她开心时她喜欢不存在长度为奇数且大于1的回文子串的数列,当她不开心时她喜欢不存在长度为偶数且大于1的回文子串的数列。
Venn又把BLUESKY007鸽鸽的数列弄坏了,导致里面的部分数字不见了。Venn想趁BLUESKY007鸽鸽回来之前,恢复整个序列,但是他只知道BLUESKY007鸽鸽现在的心情,以及这个数列原本是BLUESKY007喜欢的数列。
Venn为了恢复整个序列,他想知道有多少种不同的数列可能是原本的数列。
由于可能的数列太多会导致Venn崩溃,所以你只需要告诉他这个数字对998244353取模的答案即可。
输入描述:
第一行三个正整数n,k,m表示数列的长度,数列里面数字的上限,以及BLUESKY007此时的心情,m=0表示心情不好,m=1表示心情偷税。
第二行n个整数, a 1 , a 2 , a 3 . . . a n a_1,a_2,a_3...a_n a1,a2</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值