#pragma GCC optimize("Ofast") #pragma GCC optimization ("O3") #pragma GCC optimization ("unroll-loops") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; #define mp make_pair #define eb emplace_back #define pb push_back #define e1 first #define e2 second #define uint unsigned int #define ll long long #define ull unsigned long long #define ld long double #define float long double #define size(x) (int)x.size() #define satori int testCases; cin>>testCases; while(testCases--) #define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define all(r) begin(r),end(r) #define time chrono::high_resolution_clock().now().time_since_epoch().count() typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; mt19937 rng(chrono::high_resolution_clock().now().time_since_epoch().count()); /////////////////// #define debug if(1) /////////////////// const int MAXN=1e5+10; const ll inf=1e18+2137; int n; vector<pair<int,int>> oper[MAXN]; ll solve(ll x,vector<ll> values,vector<int> pos,int closed){ if(closed==n) return x; ll min_sol=inf; for(int i=0;i<n;i++) if(pos[i]!=size(oper[i])){ ll hisx=x; vector<ll> his_values=values; vector<int> his_pos=pos; int his_closed=closed; if(pos[i]+1==size(oper[i])) his_closed++; if(oper[i][pos[i]].e1==0) his_values[i]=hisx; else if(oper[i][pos[i]].e1==1) hisx=his_values[i]; else his_values[i]+=oper[i][pos[i]].e2; his_pos[i]++; min_sol=min(min_sol,solve(hisx,his_values,his_pos,his_closed)); } return min_sol; } int32_t main() { fastio; satori{ int x,m; cin>>n; for(int i=0;i<n;i++) oper[i].clear(); char c; for(int i=0;i<n;i++){ cin>>m; for(int j=0;j<m;j++){ cin>>c; if(c=='W'){ oper[i].eb(mp(0,0)); } else if(c=='Z'){ oper[i].eb(mp(1,1)); } else if(c=='+'){ cin>>x; oper[i].eb(mp(2,x)); } else{ cin>>x; oper[i].eb(mp(2,-x)); } } } vector<int> curr_state(n,0); vector<ll> curr_values(n,0ll); cout<<solve(0,curr_values,curr_state,0)<<'\n'; } }
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 | #pragma GCC optimize("Ofast") #pragma GCC optimization ("O3") #pragma GCC optimization ("unroll-loops") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; #define mp make_pair #define eb emplace_back #define pb push_back #define e1 first #define e2 second #define uint unsigned int #define ll long long #define ull unsigned long long #define ld long double #define float long double #define size(x) (int)x.size() #define satori int testCases; cin>>testCases; while(testCases--) #define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define all(r) begin(r),end(r) #define time chrono::high_resolution_clock().now().time_since_epoch().count() typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; mt19937 rng(chrono::high_resolution_clock().now().time_since_epoch().count()); /////////////////// #define debug if(1) /////////////////// const int MAXN=1e5+10; const ll inf=1e18+2137; int n; vector<pair<int,int>> oper[MAXN]; ll solve(ll x,vector<ll> values,vector<int> pos,int closed){ if(closed==n) return x; ll min_sol=inf; for(int i=0;i<n;i++) if(pos[i]!=size(oper[i])){ ll hisx=x; vector<ll> his_values=values; vector<int> his_pos=pos; int his_closed=closed; if(pos[i]+1==size(oper[i])) his_closed++; if(oper[i][pos[i]].e1==0) his_values[i]=hisx; else if(oper[i][pos[i]].e1==1) hisx=his_values[i]; else his_values[i]+=oper[i][pos[i]].e2; his_pos[i]++; min_sol=min(min_sol,solve(hisx,his_values,his_pos,his_closed)); } return min_sol; } int32_t main() { fastio; satori{ int x,m; cin>>n; for(int i=0;i<n;i++) oper[i].clear(); char c; for(int i=0;i<n;i++){ cin>>m; for(int j=0;j<m;j++){ cin>>c; if(c=='W'){ oper[i].eb(mp(0,0)); } else if(c=='Z'){ oper[i].eb(mp(1,1)); } else if(c=='+'){ cin>>x; oper[i].eb(mp(2,x)); } else{ cin>>x; oper[i].eb(mp(2,-x)); } } } vector<int> curr_state(n,0); vector<ll> curr_values(n,0ll); cout<<solve(0,curr_values,curr_state,0)<<'\n'; } } |