cf918div4的E题讲解

虽然是div4,但是打的稀烂,哭死。

E题看了jiangly的题解豁然开朗,原来思路这么简单。被自己蠢到了,我傻傻的用前缀和,两层for枚举区间,不出意外TLE了,写的那一刻就知道要超时,但是没思路了。下面是讲解

想一下一段区间下标为奇数的元素和和下标为偶数的元素和相等意味着什么,是不是意味着奇数和减去偶数和=0。

cf918div4的E题讲解_第1张图片

可以发现当l=4,r=5的时候下标为奇数的元素和时等于下标为偶数的元素和,他们对应的元素加和自然就为0了,所以7这个元素出现了两次,相当于7加上了下标为奇数的和又减去下标为偶数的和,所得结果不变,说明这段区间符合我们的要求。问题就转化为了反转后的元素的前缀和是否会出现相同的元素,出现了说明有符合条件的区间。

下面是jiangly大佬的代码

using i64 = long long;

void solve() {
    int n;
    std::cin >> n;

    std::vector s(n + 1);
    std::set set{0LL};
    for (int i = 0; i < n; i++) {
        int a;
        std::cin >> a;
        s[i + 1] = s[i] + (i % 2 ? 1 : -1) * a;
        set.insert(s[i + 1]);
    }
    if (set.size() != n + 1) {
        std::cout << "YES\n";
    }
    else {
        std::cout << "NO\n";
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t;
    std::cin >> t;

    while (t--) {
        solve();
    }

    return 0;
}

 

你可能感兴趣的:(算法,题目讲解)