Submission #1229300

#TimeUsernameProblemLanguageResultExecution timeMemory
1229300alexander707070Homework (CEOI22_homework)C++20
100 / 100
111 ms81800 KiB
#include<bits/stdc++.h> #define MAXN 1000007 using namespace std; struct node{ int l,r; int type; }; int n; string s; stack<int> st; node tree[MAXN]; int sum[MAXN]; void add_edge(int x,int y){ if(tree[x].l==0)tree[x].l=y; else tree[x].r=y; } int dp[MAXN][2]; int ff(int x,int t){ if(x==0)return 1; if(dp[x][t]>0)return dp[x][t]; if(tree[x].type!=t){ dp[x][t]=ff(tree[x].l,t) + ff(tree[x].r,t); }else{ dp[x][t]=min(ff(tree[x].l,t) , ff(tree[x].r,t)); } return dp[x][t]; } int smaller,bigger; void dfs(int x){ if(x==0){ sum[smaller+1]++; sum[n-bigger+1]--; return; } if(tree[x].type==1){ smaller+=ff(tree[x].r,2); dfs(tree[x].l); smaller-=ff(tree[x].r,2); smaller+=ff(tree[x].l,2); dfs(tree[x].r); smaller-=ff(tree[x].l,2); }else{ bigger+=ff(tree[x].r,1); dfs(tree[x].l); bigger-=ff(tree[x].r,1); bigger+=ff(tree[x].l,1); dfs(tree[x].r); bigger-=ff(tree[x].l,1); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>s; st.push(0); for(int i=0;i<s.size();i++){ if(s[i]=='m' or s[i]=='n' or s[i]=='(' or s[i]==',' or s[i]=='?')continue; if(s[i]==')')st.pop(); if(s[i]=='a' or s[i]=='i'){ n++; add_edge(st.top(),n); if(s[i]=='a')tree[n].type=1; else tree[n].type=2; st.push(n); } } n++; dfs(1); int s=0,ans=0; for(int i=1;i<=n;i++){ s+=sum[i]; if(s>0)ans++; } cout<<ans<<"\n"; 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...