欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

AtCoder AGC030B Tree Burning

发布时间:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 AtCoder AGC030B Tree Burning 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目链接

https://atcoder.jp/contests/agc030/tasks/agc030_b

题解

细节好题。。
首先假设第一步往右走,那么可以发现当拐弯的次数一定时路径是唯一的
于是可以枚举这个值
然后很烦的是枚举之后要分奇偶讨论。。
最后再翻过来做一遍处理第一步往左走就行了
时间复杂度\(O(n)\)

代码

#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #define llong long long using namespace std;void read(int &x) {int f=1;x=0;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}x*=f; }const int N = 2e5; llong a[N+3]; llong s[N+3]; int n; llong m,ans;void solve() {s[0] = 0ll; for(int i=1; i<=n; i++) s[i] = s[i-1]+a[i];for(int i=1; i<=n; i++){llong tmp;if(i&1){int x = (i-1)>>1;tmp = (m*x-(s[n]-s[n-x]))*2+a[n-x]+(s[n-x-1]-s[n-x-x-1])*2;}else{int x = i>>1;tmp = (m*(x-1)-(s[n]-s[n-x+1]))*2+(m-a[n-x+1])+(s[n-x]-s[n-x-x])*2;}ans = max(ans,tmp);} }int main() {scanf("%lld%d",&m,&n);for(int i=1; i<=n; i++) scanf("%lld",&a[i]);solve();for(int i=1; i<=n; i++) a[i] = m-a[i];reverse(a+1,a+n+1);solve();printf("%lld\n",ans);return 0; }

总结

以上是生活随笔为你收集整理的AtCoder AGC030B Tree Burning的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。