提交时间:2024-11-07 18:06:06
运行 ID: 34374
#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=1e6+7; const int INF=1e16; int n; bool s[maxn]; bool d[maxn]; int cd[maxn]; int cs[maxn]; int t[maxn]; int r[maxn]; inline void sub1(){ int ans=1e16; int Y=0; for(int S=0;S<(1<<n);S++){ for(int i=1;i<=n;i++)cd[i]=d[i]; int T=0; for(int i=1;i<=n;i++){ if(S&(1<<i-1))T+=t[i],cd[i]^=1,cd[r[i]+1]^=1; bool C=1; for(int i=1;i<=n;i++)cs[i]=cs[i-1]^cd[i]; for(int i=1;i<=n;i++)if(cs[i]==1){C=0;break;} if(C)if(T<ans)ans=T,Y=S; } } cout<<ans<<endl; } vector<int> E[maxn]; int up[maxn]; int f[maxn][2]; int g[maxn][2]; inline void DFS(int u){ int G0=0,G1=INF; for(auto v:E[u]){ DFS(v); int Gp0=0,Gp1=0; Gp0=min(G0+f[v][0],G1+f[v][1]); Gp1=min(G1+f[v][0],G0+f[v][1]); G0=Gp0,G1=Gp1; } g[u][0]=G0,g[u][1]=G1; if(d[u])f[u][0]=G1,f[u][1]=G0+up[u]; else f[u][0]=G0,f[u][1]=G1+up[u]; } signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++){char t;cin>>t;s[i]=t-'0';} for(int i=1;i<=n;i++)d[i]=s[i]^s[i-1]; for(int i=1;i<=n;i++)cin>>r[i]; for(int i=1;i<=n;i++)cin>>t[i]; if(n<=20){ sub1(); return 0; } for(int i=1;i<=n;i++)E[r[i]+1].push_back(i),up[i]=t[i]; DFS(n+1); int c=0; for(auto v:E[n+1])c=c+min(f[v][0],f[v][1]); cout<<c<<endl; cout.flush(); return 0; }