제출 #1326070

#제출 시각아이디문제언어결과실행 시간메모리
1326070sporknivesHomework (CEOI22_homework)C++20
53 / 100
734 ms589824 KiB
#include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int,int> pii; // 1 - max, 2 - min vector<int> l,r; vector<int> op; int cur = 0; void process(string s, int n) { //cout<<"processing string: "<<s<<" "<<n<<'\n'; int cnt=0; if(s=="?") { op[n]=-1; return; } else if(s[1]=='i')op[n]=0; else op[n]=1; if(s[4]=='?') { cur++; l[n]=cur; process("?",cur); cur++; r[n]=cur; process(s.substr(6,s.length()-7), cur); return; } int idx=-1; for(int i=4;i<s.length();i++) { if(s[i]=='(') cnt++; else if(s[i]==')') { cnt--; if(cnt==0) { cur++; l[n]=cur; process(s.substr(4,i-3),cur); idx=i; break; } } } cur++; r[n]=cur; process(s.substr(idx+2,s.length()-idx-3),cur); } vector<pii> range; vector<int> leaves; void dfs(int x) { if(op[x]==-1) { range[x]={1,1}; leaves[x]=1; return; } dfs(l[x]); dfs(r[x]); leaves[x] = leaves[l[x]] + leaves[r[x]]; if(op[x]==1) { range[x].first = range[l[x]].first + range[r[x]].first; range[x].second = leaves[x] - min(leaves[l[x]]-range[l[x]].second, leaves[r[x]]-range[r[x]].second); } else { range[x].first = min(range[l[x]].first, range[r[x]].first); range[x].second = leaves[x] - (leaves[l[x]]-range[l[x]].second) - (leaves[r[x]]-range[r[x]].second) - 1; } } signed main() { string s; cin>>s; int n = 0; for(char c: s) { if(c=='?')n++; } l.resize(2*n); r.resize(2*n); op.resize(2*n); range.resize(2*n); leaves.resize(2*n); process(s,0); dfs(0); cout<<range[0].second-range[0].first+1; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...