专栏文章

题解:P11643 【MX-X8-T2】「TAOI-3」终有一天,飞向水平线的彼方

P11643题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqd7j44
此快照首次捕获于
2025/12/04 02:53
3 个月前
此快照最后确认于
2025/12/04 02:53
3 个月前
查看原文

P11643题解

  • 可以发现每次操作就是对一个子数组加上或减去一个 回文 的先递减、后递增的另一个数组。
  • 针对上面的结论,先考虑只操作一次。为方便,操作前全部数字为 11,且先考虑加法。我们把操作前后的差值 Δ\Delta 也列举出来。
操作前111111
操作后432234
Δ\Delta321123
特别地,数组 1 1 操作后为 2 2,都是加上了 11。这里有一个技巧:将大的操作转化为小的操作
例如,对于刚才表格的操作,我们也可以看成是:
操作前111111
第一次操作444444
第二次操作433334
第三次操作432234
所以,我们可以把一次“集体加”的操作看成是全部加上,然后中间在单独减。每个“大”操作都可以拆分成若干个 1 1 操作。
我们也可以把这个单独的操作反过来
对于差值:
Δ\Delta321123
第一个 3 是操作前的数组加上的,现在我们让它“减回来”。由于刚才说了,操作可以看成是两个数单独做加一减一操作,所以我们让第二个数字 2 减去 33
我们看看这个表格:
Δ\Delta321123
1和20-11123
2和3002123
3和4000-123
4和5000033
5和6000000
最终这个“差值”数组全部都为 00。这是因为我们可以将题目给定的操作“反着”进行一遍。
相反,如果最终不为 00,则不能按照题目要求进行操作。
代码
CPP
#include <bits/stdc++.h>
using namespace std;

long long a[100010], b[100010], delta[100010];

int main()
{
    int t; cin >> t;
    while (t--)
    {
        int n; cin >> n;
        for (int i=1; i<=n; i++) cin >> a[i];
        for (int i=1; i<=n; i++) cin >> b[i];
        for (int i=1; i<=n; i++) delta[i] = b[i] - a[i];
        for (int i=1; i<n; i++)  delta[i+1] -= delta[i];
        if (delta[n]) cout << "No\n";
        else cout << "Yes\n";
    }
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...