日常刷题2025-2-22

日常刷题2025-2-22

https://ac.nowcoder.com/acm/contest/101963/B

思路:分类谈论

只有两种情况,都考虑一下就行

代码

#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;
}

https://ac.nowcoder.com/acm/contest/101963/C

思路:数学思维题

第一:此题是计数题,需要考虑在不同长度下,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 中国大陆许可协议进行许可。

posted @   califeee  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.