QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#727944#5983. Pretty Good Proportionlondono27 ✓6383ms68820kbC++142.4kb2024-11-09 14:13:482024-11-09 14:13:48

Judging History

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

  • [2024-11-09 14:13:48]
  • 评测
  • 测评结果:27
  • 用时:6383ms
  • 内存:68820kb
  • [2024-11-09 14:13:48]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long

#define dec double

using namespace std;
const int MAXN = (int)5e5+5;
const dec eps = 1e-7;

int n; char a[MAXN]; dec p, pp;

int pre[MAXN];
dec calc(int l, int r) { return (dec)(pre[r]-pre[l-1])/(r-l+1); }

int l, r; dec now;
void upd(int nl, int nr) {
    dec tmp = calc(nl, nr);
    if (fabs(tmp-pp)<fabs(now-pp) || (fabs(tmp-pp)<fabs(now-pp)+eps&&nl<l)) {
        now=tmp;
        l = nl, r = nr;
    }
}

#define pdi pair<dec,int>

#define mk make_pair

set<pdi> s; map<dec,bool> vis, _;

int main() {
    // g++ code.cpp -o code.exe -std=c++14 -O2 -fno-ms-extensions "-Wl,--stack=1000000000" -DLOCAL; ./code
    time_t stm = clock();

    #ifdef LOCAL
    freopen("data.in", "r", stdin);
    freopen("ans.out", "w", stdout);
    #else
    // freopen("tii.in", "r", stdin);
    // freopen("tii.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    #endif

    int Case = 0;
    int T; cin >> T; while (T--) {
        cin >> n >> p >> (a+1);
        if (p > 1.0-eps || (p < 0.5 && p > eps)) {
            p = 1.0-p;
            for (int i = 1; i <= n; i++) {
                a[i] = '0' + ((a[i]-'0')^1);
            }
        }
        pp = p;
        p /= (p-1.0);

        for (int i = 1; i <= n; i++) {
            pre[i]=pre[i-1]+(a[i]=='1');
        }

        now = 2;
        s.clear(); vis = _;
        
        dec pre = 0;
        s.insert(mk(0, 1)); vis[0] = 1;
        for (int i = 1; i <= n; i++) {
            pre += (a[i]=='0'?p:1);

            // printf("->>>>>>>>>>>%d %.2lf\n", i, pre);
            
            auto it = s.upper_bound(mk(pre, i+1));
            // if (it != s.end()) printf("[%d] !%d\n", i, (*it).second);
            if (it != s.end()) upd((*it).second, i); //, puts("A");
            if (it != s.begin()) --it, upd((*it).second, i); //, puts("B");
            // if (it != s.end()) printf("[%d] ?%d\n", i, (*it).second);
            if (!vis[pre]) vis[pre] = 1, s.insert(mk(pre,i+1));

            // printf("LINE %d: \n", i);
            // for (auto it = s.begin(); it != s.end(); it++) {
                // printf("[%.2lf,%d]", (*it).first, (*it).second);
            // } puts("");
        }

        cout << "Case #" << (++Case) << ": " << (l-1) << '\n';
    }

    cerr << "Exec Time: " << (double)(clock()-stm)/CLOCKS_PER_SEC << "s" << endl;
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 5
Accepted

Test #1:

score: 5
Accepted
time: 7ms
memory: 4076kb

input:

100
10 0.827672
0010101011
4 0.932623
0100
1000 0.834002
011001110010111110000110101100010010100101101110110111100010101101111100110001011000110100010100011011000001100001010110111101111010110110000110011000111000011110101100100111111001111011011100111001011101010100111011100011110011100011110010001...

output:

Case #1: 6
Case #2: 1
Case #3: 10
Case #4: 0
Case #5: 0
Case #6: 1
Case #7: 0
Case #8: 0
Case #9: 0
Case #10: 0
Case #11: 0
Case #12: 4
Case #13: 5
Case #14: 564
Case #15: 0
Case #16: 0
Case #17: 0
Case #18: 0
Case #19: 0
Case #20: 0
Case #21: 0
Case #22: 0
Case #23: 0
Case #24: 844
Case #25: 0
Case...

result:

ok 100 lines

Subtask #2:

score: 22
Accepted

Test #2:

score: 22
Accepted
time: 6383ms
memory: 68820kb

input:

100
15 0.333333
000000000011000
10 0.418754
0101100001
2 0.499999
01
3 0.977951
001
2 0.249999
01
10 0.670229
0111011001
1000 0.500001
001101111110110010110000010010110001110010001101110111010011000010100011011101010110011011011010111110011100011000001000101011100011010100101101111110100101011010111...

output:

Case #1: 6
Case #2: 0
Case #3: 0
Case #4: 2
Case #5: 0
Case #6: 0
Case #7: 0
Case #8: 0
Case #9: 0
Case #10: 0
Case #11: 0
Case #12: 0
Case #13: 0
Case #14: 0
Case #15: 0
Case #16: 4333
Case #17: 0
Case #18: 0
Case #19: 123
Case #20: 0
Case #21: 0
Case #22: 0
Case #23: 0
Case #24: 0
Case #25: 0
Case...

result:

ok 100 lines

Extra Test:

score: 0
Extra Test Passed