嘘~ 正在从服务器偷取页面 . . .

[ARC119C] ARC Wrecker 2 题解


[ARC119C] ARC Wrecker 2 题解

题目链接:[ARC119C] ARC Wrecker 2

题意

在 AtCoder 街道上有 \(N\) 座建筑物,从西到东编号为 \(1\)\(N\)。初始时,建筑物 \(1, 2, \ldots, N\) 的高度分别为 \(A_1, A_2, \ldots, A_N\)

cxy 是 ARC Wrecker 公司的总裁,她计划选择整数 \(l\)\(r\) \((1 \leq l < r \leq N)\),并使得建筑物 \(l, l+1, \ldots, r\) 的高度全部变为 \(0\)。为了达成这个目标,她可以任意次数任意顺序地使用以下两种操作:

  1. 设置一个整数 \(x\) \((l \leq x \leq r-1)\) 并使得建筑物 \(x\)\(x+1\) 的高度各增加 \(1\)
  2. 设置一个整数 \(x\) \((l \leq x \leq r-1)\) 并使得建筑物 \(x\)\(x+1\) 的高度各减少 \(1\)。这种操作仅当这两座建筑物的高度都大于等于 \(1\) 时才能进行。

请注意,\(x\) 的范围取决于 \((l,r)\)

有多少种 \((l,r)\) 的选择可以让 cxy 实现她的计划?

数据范围

\(2 \leq N \leq 3\times 10^5,~1 \leq A_i \leq 10^9\)

这个消数值的属于是经典题了。经典题就经典在每次你看到相似的都不会

容易发现同奇偶性的数可以相互传递数值,而单个修改的操作是同时抵消奇偶性不同的两个数。

因此我们可以得到一个结论,一段区间如果可以被删光,则奇数位的和与偶数位的和相等。

显然这个只需要把偶数位乘以 \(-1\) 就可以转化为「区间和为 \(0\) 」了,考虑前缀和处理。

一段区间 \([l,r]\) 合法当且仅当 \(S_{l-1} = S_r\) ,然后就是简单的组合计数问题了

时间复杂度 \(\mathcal{O}(n)\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x,int y) { x < y ? x = y : 0; }
void down(int &x,int y) { x > y ? x = y : 0; }
#define N ((int)())

int n,sum,res;
unordered_map<int,int> mp;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    cin >> n; mp[0] = 1;
    for(int i = 1, x; i <= n; i++)
    {
        cin >> x; sum += x * ((i & 1) ? 1 : -1);
        res += mp[sum]; ++mp[sum];
    }
    cout << res << '\n';
    return 0;
}

参考文献

[1] https://www.luogu.com.cn/blog/back-to-you/Solutions-arc119c


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录