#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
typedef double db;
typedef pair<int, int> pii;
#define all(x) (x).begin(), (x).end()
#define sz(x) (x).size()
#define rep(i, l, r) for(int i=l; i<(r); i++)
ll nxt(){
ll x;
cin >> x;
return x;
}
vector<ll> read_one() {
int ile;
cin >> ile;
vector<ll> ans;
int cur;
char c;
cin >> c;
if(c == '(') cur = 1;
else cur = -1;
while(ile--) {
int x;
cin >> x;
ans.push_back(cur*x);
cur=-cur;
}
return ans;
}
void solve(){
int ans = 0;
vector<ll> a = read_one();
vector<ll> b = read_one();
vector<pll> v;
ll najgorzej = 0;
ll bilans = 0;
ll razem = 0;
for(int i=0; i<a.size(); i++) {
bilans += a[i];
razem += a[i];
najgorzej = min(najgorzej, bilans);
if(bilans > 0) {
v.emplace_back(bilans, najgorzej);
bilans = 0;
najgorzej = 0;
}
}
//cerr << "naj: "<<najgorzej<<"\n";
for(auto p : v) {
//cerr << p.first << " " << p.second << "\n";
}
vector<int> c;
for(auto e : b) {
if(e < 0) for(int i=0; i<-e; i++) c.push_back(-1);
else for(int i=0; i<e; i++) c.push_back(1);
}
for(int l = 0; l < sz(c); l++) {
ll najlepiej = 0;
ll bilans = 0;
ll moj_wlasny = 0;
ll ktore_teraz = 0;
while(ktore_teraz < v.size() && bilans + v[ktore_teraz].second >= 0) {
bilans += v[ktore_teraz].first;
ktore_teraz++;
najlepiej = 0;
}
for(int r = l; r < sz(c); r++) {
bilans += c[r];
moj_wlasny += c[r];
najlepiej = max(najlepiej, bilans);
if(bilans < 0) break;
while(ktore_teraz < v.size() && bilans + v[ktore_teraz].second >= 0) {
bilans += v[ktore_teraz].first;
ktore_teraz++;
}
if((ktore_teraz == v.size()) && (najlepiej + najgorzej >= 0) && (moj_wlasny + razem == 0)){
//cerr <<"udalo sie: "<< l << " " <<r << "\n";
ans++;
}
}
}
cout << ans << "\n";
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
// cin >> t;
while(t--){
solve();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<ll, ll> pll; typedef double db; typedef pair<int, int> pii; #define all(x) (x).begin(), (x).end() #define sz(x) (x).size() #define rep(i, l, r) for(int i=l; i<(r); i++) ll nxt(){ ll x; cin >> x; return x; } vector<ll> read_one() { int ile; cin >> ile; vector<ll> ans; int cur; char c; cin >> c; if(c == '(') cur = 1; else cur = -1; while(ile--) { int x; cin >> x; ans.push_back(cur*x); cur=-cur; } return ans; } void solve(){ int ans = 0; vector<ll> a = read_one(); vector<ll> b = read_one(); vector<pll> v; ll najgorzej = 0; ll bilans = 0; ll razem = 0; for(int i=0; i<a.size(); i++) { bilans += a[i]; razem += a[i]; najgorzej = min(najgorzej, bilans); if(bilans > 0) { v.emplace_back(bilans, najgorzej); bilans = 0; najgorzej = 0; } } //cerr << "naj: "<<najgorzej<<"\n"; for(auto p : v) { //cerr << p.first << " " << p.second << "\n"; } vector<int> c; for(auto e : b) { if(e < 0) for(int i=0; i<-e; i++) c.push_back(-1); else for(int i=0; i<e; i++) c.push_back(1); } for(int l = 0; l < sz(c); l++) { ll najlepiej = 0; ll bilans = 0; ll moj_wlasny = 0; ll ktore_teraz = 0; while(ktore_teraz < v.size() && bilans + v[ktore_teraz].second >= 0) { bilans += v[ktore_teraz].first; ktore_teraz++; najlepiej = 0; } for(int r = l; r < sz(c); r++) { bilans += c[r]; moj_wlasny += c[r]; najlepiej = max(najlepiej, bilans); if(bilans < 0) break; while(ktore_teraz < v.size() && bilans + v[ktore_teraz].second >= 0) { bilans += v[ktore_teraz].first; ktore_teraz++; } if((ktore_teraz == v.size()) && (najlepiej + najgorzej >= 0) && (moj_wlasny + razem == 0)){ //cerr <<"udalo sie: "<< l << " " <<r << "\n"; ans++; } } } cout << ans << "\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; while(t--){ solve(); } } |
English