1 条题解
-
0

#include <cstdio> #include <iostream> using namespace std; #define int long long const int M = 200005; const int inf = 1e18; int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,ans,p[M],a[M],b[M],c[M],A[M],B[M],C[M],dp[M],bit[M]; int lowbit(int x) { return x&(-x); } void add(int x,int y) { for(int i=x;i<=n;i+=lowbit(i)) bit[i]=min(bit[i],y); } int ask(int x) { int r=inf; for(int i=x;i>0;i-=lowbit(i)) r=min(r,bit[i]); return r; } signed main() { n=read();ans=inf; for(int i=1;i<=n;i++) { int x=read(); p[x]=i;//the position of person x bit[i]=inf; } for(int i=1;i<=n;i++) { a[i]=read(),b[i]=read(),c[i]=read(); A[i]=A[i-1]+a[i]; B[i]=B[i-1]+min(a[i],b[i]); C[i]=C[i-1]+min(a[i],c[i]); } for(int i=1;i<=n;i++) { dp[i]=min(B[i-1],ask(p[i])+A[i-1]); add(p[i],dp[i]-A[i]); ans=min(ans,dp[i]+C[n]-C[i]); } printf("%lld\n",ans); }
- 1
信息
- ID
- 12107
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者