思路:直接從根開始dfs dfs額外維護兩個引數,乙個是上次的最後乙個數,乙個是除了上次的數的和
這樣是為了再做乘法和除法的時候 能用上一次的最後乙個數來做, 記得+2次mod 因為lst和now加起來的可能小於-(1e9+7)
1 #include2view codeusing
namespace
std;
3const
int maxn=1e5+10;4
const
int mod=1e9+7;5
#define ll long long
6#define ull unsigned long long
7#define pi pair8
#define fi first
9#define sc second
10#define pb push_back
11 vectore[maxn];
12ll val[maxn];
13char
s[maxn];
14ll ans[maxn];
1516
ll power(ll b,ll n)
1725
return
r;26}27
2829
void dfs(int
u,ll lst,ll now)
3038
else
if(s[v]=='/'
)3943else
if(s[v]=='+'
)4448else
4953
}54 ans[u]=(lst+now+mod+mod)%mod;55}
5657
58int
main()
5971
for(int i=2;i<=n;i++) cin>>s[i];
72 dfs(1,0,val[1
]);73
for(int i=1;i<=n;i++)
7478
7980
8182
83 }
NC218421 吳楚月的表示式(dfs)
樸素的做法是把全部的存起來,之後用正常的表示式計算做 據說這種方法容易mle 新的方法是,我們把這個式子當作兩個式子相加,因為他沒有括號,所以每次的優先順序都是相同的 因此我們根據四種情況分類討論即可 includeusing namespace std typedef long long ll t...
牛客 最小表示式
題目連線 題解 比賽的時候把題看錯了,以為只改變 的位置,補題時候,參考 發現數字的順序也可以改變,有點難受,如果是這樣的話,那其實挺好想的,按加號分一下塊,把數字排乙個序,從小到大一遍一遍的往塊裡加,直到加完,然後用大數加法,把他們相加就好了 不知道為甚一直發生段錯誤的 include h usi...
表示式求值(牛客)
題目描述 給定乙個字串描述的算術表示式,計算出結果值。輸入字串長度不超過100,合法的字元包括 0 9 字串內容的合法性及表示式語法的合法性由做題者檢查。本題目只涉及整型計算。輸入描述 輸入算術表示式 中綴表示式 400 5輸出描述 計算出結果值 405做題思路 將輸入的中綴表示式,轉換為對應的字尾...