1 solutions
-
0
题意
题目每次询问,如果能通过多次操作把一个序列变成全0,则输出yes,每次操作可以往长度为的区间加上某个数, 可以是负数。
题解
往区间加一个数等于往差分序列两个点加数,所以这里可以看成对两个位置,。可以发现,对于,这些数可以分作一组。即 这些数之间的操作才会影响到对方,当这组数为时,才可以通过调整变成区间全为。 进而对于区间查询 可以得出 所以可以得到当区间内所有数的项的和相等时,差分和也为0
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(false); cin.tie(0); int N, K; cin >> N >> K; vector<int> a(N); for (auto &x : a) cin >> x; vector<vector<ll>> sum(K + 1, vector<ll>(N + 1)); for (int k = 0; k < K; k++) for (int i = 0; i < N; i++) { sum[k][i + 1] = sum[k][i] + (i % K == k ? a[i] : 0); } int Q; cin >> Q; while (Q--) { int l, r; cin >> l >> r; l--; bool ok = true; for (int k = 0; k < K; k++) { if (sum[k][r] - sum[k][l] != sum[0][r] - sum[0][l]) ok = false; } if (ok) { cout << "Yes\n"; } else cout << "No\n"; } return 0; }
Information
- ID
- 40
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- (None)
- # Submissions
- 8
- Accepted
- 3
- Uploaded By