提交时间:2024-11-07 17:40:19
运行 ID: 34364
#include<bits/stdc++.h> using namespace std; #define l_l long long const int N=1e6+10; int n,r[N],t[N]; l_l ans; char s[N]; int cur[N]; l_l tr[N<<2],tg[N<<2]; void pd(int x){ tr[x<<1]+=tg[x]; tg[x<<1]+=tg[x]; tr[(x<<1)|1]+=tg[x]; tg[(x<<1)|1]+=tg[x]; tg[x]=0; return ; } void pu(int x){ tr[x]=tr[x<<1]+tr[(x<<1)|1]; return ; } void modify(int x,int ll,int rr,int ss,int tt){ if(ll<=ss&&tt<=rr){ tr[x]++; tg[x]++; return ; } if(tt<ll||ss>rr) return ; if(tg[x]) pd(x); int mid=(ss+tt)>>1; modify(x<<1,ll,rr,ss,mid); modify((x<<1)|1,ll,rr,mid+1,tt); pu(x); return ; } void modify1(int x,int ll,int rr,int k){ if(ll==rr&&ll==k){ tr[x]++; return ; } if(tg[x]) pd(x); int mid=(ll+rr)>>1; if(k<=mid) modify1(x<<1,ll,mid,k); else modify1((x<<1)|1,mid+1,rr,k); pu(x); return ; } int enquire(int x,int ll,int rr,int k){ if(ll==rr&&ll==k){ return tr[x]; } if(tg[x]) pd(x); int mid=(ll+rr)>>1; if(k<=mid) return enquire(x<<1,ll,mid,k); else return enquire((x<<1)|1,mid+1,rr,k); } void dfs(int x,l_l cnt){ if(x>n){ ans=cnt; return ; } l_l enq=enquire(1,1,n,x); if((enq%2==0&&cur[x]==0)||(enq%2==1&&cur[x]==1)){ dfs(x+1,cnt); }else{ if(x!=r[x]) modify(1,x,r[x],1,n); else modify1(1,1,n,x); //cout<<x<<endl; dfs(x+1,cnt+t[x]); } } signed main(){ //freopen("poker.in","r",stdin); //freopen("poker.out","w",stdout); scanf("%d",&n); scanf("%s",s+1); for(int i=1;i<=n;i++){ cur[i]=s[i]-'0'; scanf("%d",&r[i]); } for(int i=1;i<=n;i++){ scanf("%d",&t[i]); } for(int i=1;i<=n;i++){ if(cur[i]){ dfs(i,0); break; } } printf("%lld",ans); //fclose(stdin); //fclose(stdout); return 0; } /* 10 0001011101 1 2 3 6 5 6 10 9 9 10 1 2 3 4 5 6 7 8 9 10 */