日常刷题2025-2-22
1.日常刷题2025-3-162.日常训练2025-1-23.日常训练2025-1-34.日常训练2025-1-55.日常训练2025-1-86.日常训练2025-1-117.日常训练2025-1-128.日常训练2025-1-139.日常训练2025-1-1410.日常训练2025-1-1511.日常训练2025-1-1612.日常训练2025-1-1713.日常训练2025-1-1814.日常训练2025-1-1915.日常训练2025-1-2116.日常训练2025-1-2217.日常刷题2025-1-2318.日常训练2025-1-2419.日常刷题2025-1-2520.日常刷题21.日常刷题2025-2-622.日常刷题2025-2-923.日常刷题2025-2-1424.日常刷题2025-2-1525.日常刷题2025-2-1726.日常刷题2025-2-2027.日常刷题2025-2-21
28.日常刷题2025-2-22
29.日常刷题2025-2-2430.日常刷题2025-2-2631.日常刷题2025-2-2732.日常刷题2025-2-2833.日常刷题2025-3-134.日常刷题2025-3-235.日常刷题2025-3-336.日常刷题2025-3-537.日常刷题2025-3-638.日常刷题2025-3-739.日常刷题2025-3-840.日常刷题2025-3-941.日常刷题2025-3-1042.日常刷题2023-3-1143.日常刷题2025-3-1344.非常棒的二分和DP日常刷题2025-2-22
江
思路:分类谈论
只有两种情况,都考虑一下就行
代码
#include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; void solve(){ int n; cin>>n; vector<int> a(n + 2),b(n + 2); for(int i = 1;i<=n;i++) cin>>a[i]; for(int i = 1;i<=n;i++) cin>>b[i]; vector<int> p1(n + 2),p2(n + 2),pgx(n + 2,-1e18),sgx(n + 2,-1e18),pmax(n + 2,-1e18),smax(n + 2,-1e18); for(int i = 1;i<=n;i++){ pmax[i] = max(pmax[i-1],b[i]); // 交换分界点上,和左侧时会用到 p1[i] = p1[i-1] + a[i]; pgx[i] = b[i] - a[i]; // 交换分界点左右时会用到 pgx[i] = max(pgx[i],pgx[i-1]); } for(int i = n;i;i--){ smax[i] = max(smax[i+1],a[i]); // 交换分界点上,和右侧时会用到 p2[i] = p2[i+1] + b[i]; sgx[i] = a[i] - b[i]; // 交换分界点左右时会用到 sgx[i] = max(sgx[i],sgx[i+1]); } int ans = -1e18; // for(int i = 1;i<=n;i++) cout<<pgx[i]<<" "; cout<<endl; for(int i = 1;i<=n;i++){ ans = max(ans,p1[i]+p2[i]); if(i>=2&&i<=n-1) ans = max(ans,p1[i]+p2[i]+pgx[i-1]+sgx[i+1]); // cout<<p1[i]+p2[i]+pgx[i-1]+sgx[i+1]<<endl; if(i!=n)ans = max(ans,p1[i]+p2[i]-a[i]+smax[i+1]); if(i!=1)ans = max(ans,p1[i]+p2[i]-b[i]+pmax[i-1]); } cout<<ans<<endl; } signed main(){ int T; cin>>T; while(T--) solve(); return 0; }
花
思路:数学思维题
第一:此题是计数题,需要考虑在不同长度下,ai 和 aj 的贡献会是多少
第二:在想到第一点还不足以做这道题,因为暴力枚举每个数的组合会超时,所以要考虑枚举优化。此题中的公式在长度相同时是有结合性的,一个一个计算和一次计算一堆是一样的。
代码
#include <bits/stdc++.h> typedef std::pair<long long, long long> pll; typedef std::pair<int, int> pii; #define INF 0x3f3f3f3f #define mod 998244353 using i64 = long long; const int N = 1e5+5; void solve(){ int n; std::cin >> n; std::vector<i64> a(n+1); for (int i = 1; i <= n; i++){ std::cin >> a[i]; } std::vector <i64> x(n + 1); std::vector <i64> y(n + 1); std::vector<i64> dpx(n+1), dpy(n+1); dpx[1] = 1, dpx[2] = 0; dpy[1] = 0, dpy[2] = 1; for (int i = 3; i <= n; i++){ dpx[i] = dpx[i-1] + dpx[i-2]; dpx[i] %= mod; dpy[i] = dpy[i-1] + dpy[i-2]; dpy[i] %= mod; } for (int i = 1; i <= n; i++) { x[n - i + 1] += a[i]; x[n-i+1] %= mod; y[i] += a[i]; y[i] %= mod; } for (int i = n - 1; i >= 1; i--)y[i] += y[i + 1], y[i] %= mod; for (int i = n - 1; i >= 1; i--)x[i] += x[i + 1], x[i] %= mod; i64 ans = 0; ans += x[1]; for (int i = 2; i <= n; i++){ ans += (x[i]*dpx[i]) % mod + (y[i]*dpy[i]) % mod; ans %= mod; } std::cout << ans << '\n'; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2); int t = 1, i; std::cin >> t; for (i = 0; i < t; i++){ solve(); } return 0; }
本文作者:califeee
本文链接:https://www.cnblogs.com/califeee/p/18731541
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步