제출 #1215352

#제출 시각아이디문제언어결과실행 시간메모리
1215352boclobanchatFancy Fence (CEOI20_fancyfence)C++20
13 / 100
16 ms3656 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=1e5+5; const long long mod=1e9+7; long long A[MAXN],B[MAXN],pos[MAXN],dsu[MAXN],sum=0; bool ck[MAXN]; bool comp(int a,int b) { return A[a]>A[b]; } int root(int i) { if(!dsu[i]) return i; return dsu[i]=root(dsu[i]); } void merge(int i,int j) { if((i=root(i))==(j=root(j))) return ; sum=(sum-B[i]*(B[i]+1)/2%mod+mod)%mod; sum=(sum-B[j]*(B[j]+1)/2%mod+mod)%mod; dsu[j]=i,B[i]=(B[i]+B[j])%mod; sum=(sum+B[i]*(B[i]+1)/2%mod+mod)%mod; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; stack<int> st; long long ans=0; for(int i=1;i<=n;i++) cin>>A[i]; for(int i=1;i<=n;i++) cin>>B[i]; for(int i=1;i<=n;i++) pos[i]=i; sort(pos+1,pos+n+1,comp); for(int i=1;i<=n;i++) { sum=(sum+B[pos[i]]*(B[pos[i]]+1)/2%mod)%mod,ck[pos[i]]=true; if(ck[pos[i]-1]) merge(pos[i],pos[i]-1); if(ck[pos[i]+1]) merge(pos[i],pos[i]+1); if(A[pos[i]]!=A[pos[i+1]]) ans=(ans+sum*A[pos[i]])%mod; } cout<<ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...