B 题求助 求告知这个思路哪里错了 求纠正 求hack数据

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <math.h>
#include <map>
#include <set> 
#include <queue>
#define int  long long

using namespace std;

typedef pair<int, int> PII;

const int N = 1e6 + 10, mod = 998244353;

int n, m;
int a[N], b[N];
int as[N], bs[N];
int bgw[N], edw[N];
int sumA[N], sumB[N];

void solve() 
{
   cin >> n;
   for(int i = 1; i <= n; i++) cin >> a[i], as[i] = as[i - 1] + a[i];
   for(int i = 1; i <= n; i++) cin >> b[i], bs[i] = bs[i - 1] + b[i];
   
   int bgmx = -1, bgid = -1;
   int mxsumA = -1, mxsumid = - 1;
   for(int i = 1; i <= n; i++)
   {
       if(i == 1) bgmx = b[i] - a[i], bgid = i, mxsumA = a[i] + b[i], mxsumid = i;
       if(b[i] - a[i] > bgmx) bgmx = b[i] - a[i], bgid = i;
       if(a[i] + b[i] > mxsumA) mxsumA = a[i] + b[i], mxsumid = i;
       bgw[i] = bgid;
       sumA[i] = mxsumid;
   }
   
   int edmx = -1, edid = -1;
   int mxsumB = -1, mxsumBid = - 1;
   for(int i = n; i >= 1; i --)
   {
       if(i == n) edmx = a[i] - b[i], edid = i, mxsumB = a[i] + b[i], mxsumBid = i;
       if(a[i] - b[i] > edmx) edmx = a[i] - b[i], edid = i;
       if(a[i] + b[i] > mxsumB) mxsumB = a[i] + b[i], mxsumBid = i;
       edw[i] = edid;
       sumB[i] = mxsumBid;
   }
   edw[n + 1] = 0; // 判断用
   sumB[n + 1] = 0;
   
   int ans = -1e18;
   
   for(int j = 1; j <= n; j++)
   {
       ans = max(ans, as[j] + bs[n] - bs[j - 1]); // 不交换
       if(j != 1 && j != n) // 选择两侧价值最高的交换
       {
            int t = as[j] + bs[n] - bs[j - 1];
            t = t - a[bgw[j - 1]] + b[bgw[j - 1]];
            t = t - b[edw[j + 1]] + a[edw[j + 1]];
            ans = max(ans, t);
       }
       int h = a[j], k = b[j];
       if(j != 1)
       {
           int id = sumA[j - 1];
           int t = as[j] + b[id] + bs[n] - bs[j];
           ans = max(ans, t);
       }
       if(j != n)
       {
           int id = sumB[j + 1];
           int t = as[j - 1] + a[id] + (bs[n] - bs[j - 1]);
           ans = max(ans, t);
       }
   }
   cout << ans << endl;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int T = 1;
    cin >> T;
    while (T--) 
    {
        solve();
    }
    return 0;
}

全部评论
1 7 7 4 4 -1 10 10 -2 1 3 1 -9 -5 -6 -3 答案 35
1 回复 分享
发布于 2025-02-21 21:49 浙江

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务