Submission #68824203


Source Code Expand

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 1.5e6 + 5, kMaxS = 2e5 + 5;

LL a[kMaxN], f[kMaxN], w[kMaxN << 2], tag[kMaxN << 2], n, s;
vector<int> pos[kMaxS];

void Init() {
  for (int i = 1; i <= n; i++) {
    pos[a[i]].push_back(i);
  }
}

LL Nxt(LL x, int y) {
  int p = x % n;
  if (p >= *pos[y].rbegin()) {
    return x / n * n + pos[y][0] + n;
  } else {
    int l = 0, r = pos[y].size() - 1;
    for (int mid; l < r; p < pos[y][mid] ? r = mid : l = mid + 1) {
      mid = l + r >> 1;
    }
    return x / n * n + pos[y][r];
  }
}

LL Pre(LL x, int y) {
  int p = x % n;
  if (p < *pos[y].begin()) {
    return x / n * n + pos[y][pos[y].size() - 1] - n;
  } else {
    int l = 0, r = pos[y].size() - 1;
    for (int mid; l < r; p >= pos[y][mid] ? l = mid : r = mid - 1) {
      mid = l + r + 1 >> 1;
    }
    return x / n * n + pos[y][l];
  }
}

void Add(int u, LL x) {
  w[u] = max(w[u], x), tag[u] = max(tag[u], x);
}

void PushDown(int u) {
  if (tag[u]) {
    Add(u << 1, tag[u]);
    Add(u << 1 | 1, tag[u]);
    tag[u] = 0;
  }
}

void Update(int u, int l, int r, int L, int R, LL x) {
  if (l > R || r < L) {
    return;
  } else if (L <= l && r <= R) {
    Add(u, x);
  } else {
    int mid = l + r >> 1;
    PushDown(u);
    Update(u << 1, l, mid, L, R, x);
    Update(u << 1 | 1, mid + 1, r, L, R, x);
    w[u] = max(w[u << 1], w[u << 1 | 1]);
  }
}

LL Query(int u, int l, int r, int L, int R) {
  if (l > R || r < L) {
    return 0;
  } else if (L <= l && r <= R) {
    return w[u];
  } else {
    int mid = l + r >> 1;
    PushDown(u);
    return max(Query(u << 1, l, mid, L, R), Query(u << 1 | 1, mid + 1, r, L, R));
  }
}

void Solve(int l, int r) {
  if (l == r) {
    return;
  } else {
    int mid = l + r >> 1;
    Solve(l, mid);
    for (int k = 1; k <= r - l; k++) {
      int len = min(r - k, mid);
      int pl = max(mid + 1, (int)(lower_bound(f + l, f + len + 1, Pre(f[len], k)) - f) + k);
      int pr = min(r, mid + k);
      Update(1, 0, s, pl, pr, Nxt(f[len], k));
    }
    for (int i = mid + 1; i <= r; i++) {
      f[i] = Query(1, 0, s, i, i);
    }
    Solve(mid + 1, r);
  }
}

int main() {
  ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> s;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  Init();
  Solve(0, s);
  cout << f[s];
  return 0;
}

Submission Info

Submission Time
Task F - Constant Sum Subsequence
User caoshurui
Language C++ 20 (gcc 12.2)
Score 1000
Code Size 2461 Byte
Status AC
Exec Time 1395 ms
Memory 42564 KiB

Compile Error

Main.cpp: In function ‘LL Nxt(LL, int)’:
Main.cpp:24:15: warning: suggest parentheses around ‘+’ inside ‘>>’ [-Wparentheses]
   24 |       mid = l + r >> 1;
      |             ~~^~~
Main.cpp: In function ‘LL Pre(LL, int)’:
Main.cpp:37:19: warning: suggest parentheses around ‘+’ inside ‘>>’ [-Wparentheses]
   37 |       mid = l + r + 1 >> 1;
      |             ~~~~~~^~~
Main.cpp: In function ‘void Update(int, int, int, int, int, LL)’:
Main.cpp:61:17: warning: suggest parentheses around ‘+’ inside ‘>>’ [-Wparentheses]
   61 |     int mid = l + r >> 1;
      |               ~~^~~
Main.cpp: In function ‘LL Query(int, int, int, int, int)’:
Main.cpp:75:17: warning: suggest parentheses around ‘+’ inside ‘>>’ [-Wparentheses]
   75 |     int mid = l + r >> 1;
      |               ~~^~~
Main.cpp: In function ‘void Solve(int, int)’:
Main.cpp:85:17: warning: suggest parentheses around ‘+’ inside ‘>>’ [-Wparentheses]
   85 |     int mid = l + r >> 1;
      |               ~~^~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1000 / 1000
Status
AC × 3
AC × 49
Set Name Test Cases
Sample 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt
All 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 01-test-001.txt, 01-test-002.txt, 01-test-003.txt, 01-test-004.txt, 01-test-005.txt, 01-test-006.txt, 01-test-007.txt, 01-test-008.txt, 01-test-009.txt, 01-test-010.txt, 01-test-011.txt, 01-test-012.txt, 01-test-013.txt, 01-test-014.txt, 01-test-015.txt, 01-test-016.txt, 01-test-017.txt, 01-test-018.txt, 01-test-019.txt, 02-test-001.txt, 02-test-002.txt, 02-test-003.txt, 02-test-004.txt, 02-test-005.txt, 02-test-006.txt, 02-test-007.txt, 02-test-008.txt, 02-test-009.txt, 02-test-010.txt, 02-test-011.txt, 02-test-012.txt, 03-test-001.txt, 03-test-002.txt, 03-test-003.txt, 03-test-004.txt, 03-test-005.txt, 03-test-006.txt, 03-test-007.txt, 03-test-008.txt, 03-test-009.txt, 03-test-010.txt, 03-test-011.txt, 03-test-012.txt, 04-test-001.txt, 04-test-002.txt, 04-test-003.txt
Case Name Status Exec Time Memory
00-sample-001.txt AC 2 ms 3396 KiB
00-sample-002.txt AC 2 ms 3452 KiB
00-sample-003.txt AC 2 ms 3532 KiB
01-test-001.txt AC 1131 ms 41592 KiB
01-test-002.txt AC 1150 ms 42304 KiB
01-test-003.txt AC 1103 ms 41428 KiB
01-test-004.txt AC 1052 ms 41416 KiB
01-test-005.txt AC 1049 ms 41348 KiB
01-test-006.txt AC 1042 ms 41272 KiB
01-test-007.txt AC 1219 ms 41088 KiB
01-test-008.txt AC 1137 ms 41424 KiB
01-test-009.txt AC 1223 ms 41764 KiB
01-test-010.txt AC 1247 ms 41700 KiB
01-test-011.txt AC 1218 ms 41612 KiB
01-test-012.txt AC 1238 ms 41280 KiB
01-test-013.txt AC 661 ms 31076 KiB
01-test-014.txt AC 662 ms 31884 KiB
01-test-015.txt AC 645 ms 29792 KiB
01-test-016.txt AC 1163 ms 41444 KiB
01-test-017.txt AC 1189 ms 42356 KiB
01-test-018.txt AC 1251 ms 41948 KiB
01-test-019.txt AC 1214 ms 42308 KiB
02-test-001.txt AC 1098 ms 41296 KiB
02-test-002.txt AC 1105 ms 41164 KiB
02-test-003.txt AC 1167 ms 41428 KiB
02-test-004.txt AC 1150 ms 41428 KiB
02-test-005.txt AC 1251 ms 41320 KiB
02-test-006.txt AC 1273 ms 41376 KiB
02-test-007.txt AC 1352 ms 41232 KiB
02-test-008.txt AC 1321 ms 41260 KiB
02-test-009.txt AC 1393 ms 40996 KiB
02-test-010.txt AC 1395 ms 40792 KiB
02-test-011.txt AC 1178 ms 41360 KiB
02-test-012.txt AC 1154 ms 41316 KiB
03-test-001.txt AC 1107 ms 42312 KiB
03-test-002.txt AC 1089 ms 42320 KiB
03-test-003.txt AC 1125 ms 42428 KiB
03-test-004.txt AC 1119 ms 42484 KiB
03-test-005.txt AC 1191 ms 42516 KiB
03-test-006.txt AC 1207 ms 42528 KiB
03-test-007.txt AC 1250 ms 42452 KiB
03-test-008.txt AC 1294 ms 42520 KiB
03-test-009.txt AC 1281 ms 41288 KiB
03-test-010.txt AC 1349 ms 41388 KiB
03-test-011.txt AC 1133 ms 42564 KiB
03-test-012.txt AC 1134 ms 42336 KiB
04-test-001.txt AC 2 ms 3536 KiB
04-test-002.txt AC 2 ms 3412 KiB
04-test-003.txt AC 985 ms 41532 KiB