AtCoder Beginner Contest 379
Rated: \(770\)
-
A - Cyclic
簡單模擬。
-
B - Strawberries
字串模擬,
substr
函式秒了 -
C - Repeating
中等模擬。
思路:判斷是否合法很簡單,重點在計算花費。
假設我們是 \(0\) 號點有 \(N\) 個棋子,然後移動到每個點上,顯然花費為 \(\frac{N(N+1)}{2}\)
但是現在棋子不在 \(0\) 好點上,如果有一個 \(A_i\) 這個地方有 \(B_i\) 個棋子,那麼就會省去 \(A_i \times B_i\) 的花費。
接下來排序,簡單模擬即可。 -
D - Home Garden
priority_queue + lazy_tag
-
E - Sum of All Substrings
拆貢獻法,第 \(i\) 個數的數為 \(a_i\),那麼它左邊選擇的值會增加 \(i\) 種情況,而右邊對答案產生 \(10^0+10^1+10^2+\cdots+10^{n-i}\) 的貢獻,
第 \(i\) 位的總花費就是 \(\sum_{j=1}^{N-i}i\times 10^j \times a_i\) 相當於給高精度的數 \(0 \sim N-i\) 位加上 \(i\times a_i\)
差分處理,再處理一下進位即可點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int n;
long long ans[300001],c[200001];
char s[200001];
bool st;
int main(){
scanf("%d%s",&n,s + 1);
for(int i = 1;i <= n;i ++){
c[i] = i * (s[i] - '0');
}
for(int i = n;i;i --){
ans[i] = ans[i + 1] + c[n - i + 1];//差分
}
for(int i = 1;i < 300000;i ++){//進位
ans[i + 1] += ans[i] / 10;
ans[i] = ans[i] % 10;
}
for(int i = 300000;i;i --){
if(ans[i]){//去除前導零
st = true;
}
if(st){
printf("%lld",ans[i]);
}
}
return 0;
}
```
-
F - Buildings 2
-
G - Everlasting LIDS
官方題解