【题解】牛客小白月赛16(部分题,待补充……)

本文深入探讨了动态规划和矩阵快速幂两种算法在解决数学和计算机科学问题中的应用。通过实例解析了如何使用动态规划计算三角形各层数字之和,以及如何运用矩阵快速幂高效处理海岛分割问题。同时,介绍了这两种算法的基本思想和实现细节,旨在帮助读者更好地理解和掌握这些高级算法。
摘要由CSDN通过智能技术生成

B-小雨的三角形

题目描述
小雨手上有一个填满了数字的三角形。这个三角形一共有n层,其中第i层共有i个数,
且第1个数和第i个数均为i 。其余的数中,第j个数是上一层中第j-1个数和第j个数的和。
小雨想知道这个三角形第 x 层到第 y 层所有数的和,一共有 m 个询问。

输入描述:
第一行两个正整数 n,m,表示这个三角形的层数和询问个数。
接下来 m 行,每行两个正整数 x,y,表示一次询问。

输出描述:
输出共 m 行,每行一个整数,表示一组询问的答案,对 10^9+7 取模。

示例1
输入

5 3
1 2
1 5
3 5

输出

5
83
78

说明
画出这个三角形:
1
2 2
3 4 3
4 7 7 4
5 11 14 11 5
第1~2层的和为 1 + 2 + 2 = 51+2+2=5 。

第1~5层的和为 1 + 2 + 2 + 3 + 4 + 3 + 4 + 7 + 7+ 4 + 5 + 11 + 14 + 11 + 5 = 831+2+2+3+4+3+4+7+7+4+5+11+14+11+5=83 。

第3~5层的和为 3 + 4 + 3 + 4 + 7 + 7+ 4 + 5 + 11 + 14 + 11 + 5 = 783+4+3+4+7+7+4+5+11+14+11+5=78 。

备注:
1 ≤ n ≤ 10 ^ 3, 1 ≤ m ≤ 10^3, 1 ≤ x ≤ y ≤ n

详解思路:
将每层的总和用公式 2 * a[i-1]+2 计算出来

#include<bits/stdc++.h>
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn = 1e3+5;
int mod = 1000000007;
typedef long long ll;
int a[maxn] = {1};

int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++)
		a[i] = (2*a[i-1]+2) % mod;
	
	int x, y;
	for (int i = 0; i < m; i++) {
		scanf("%d%d", &x, &y);

    ll count = 0;
	  for (int j = x-1; j <= y-1; j++) {
		  count += a[j];
		  count = count % mod;
	  }
	  printf("%lld\n", count);
	}
}

C-小石的海岛之旅

题目描述
暑假到了,小石和小雨到海岛上玩。
从水平方向看海岛可以看成 nn个小块,每一个小块都有一个高度hi
水位一开始为 0,随着水位的上升,海岛分成了若干块。
现在有 m 个询问,求当水位为ai时,海岛会分成多少块。

输入描述:
第一行输入两个正整数n,m,分别表示海岛小块个数和询问个数。
第二行输入 n 个整数 hi,表示每一块的高度。
第三行输入 m个整数 ai,表示每一个询问,保证输入的 ai单调递增。

输出描述:
共 m 行,分别对应 m 个询问的答案。

示例1
输入

7 3
1 2 3 1 2 1 3
1 2 3

输出

3
2
0

说明
当水位高度为 1 时,岛屿被分成 3 块,2 3;2;3
当水位高度为 2 时,岛屿被分成 2 块:3;3 。
当水位高度为 3 时,岛屿全部被淹没,剩余 0 块 。

备注:
1 ≤ n,m ≤10 ^ 3, 1≤ hi ≤10^9, 1 ≤ai < ai+1 ≤ 10 ^9

详解思路:
先将每个小岛减去水位高度,可根据正负判断单个岛屿是否被淹没。
用count计数水位后分为几块岛屿,前一个淹没,后一个不被淹没的情况下可count++ 。

#include<bits/stdc++.h>
const int maxn=1e3+5;
using namespace std;
int n, m;
int h[maxn];

int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    scanf("%d", &h[i]); 
  while (m--) {
    int k;
    scanf("%d", &k);
    int a[maxn];
    for (int i = 1; i <= n; i++)
      a[i] = h[i]-k;
    int count = 0;
    for (int i = 1; i <= n; i++)
      if (a[i]>0 && a[i-1]<=0)
        count++;
    cout << count << endl;
  }
}

E-小雨的矩阵

小雨的矩阵-解法链接(dfs模板)

H-小阳的贝壳

题目描述
小阳手中一共有 n 个贝壳,每个贝壳都有颜色,且初始第 i 个贝壳的颜色为 coli。
现在小阳有 3 种操作:

1 l r x:给 [l,r][l,r] 区间里所有贝壳的颜色值加上 x

2 l r:询问 [l,r][l,r] 区间里所有相邻贝壳 颜色值的差(取绝对值) 的最大值(若l=r输出 0)

3 l r :询问 [l,r][l,r] 区间里所有贝壳颜色值的最大公约数

输入描述:
第一行输入两个正整数 n,mn,m,分别表示贝壳个数和操作个数。
第二行输入 n 个数 coli,表示每个贝壳的初始颜色。
第三到第 m+2 行,每行第一个数为 opt,表示操作编号。
接下来的输入的变量与操作编号对应。

输出描述:
共 m 行,对于每个询问(操作 2 和操作 3)输出对应的结果。

示例1
输入

5 6
2 2 3 3 3
1 2 3 3
2 2 4
3 3 5
1 1 4 2
3 2 3
2 3 5

输出

3
3
1
3

备注:
1≤n,m≤10 ^5 ,1≤col i , x≤10 ^3 , 1≤opt≤3, 1≤l≤r ≤n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你脸上有BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值