QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#339339#7904. Rainbow SubarrayJokerNVTWA 46ms6568kbC++202.0kb2024-02-27 07:38:092024-02-27 07:38:10

Judging History

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

  • [2024-06-09 00:00:26]
  • hack成功,自动添加数据
  • (/hack/652)
  • [2024-02-27 07:38:10]
  • 评测
  • 测评结果:WA
  • 用时:46ms
  • 内存:6568kb
  • [2024-02-27 07:38:09]
  • 提交

answer

#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <cstdlib>
#include <set>
#define sqr(x) (x) * (x)
using namespace std;

const int MAX_SIZE = int(1e5+5);
const long long MOD = int(1e9+7);
const double EPS = 1e-9;

int T, n;
long long k;


int findLongestRainbowSubarray(vector<int> &a, vector<long long> &psum, vector<long double> &psumSqr, long long k) {
    int ans = 1;
    int l = 1, r = n;
    while (l <= r) {
        int len = (l+r) >> 1;
        int index = len;
        long double criteria = (long double)1e35;
        for (int i=len; i<=n; i++) {
            long long sum = psum[i] - psum[i-len];
            long long avg = sum / len;
            long double f = (psumSqr[i] - psumSqr[i-len]) / len - sqr(avg);
            if (f + EPS <= criteria) {
                criteria = f;
                index = i;
            }
        }
        long long sum = psum[index] - psum[index-len];
        vector<long long> f(2, 0);
        long long avg = sum / len;
        for (int j=0; j<len; j++) {
            f[0] += abs(a[index-len+j+1] - (avg + j - len / 2));
            f[1] += abs(a[index-len+j+1] - (avg + j - len / 2 + 1));
        }
        long long need = min(f[0], f[1]);
        if (need <= k) {
            ans = max(ans, len);
            l = len+1;
        }
        else r = len-1;
    }
    return ans;
}


void solve() {
    cin >> T;
    while (T--) {
        cin >> n >> k;
        vector<int> a(n+1);
        vector<long long> psum(n+1, 0);
        vector<long double> psumSqr(n+1, 0);
        for (int i=1; i<=n; i++) {
            cin >> a[i];
            psum[i] = psum[i-1] + a[i];
            psumSqr[i] = psumSqr[i-1] + sqr(a[i]);
        }
        cout << findLongestRainbowSubarray(a, psum, psumSqr, k) << endl;
    }
}


int main() {
    // freopen("inp.txt", "r", stdin);

    //Boost C++ IO speed
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    solve();    
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3784kb

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: 46ms
memory: 6568kb

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
3
1
2
6
4
7
2
2
1
4
1
1
2
2
1
6
7
7
7
1
6
5
1
1
3
1
4
6
5
3
4
3
9
3
8
6
6
2
1
5
3
1
1
1
6
2
5
4
1
3
7
1
5
2
5
4
5
1
4
5
3
1
6
3
4
3
2
2
4
1
3
10
1
3
3
1
1
1
1
6
5
3
4
6
5
3
6
2
5
5
8
3
3
5
2
1
5
2
2
3
3
7
1
2
1
2
2
6
3
1
6
8
1
8
4
5
5
6
6
1
8
3
2
5
4
5
3
2
6
2
3
1
5
3
5
2
1
2
1
2
1
4
2
8
3
6
3
3
2...

result:

wrong answer 2nd lines differ - expected: '4', found: '3'