思路讲解
答案一定形如跳跳跳到最后一题,然后把剩下的题全做了。
那这个跳到最后一题的过程一定要最小化,所以就是最短路啦
那么要最小化什么那?损失的分数,那么要最小化的就是权,或者说是边权
当然,这个人说的有点瑕疵,起始在跳到最后一题的过程中有两种跳法,一种是跳到B[i],一种是跳到i-1
1 2 3 4
| pq.push({B[s],Dis[s]+A[s]});
if(s>1) pq.push({s-1,Dis[s]});
|
还有一种思路,用线段树或者树状数组
AC代码
https://codeforces.com/contest/2024/submission/300344376
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> #include <cctype> #include <array>
typedef long long ll; typedef std::pair<ll,ll> pll; typedef std::array<ll,2> arr; const ll MAXN=static_cast<ll>(4e5)+10,MAXDIS=1e17+7; ll N,T,B[MAXN],A[MAXN],sumA[MAXN],Dis[MAXN];
struct cmp{ bool operator()(arr a,arr b){ if(a[1]!=b[1]){ return a[1]>b[1]; } return false; } }; bool vis[MAXN]; inline void init(){ for(int i=0;i<=N+7;++i){ vis[i]=false; Dis[i]=MAXDIS; sumA[i]=0; } Dis[1]=0; }
void solve(){ std::cin>>N; init(); for(int i=1;i<=N;++i){ std::cin>>A[i]; sumA[i]=sumA[i-1]+A[i]; } std::priority_queue<arr,std::vector<arr>, cmp> pq; for(int i=1;i<=N;++i){ std::cin>>B[i]; } pq.push({1,0}); while(!pq.empty()){ ll s=pq.top()[0],dis=pq.top()[1]; pq.pop(); if(vis[s]) continue; vis[s]=true; Dis[s]=dis; pq.push({B[s],Dis[s]+A[s]}); if(s>1) pq.push({s-1,Dis[s]}); } ll ans=0; for(int i=1;i<=N;++i){ ans=std::max(ans,sumA[i]-Dis[i]); } std::cout<<ans<<"\n"; return; }
int main() { std::ios::sync_with_stdio(false); std::cin.tie(0);std::cout.tie(0); std::cin>>T; while (T--) { solve(); } return 0; }
|
心路历程(WA,TLE,MLE……)
这种一定要加一个限制,避免出现负数,0之类的不存在点进入的情况
1 2 3
| if(s>1) pq.push({s-1,Dis[s]});
|
https://codeforces.com/contest/2024/submission/300344292
这个MAXDIS设太小了,这种设大一点比较好
1
| const ll MAXN=static_cast<ll>(4e5)+10,MAXDIS=1e17+7;
|