Problem p03716 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

using namespace std;

#define INF 100000000
#define YJ 1145141919
#define INF_INT_MAX 2147483647
#define INF_LL_MAX 9223372036854775807
#define EPS 1e-10
#define Pi acos(-1)
#define LL long long
#define ULL unsigned long long
#define LD long double

using namespace std;

#define MAX_N 300005

int N;

LL A[MAX_N];

int main() {
  cin >> N;
  for (int i = 0; i < 3 * N; i++) {
    cin >> A[i];
  }

  LL ans = 0;

  LL L = 0, R = 0;
  priority_queue<LL> RQue;                           // 使っているもの
  priority_queue<LL, vector<LL>, greater<LL>> RGQue; // 使っていないもの

  map<LL, int> RMap; // 右側の値で使っているもののマップ
  map<LL, int> RGMap;

  priority_queue<LL, vector<LL>, greater<LL>> LQue;

  for (int i = 0; i < N; i++) {
    L += A[i];
    LQue.push(A[i]);
  }
  for (int i = N; i < 3 * N; i++) {
    R += A[i];
    RQue.push(A[i]);
    RMap[A[i]]++;
  }

  while (RQue.size() > N) {
    R -= RQue.top();
    RMap[RQue.top()]--;
    RGQue.push(RQue.top());
    RQue.pop();
  }

  ans = L - R;

  for (int i = N; i < 2 * N; i++) {

    // 左側更新
    LL LMin = LQue.top();
    if (LMin < A[i]) {
      L -= LMin;
      L += A[i];
      LQue.pop();
      LQue.push(A[i]);
    }

    // 右側更新
    if (RMap[A[i]] != 0) {
      RMap[A[i]]--;
      R -= A[i];

      // 使っていないものから一番小さいものを取得
      LL tmpR = 1145141919810;
      while (true) {
        tmpR = RGQue.top();
        RGQue.pop();
        if (RGMap[tmpR] == 0) {
          break;
        }
        RGMap[tmpR]--;
      }

      R += tmpR;
      RQue.push(tmpR);

      RMap[tmpR]++;
    } else {
      RGMap[A[i]]--;
    }

    ans = max(ans, L - R);
  }

  cout << ans << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

#define INF 100000000
#define YJ 1145141919
#define INF_INT_MAX 2147483647
#define INF_LL_MAX 9223372036854775807
#define EPS 1e-10
#define Pi acos(-1)
#define LL long long
#define ULL unsigned long long
#define LD long double

using namespace std;

#define MAX_N 300005

int N;

LL A[MAX_N];

int main() {
  cin >> N;
  for (int i = 0; i < 3 * N; i++) {
    cin >> A[i];
  }

  LL ans = 0;

  LL L = 0, R = 0;
  priority_queue<LL> RQue;                           // 使っているもの
  priority_queue<LL, vector<LL>, greater<LL>> RGQue; // 使っていないもの

  map<LL, int> RMap; // 右側の値で使っているもののマップ
  map<LL, int> RGMap;

  priority_queue<LL, vector<LL>, greater<LL>> LQue;

  for (int i = 0; i < N; i++) {
    L += A[i];
    LQue.push(A[i]);
  }
  for (int i = N; i < 3 * N; i++) {
    R += A[i];
    RQue.push(A[i]);
    RMap[A[i]]++;
  }

  while (RQue.size() > N) {
    R -= RQue.top();
    RMap[RQue.top()]--;
    RGQue.push(RQue.top());
    RQue.pop();
  }

  ans = L - R;

  for (int i = N; i < 2 * N; i++) {

    // 左側更新
    LL LMin = LQue.top();
    if (LMin < A[i]) {
      L -= LMin;
      L += A[i];
      LQue.pop();
      LQue.push(A[i]);
    }

    // 右側更新
    if (RMap[A[i]] != 0) {
      RMap[A[i]]--;
      R -= A[i];

      // 使っていないものから一番小さいものを取得
      LL tmpR = 1145141919810;
      while (true) {
        tmpR = RGQue.top();
        RGQue.pop();
        if (RGMap[tmpR] == 0) {
          break;
        }
        RGMap[tmpR]--;
      }

      R += tmpR;
      RQue.push(tmpR);

      RMap[tmpR]++;
    } else {
      RGMap[A[i]]++;
    }

    ans = max(ans, L - R);
  }

  cout << ans << endl;

  return 0;
}