1593. 水桶

这也是一道翻译题,你只需要把自然语言逐句转化为代码即可过题

这题体现了函数的直接和间接递归调用,两个操作会不断套娃,直到区间不存在为止

假设先实现操作 1 ,此时还没有代码实现操作 2 ,却需要调用操作 2 ,所以可以在实现操作 1 之前先声明操作 2 ;这里体现了函数声明的作用

这题没有卡 long long ,为降低难度,特地把数据弱化到 int 可以过题

参考代码:

#include <bits/stdc++.h> using namespace std; typedef long long ll; ll s[102], t, v, a, b, k, n; void f2(ll); void f1(ll a, ll b) { for (ll i = a; i <= b; ++i) { ++s[i]; } f2(b); if (a + 1 <= b - 1) { f1(a + 1, b - 1); } } void f2(ll x) { s[x] += ++k; if (x + 2 <= n) { f1(x + 1, x + 2); } if (2 * x <= n) { f2(2 * x); } } signed main() { scanf("%lld%lld", &n, &t); while (t--) { scanf("%lld", &v); if (v == 1) { scanf("%lld%lld", &a, &b); f1(a, b); } else { scanf("%lld", &a); f2(a); } for (ll i = 1; i <= n; ++i) { printf("%lld ", s[i]); } printf("\n"); } return 0; }