제출 #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...