新賽道-2024年CSP-J/S 十一連測(四)-T1

谦谦2022發表於2024-09-01

題目描述

王老師腦袋一拍,定義了乘加運算!

他定義 abc=(a+b)×c 。

而且他覺得用括號來規定運算的先後順序太麻煩了,他給乘加運算定義了一個權值的係數(為乘加運算的下標),權值大的乘加運算先進行。

例如下面的表示式:

=====9 34 9 12 1 23 6 41 29 34 9 12 1 23 (6+1)×2 因為41權值最大(4),所以先運算(9+4)×9 12 1 23 14117 12 (1+3)×14(117+2)×566664

現在王老師 給你一個只含有乘加運算的表示式,希望你能幫他求出最後的值。

資料範圍

對於 100% 的資料,保證:1n105,0ai,ci109,109bi109。

測試點編號資料範圍特殊性質
13 n100
48 n1000
9 無限制 ai=0
1014 無限制 bi=0
1520 無限制

根據題目可知,我們需要使用一種能夠快速插入刪除元素的容器,所以不難想到用連結串列解決,其次資料量非常大,需要開long long

程式碼:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,pr[100005],ne[100005],id[100005],a[100005];
struct no{
int x,y;
}b[100005];
bool tmp(int x,int y){
return b[x].y>b[y].y;
}
signed main(){
freopen("mulsum.in","r",stdin);
freopen("mulsum.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)cin>>b[i].x;
for(int i=1;i<n;i++)cin>>b[i].y,id[i]=i,pr[i]=i-1,ne[i]=i+1;
sort(id+1,id+n+1,tmp);
for(int i=1;i<n;i++){
int x=id[i];
a[ne[x]]=(a[x]+b[x].x)*a[ne[x]];
pr[ne[x]]=pr[x],ne[pr[x]]=ne[x];
}
cout<<a[n];
return 0;
}
總結:在賽場上我其實想到了連結串列做法,可不會實現,連結串列的基礎操作應該更加熟練。

相關文章