Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)題解總結

Star_F發表於2024-11-15

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

    官方題解

相關文章