QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#628537#7904. Rainbow SubarrayadivseWA 210ms8568kbC++202.3kb2024-10-10 20:50:522024-10-10 20:50:53

Judging History

你现在查看的是最新测评结果

  • [2024-10-10 20:50:53]
  • 评测
  • 测评结果:WA
  • 用时:210ms
  • 内存:8568kb
  • [2024-10-10 20:50:52]
  • 提交

answer

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <map>
#define endl '\n'
#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define rep2(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
template<typename... Args>
void bubu(Args... args) { cout << ":: "; ((cout << args << " "), ...); cout << endl; }
void bubu(vector<int> tem) { for (auto x : tem) cout << x << ' '; cout << endl; }
void kuaidu() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); }
inline int max(int a, int b) { if (a < b) return b; return a; }
inline int min(int a, int b) { if (a < b) return a; return b; }
using PII = pair<int, int>;
using i128 = __int128;

//=======================================================================
const int N = 5e5 + 10;
const int M = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e16;
int n, m, T;
int A[N];
multiset<int> s2;
multiset<int, greater<int>> s1;
int mid, sum1, sum2, len1, len2;
//=======================================================================

void play() {

	while (len1 < len2) {
		int x = *s2.begin();
		s1.insert(mid); len1++; sum1 += mid;
		mid = x;
		s2.erase(s2.begin()); len2--; sum2 -= x;
	}
	while (len1 > len2) {
		int x = *s1.rbegin();
		s2.insert(mid); len2++; sum2 += mid;
		mid = x;
		s1.erase(s1.begin()); len1--; sum1 -= x;
	}

}

signed main() {
	// kuaidu();
	cin >> T;
	while (T--) {
		s1.clear(); s2.clear();
		len1 = 0, len2 = 0, sum1 = 0, sum2 = 0;
		cin >> n;
		int k; cin >> k;
		rep(i, 1, n) cin >> A[i], A[i] -= i;
		int l = 1, r = 1;
		mid = A[1];
		int ans = 1;
		while (l <= r and r <= n) {
			while (r <= n) {
				if (-sum1 + len1 * mid + sum2 - len2 * mid > k) break;
				r++; if (r > n) break;
				if (A[r] < mid) { s1.insert(A[r]), sum1 += A[r], len1++; }
				else s2.insert(A[r]), sum2 += A[r], len2++;
				play();
			}
			ans = max(ans, r - l);
			if (r > n) break;
			play();
			if (s1.count(A[l])) s1.erase(s1.find(A[l])), sum1 -= A[l], len1 -= 1;
			else if (s2.count(A[l])) s2.erase(s2.find(A[l])), sum2 -= A[l], len2 -= 1;
			else { mid = *s2.begin(); s2.erase(s2.begin()); sum2 -= mid; len2 -= 1; }
			l++;
		}
		cout << ans << endl;
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3568kb

input:

5
7 5
7 2 5 5 4 11 7
6 0
100 3 4 5 99 100
5 6
1 1 1 1 1
5 50
100 200 300 400 500
1 100
3

output:

4
3
5
1
1

result:

ok 5 lines

Test #2:

score: -100
Wrong Answer
time: 210ms
memory: 8568kb

input:

11102
2 167959139
336470888 134074578
5 642802746
273386884 79721198 396628655 3722503 471207868
6 202647942
268792718 46761498 443917727 16843338 125908043 191952768
2 717268783
150414369 193319712
6 519096230
356168102 262263554 174936674 407246545 274667941 279198849
9 527268921
421436316 3613460...

output:

1
4
3
2
6
5
7
2
4
1
4
1
1
3
2
2
7
9
7
7
1
9
7
2
4
3
1
6
8
7
3
4
3
9
5
8
6
6
3
1
7
3
1
2
4
6
4
7
4
1
4
6
1
6
3
5
7
6
1
9
5
4
1
7
6
6
3
2
2
6
2
3
10
1
7
4
2
4
5
1
7
5
5
5
8
7
3
6
3
5
6
8
5
7
5
2
1
6
2
3
5
6
9
1
4
1
2
2
9
3
1
6
8
1
8
4
5
7
6
9
5
8
3
2
9
5
5
6
2
6
2
6
1
5
4
6
4
2
4
1
2
1
3
6
7
3
9
3
3
3...

result:

wrong answer 18th lines differ - expected: '8', found: '9'