这也是一道翻译题,你只需要把自然语言逐句转化为代码即可过题
这题体现了函数的直接和间接递归调用,两个操作会不断套娃,直到区间不存在为止
假设先实现操作 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;
}