提交时间:2024-11-07 17:41:24

运行 ID: 34367

#include<bits/stdc++.h> using namespace std; const int N = 1e6+10; int n,s[N]; long long int ans=7e18; struct T{ int l; int r; int t; }a[N]; struct Q{ int l; int r; int sum; int lazy; }tr[N*4]; inline void pushup(int i){ tr[i].sum=tr[i*2].sum+tr[i*2+1].sum; } inline void pushdown(int i){ if(tr[i].lazy==0) return; if(tr[i].l==tr[i].r){ tr[i].lazy=0; return; } tr[i*2].lazy=tr[i].lazy; tr[i*2+1].lazy=tr[i].lazy; tr[i*2].sum=(tr[i*2].r-tr[i*2].l+1)-tr[i*2].sum; tr[i*2+1].sum=(tr[i*2+1].r-tr[i*2+1].l+1)-tr[i*2+1].sum; tr[i].lazy=0; } inline void build(int i,int l,int r){ tr[i].l=l; tr[i].r=r; tr[i].lazy=0; if(l==r){ tr[i].sum=s[l]; return; } int mid=(l+r)/2; build(i*2,l,mid); build(i*2+1,mid+1,r); pushup(i); } inline void update(int i,int l,int r){ pushdown(i); if(tr[i].l>=l&&tr[i].r<=r){ tr[i].lazy=1; tr[i].sum=(tr[i].r-tr[i].l+1)-tr[i].sum; return; } if(tr[i*2].r>=l){ update(i*2,l,r); } if(tr[i*2+1].l<=r){ update(i*2+1,l,r); } pushup(i); } inline int query(int i,int l,int r){ pushdown(i); if(tr[i].l>=l&&tr[i].r<=r){ return tr[i].sum; } int ans=0; if(tr[i*2].r>=l){ ans+=query(i*2,l,r); } if(tr[i*2+1].l<=r){ ans+=query(i*2+1,l,r); } return ans; } inline void subtask2(){ ans=0; for(int i=1;i<=n;i++){ if(s[i]==1){ for(int j=a[i].l;j<=a[i].r;j++){ s[j]=1-s[j]; } ans+=a[i].t; } } cout<<ans<<endl; } inline void dfs(int x,long long int cnt){ bool flag=true; for(int i=1;i<=n;i++){ if(s[i]==1){ flag=false; break; } } if(flag){ ans=min(ans,cnt); return; } if(x==n+1){ return; } for(int i=a[x].l;i<=a[x].r;i++){ s[i]=1-s[i]; } dfs(x+1,cnt+a[x].t); for(int i=a[x].l;i<=a[x].r;i++){ s[i]=1-s[i]; } dfs(x+1,cnt); } inline void subtask1(){ dfs(1,0); cout<<ans<<endl; } inline void subtask3(){ ans=0; build(1,1,n); for(int i=1;i<=n;i++){ if(query(1,i,i)==1){ update(1,a[i].l,a[i].r); ans+=a[i].t; } } cout<<ans<<endl; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ char c; cin>>c; s[i]=c-'0'; } for(int i=1;i<=n;i++){ cin>>a[i].r; a[i].l=i; } for(int i=1;i<=n;i++){ cin>>a[i].t; } if(n<=20){ subtask1(); } else if(n<=5000){ subtask2(); } else{ subtask3(); } return 0; }