답안 #524133

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
524133 2022-02-08T17:00:15 Z Lobo 말 (IOI15_horses) C++17
100 / 100
1438 ms 73240 KB
#include "horses.h"
#include<bits/stdc++.h>
using namespace std;

const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
#define int long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()

#define maxn 550000

int n, a[maxn], b[maxn], trmx[4*maxn], trp[4*maxn];
map<int,pair<int,int>> lr;
int mod = 1e9 + 7;
dbl logmax, logtot;

void attmx(int no, int l, int r, int pos, int val) {
    if(l > pos || r < pos) return;
    else if(l == r) trmx[no] = val;
    else {
        int f1 = 2*no;
        int f2 = 2*no + 1;
        int mid = (l+r)>>1;

        attmx(f1,l,mid,pos,val);
        attmx(f2,mid+1,r,pos,val);
        trmx[no] = max(trmx[f1],trmx[f2]);
    }
}

int qrmx(int no, int l, int r, int L, int R) {
    if(l > R || r < L) return 0;
    else if(l >= L && r <= R) return trmx[no];
    else {
        int f1 = 2*no;
        int f2 = 2*no + 1;
        int mid = (l+r)>>1;
        return max(qrmx(f1,l,mid,L,R),qrmx(f2,mid+1,r,L,R));
    }
}

void attp(int no, int l, int r, int pos, int val) {
    if(l > pos || r < pos) return;
    else if(l == r) trp[no] = val;
    else {
        int f1 = 2*no;
        int f2 = 2*no + 1;
        int mid = (l+r)>>1;

        attp(f1,l,mid,pos,val);
        attp(f2,mid+1,r,pos,val);
        trp[no] = (trp[f1]*trp[f2])%mod;
    }
}

int qrp(int no, int l, int r, int L, int R) {
    if(l > R || r < L) return 1;
    else if(l >= L && r <= R) return trp[no];
    else {
        int f1 = 2*no;
        int f2 = 2*no + 1;
        int mid = (l+r)>>1;
        return (qrp(f1,l,mid,L,R)*qrp(f2,mid+1,r,L,R))%mod;
    }
}

int qrr() {
    auto it = lr.end(); it--;

    dbl logcur = logtot;
    int ans = 0;
    dbl anslg = -inf;
    while(true) {
        int l = it->fr;
        int r = it->sc.fr;
        int p = it->sc.sc;
        int mx = qrmx(1,0,n-1,l,r);

        dbl anscur = log2(mx) + logcur;
        if(anscur >= anslg) {
            anslg = anscur;
            ans = (qrp(1,0,n-1,0,r)*mx)%mod;
        }

        logcur -= log2(p);
        if(logcur + logmax < logtot || it == lr.begin()) break;
        it--;
    }

    

    return ans;
}

int32_t init(int32_t N, int32_t X[], int32_t Y[]) {
    n = N;
    logtot = 0;
    logmax = 31;
    for(int i = 0; i < n; i++) {
        a[i] = X[i];
        logtot+= log2(a[i]);
        attp(1,0,n-1,i,a[i]);
    }

    for(int i = 0; i < n; i++) {
        b[i] = Y[i];
        attmx(1,0,n-1,i,b[i]);
    }

    for(int i = 0; i < n;) {
        if(a[i] != 1) {
            lr[i] = mp(i,a[i]);
            i++;
        }
        else {
            int ant = i;
            while(i < n && a[i] == 1) {
                i++;
            }
            lr[ant] = mp(i-1,1);
        }
    }

    return qrr();
}

int32_t updateX(int32_t pos, int32_t val) {
    if(val == a[pos]) {
        return qrr();
    }

    attp(1,0,n-1,pos,val);
    logtot-= log2(a[pos]);
    logtot+= log2(val);

    if(a[pos] != 1 && val != 1) {
        a[pos] = val;
        lr[pos] = mp(pos,val);
        return qrr();
    }

    auto it = lr.upper_bound(pos); it--;
    if(val == 1) {
        //quero pegar o cara da direita e da esquerda e juntar com esse
        vector<int> tir;
        int l = pos;
        int r = pos;
        if(it != lr.begin()) {
            it--;
            //tiro ele se for igual a 1
            if(it->sc.sc == 1) {
                l = it->fr;
                tir.pb(it->fr);
            }
            it++;
        }
        it++;
        if(it != lr.end()) {
            if(it->sc.sc == 1) {
                r = it->sc.fr;
                tir.pb(it->fr);
            }
        }
        it--;

        tir.pb(it->fr);

        for(auto x : tir) {
            lr.erase(x);
        }

        lr[l] = mp(r,1);
    }
    else {
        //quero pegar o cara da direita e da esquerda e separar

        int l = it->fr;
        int r = it->sc.fr;
        lr.erase(l);

        if(l != pos) {
            //inserir (l,pos-1)
            lr[l] = mp(pos-1,1);
        }
        lr[pos] = mp(pos,val);
        if(r != pos) {
            lr[pos+1] = mp(r,1);
        }
    }

    a[pos] = val;
    return qrr();

}

int32_t updateY(int32_t pos, int32_t val) {
    b[pos] = val;
    attmx(1,0,n-1,pos,val);
    return qrr();
}

Compilation message

horses.cpp: In function 'int32_t init(int32_t, int32_t*, int32_t*)':
horses.cpp:130:15: warning: conversion from 'long long int' to 'int32_t' {aka 'int'} may change value [-Wconversion]
  130 |     return qrr();
      |            ~~~^~
horses.cpp: In function 'int32_t updateX(int32_t, int32_t)':
horses.cpp:135:19: warning: conversion from 'long long int' to 'int32_t' {aka 'int'} may change value [-Wconversion]
  135 |         return qrr();
      |                ~~~^~
horses.cpp:145:19: warning: conversion from 'long long int' to 'int32_t' {aka 'int'} may change value [-Wconversion]
  145 |         return qrr();
      |                ~~~^~
horses.cpp:198:15: warning: conversion from 'long long int' to 'int32_t' {aka 'int'} may change value [-Wconversion]
  198 |     return qrr();
      |            ~~~^~
horses.cpp: In function 'int32_t updateY(int32_t, int32_t)':
horses.cpp:205:15: warning: conversion from 'long long int' to 'int32_t' {aka 'int'} may change value [-Wconversion]
  205 |     return qrr();
      |            ~~~^~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 308 KB Output is correct
5 Correct 1 ms 304 KB Output is correct
6 Correct 1 ms 296 KB Output is correct
7 Correct 1 ms 204 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 0 ms 300 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
11 Correct 1 ms 332 KB Output is correct
12 Correct 0 ms 304 KB Output is correct
13 Correct 1 ms 204 KB Output is correct
14 Correct 1 ms 332 KB Output is correct
15 Correct 0 ms 204 KB Output is correct
16 Correct 0 ms 204 KB Output is correct
17 Correct 1 ms 288 KB Output is correct
18 Correct 1 ms 332 KB Output is correct
19 Correct 1 ms 332 KB Output is correct
20 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 284 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 300 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
6 Correct 0 ms 296 KB Output is correct
7 Correct 0 ms 296 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 1 ms 304 KB Output is correct
10 Correct 0 ms 332 KB Output is correct
11 Correct 1 ms 332 KB Output is correct
12 Correct 0 ms 204 KB Output is correct
13 Correct 1 ms 204 KB Output is correct
14 Correct 1 ms 304 KB Output is correct
15 Correct 0 ms 332 KB Output is correct
16 Correct 1 ms 300 KB Output is correct
17 Correct 1 ms 304 KB Output is correct
18 Correct 1 ms 332 KB Output is correct
19 Correct 1 ms 332 KB Output is correct
20 Correct 1 ms 312 KB Output is correct
21 Correct 1 ms 204 KB Output is correct
22 Correct 1 ms 204 KB Output is correct
23 Correct 2 ms 308 KB Output is correct
24 Correct 2 ms 292 KB Output is correct
25 Correct 2 ms 444 KB Output is correct
26 Correct 1 ms 460 KB Output is correct
27 Correct 6 ms 316 KB Output is correct
28 Correct 3 ms 460 KB Output is correct
29 Correct 2 ms 332 KB Output is correct
30 Correct 2 ms 440 KB Output is correct
31 Correct 4 ms 332 KB Output is correct
32 Correct 7 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 898 ms 61996 KB Output is correct
2 Correct 561 ms 62020 KB Output is correct
3 Correct 521 ms 62060 KB Output is correct
4 Correct 648 ms 68348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 300 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 0 ms 332 KB Output is correct
8 Correct 0 ms 204 KB Output is correct
9 Correct 1 ms 304 KB Output is correct
10 Correct 0 ms 204 KB Output is correct
11 Correct 1 ms 288 KB Output is correct
12 Correct 0 ms 308 KB Output is correct
13 Correct 1 ms 300 KB Output is correct
14 Correct 0 ms 332 KB Output is correct
15 Correct 1 ms 300 KB Output is correct
16 Correct 1 ms 304 KB Output is correct
17 Correct 0 ms 300 KB Output is correct
18 Correct 1 ms 204 KB Output is correct
19 Correct 1 ms 280 KB Output is correct
20 Correct 1 ms 204 KB Output is correct
21 Correct 1 ms 332 KB Output is correct
22 Correct 1 ms 284 KB Output is correct
23 Correct 2 ms 332 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Correct 3 ms 432 KB Output is correct
26 Correct 2 ms 436 KB Output is correct
27 Correct 6 ms 312 KB Output is correct
28 Correct 4 ms 436 KB Output is correct
29 Correct 2 ms 332 KB Output is correct
30 Correct 2 ms 468 KB Output is correct
31 Correct 3 ms 332 KB Output is correct
32 Correct 7 ms 332 KB Output is correct
33 Correct 236 ms 32808 KB Output is correct
34 Correct 236 ms 32756 KB Output is correct
35 Correct 422 ms 70720 KB Output is correct
36 Correct 365 ms 70708 KB Output is correct
37 Correct 348 ms 30860 KB Output is correct
38 Correct 366 ms 62988 KB Output is correct
39 Correct 224 ms 30456 KB Output is correct
40 Correct 371 ms 65944 KB Output is correct
41 Correct 253 ms 30588 KB Output is correct
42 Correct 319 ms 30716 KB Output is correct
43 Correct 351 ms 66116 KB Output is correct
44 Correct 367 ms 66140 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 0 ms 332 KB Output is correct
5 Correct 0 ms 332 KB Output is correct
6 Correct 1 ms 204 KB Output is correct
7 Correct 0 ms 204 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
11 Correct 1 ms 332 KB Output is correct
12 Correct 1 ms 304 KB Output is correct
13 Correct 1 ms 204 KB Output is correct
14 Correct 0 ms 204 KB Output is correct
15 Correct 1 ms 304 KB Output is correct
16 Correct 0 ms 204 KB Output is correct
17 Correct 0 ms 332 KB Output is correct
18 Correct 0 ms 332 KB Output is correct
19 Correct 1 ms 332 KB Output is correct
20 Correct 0 ms 332 KB Output is correct
21 Correct 1 ms 332 KB Output is correct
22 Correct 1 ms 332 KB Output is correct
23 Correct 2 ms 332 KB Output is correct
24 Correct 2 ms 424 KB Output is correct
25 Correct 2 ms 468 KB Output is correct
26 Correct 2 ms 440 KB Output is correct
27 Correct 6 ms 332 KB Output is correct
28 Correct 5 ms 568 KB Output is correct
29 Correct 2 ms 332 KB Output is correct
30 Correct 2 ms 460 KB Output is correct
31 Correct 3 ms 332 KB Output is correct
32 Correct 8 ms 316 KB Output is correct
33 Correct 895 ms 64616 KB Output is correct
34 Correct 560 ms 73240 KB Output is correct
35 Correct 559 ms 64448 KB Output is correct
36 Correct 693 ms 68316 KB Output is correct
37 Correct 236 ms 32928 KB Output is correct
38 Correct 235 ms 32772 KB Output is correct
39 Correct 436 ms 70688 KB Output is correct
40 Correct 399 ms 70672 KB Output is correct
41 Correct 341 ms 30908 KB Output is correct
42 Correct 400 ms 62844 KB Output is correct
43 Correct 224 ms 30532 KB Output is correct
44 Correct 401 ms 65968 KB Output is correct
45 Correct 247 ms 30596 KB Output is correct
46 Correct 317 ms 30676 KB Output is correct
47 Correct 389 ms 66160 KB Output is correct
48 Correct 399 ms 66044 KB Output is correct
49 Correct 402 ms 37396 KB Output is correct
50 Correct 330 ms 37284 KB Output is correct
51 Correct 635 ms 72596 KB Output is correct
52 Correct 470 ms 72200 KB Output is correct
53 Correct 1438 ms 35500 KB Output is correct
54 Correct 720 ms 64776 KB Output is correct
55 Correct 373 ms 31540 KB Output is correct
56 Correct 548 ms 67664 KB Output is correct
57 Correct 607 ms 32240 KB Output is correct
58 Correct 1262 ms 32836 KB Output is correct
59 Correct 376 ms 66124 KB Output is correct