Untitled
unknown
plain_text
5 months ago
2.0 kB
2
Indexable
#include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<long long> A(n); for(int i=0;i<n;i++) cin >> A[i]; // Compute prefix sums vector<long long> prefix(n+1, 0); for(int i=1;i<=n;i++) prefix[i] = prefix[i-1] + A[i-1]; // Build map from sum to list of indices // sum -> list of j where prefix[j] = sum // j ranges from 0 to n unordered_map<long long, vector<int>> sum_map; for(int j=0; j<=n; j++) { sum_map[prefix[j]].push_back(j); } bool found = false; for(int i=0;i<n;i++){ long long S = prefix[n] - A[i]; if(S %2 !=0) continue; long long target = S /2; // Check if target exists in prefix[j] where j <i if(sum_map.find(target) != sum_map.end()){ const vector<int> &lst = sum_map[target]; // Need j <=n, and j <i // Find if there's any j in lst where j <i // Using upper_bound // lst is sorted // Find first j >=i // Number of j <i is lower_bound(lst.begin(), lst.end(), i) - lst.begin() int cnt = lower_bound(lst.begin(), lst.end(), i) - lst.begin(); if(cnt >0){ found = true; break; } } // Check if target + A[i] exists in prefix[j} where j >=i long long target_plus = target + A[i]; if(sum_map.find(target_plus) != sum_map.end()){ const vector<int> &lst = sum_map[target_plus]; // Find if there's any j >=i // Using lower_bound // Find first j >=i int pos = lower_bound(lst.begin(), lst.end(), i) - lst.begin(); if(pos < lst.size()){ found = true; break; } } } if(found) cout << "Yes\n"; else cout << "No\n"; }
Editor is loading...
Leave a Comment