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-小雨的矩阵
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