답안 #1107788

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1107788 2024-11-02T05:40:00 Z Aviansh 말 (IOI15_horses) C++17
54 / 100
1500 ms 34496 KB
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;

int n;
int *x;
int *y;
int mod = 1e9+7;

template <class T> class segTree{
    private:
        int n;
        T *st;
    public:
        void realMakeST(int *arr, int l, int r, int ind){
            if(l==r){
                st[ind]=arr[l];
            }
            else{
                int mid = (l+r)/2;
                realMakeST(arr,l,mid,ind*2+1);
                realMakeST(arr,mid+1,r,ind*2+2);
                st[ind]=st[ind*2+1]*st[ind*2+2];
                st[ind]%=mod;
            }
        }
        segTree(){
            //aise hi
        }
        segTree(int *arr, int siz){
            int x = (int)pow(2,ceil(log2(siz)));
            n=siz-1;
            x*=2;
            st=new T[x];
            realMakeST(arr,0,n,0);
        }
        void realUpdate(int l, int r, int ind, int pos, int val){
            if(pos<l||pos>r){
                return;
            }
            if(l==r){
                st[ind]=val;
                return;
            }
            int mid = (l+r)/2;
            realUpdate(l,mid,2*ind+1,pos,val);
            realUpdate(mid+1,r,2*ind+2,pos,val);
            st[ind]=st[ind*2+1]*st[ind*2+2];
            st[ind]%=mod;
        }
        void update(int ind, int val){
            realUpdate(0,n,0,ind,val);
        }

        T realQuery(int l, int r, int s, int e, int ind){
            if(e<l||s>r){
                return 1;
            }
            if(s<=l&&r<=e){
                return st[ind];
            }
            int mid = (l+r)/2;
            return (realQuery(l,mid,s,e,2*ind+1)*realQuery(mid+1,r,s,e,2*ind+2))%mod;
        }

        T query(int s,int e){
            return realQuery(0,n,s,e,0);
        }
};


template <class T> class segTreeMax{
    private:
        int n;
        T *st;
    public:
        void realMakeST(int *arr, int l, int r, int ind){
            if(l==r){
                st[ind]=arr[l];
            }
            else{
                int mid = (l+r)/2;
                realMakeST(arr,l,mid,ind*2+1);
                realMakeST(arr,mid+1,r,ind*2+2);
                st[ind]=st[ind*2+1]*st[ind*2+2];
                st[ind]%=mod;
            }
        }
        segTreeMax(){
            //aise hi
        }
        segTreeMax(int *arr, int siz){
            int x = (int)pow(2,ceil(log2(siz)));
            n=siz-1;
            x*=2;
            st=new T[x];
            realMakeST(arr,0,n,0);
        }
        void realUpdate(int l, int r, int ind, int pos, int val){
            if(pos<l||pos>r){
                return;
            }
            if(l==r){
                st[ind]=val;
                return;
            }
            int mid = (l+r)/2;
            realUpdate(l,mid,2*ind+1,pos,val);
            realUpdate(mid+1,r,2*ind+2,pos,val);
            st[ind]=st[ind*2+1]*st[ind*2+2];
            st[ind]%=mod;
        }
        void update(int ind, int val){
            realUpdate(0,n,0,ind,val);
        }

        T realQuery(int l, int r, int s, int e, int ind){
            if(e<l||s>r){
                return 1;
            }
            if(s<=l&&r<=e){
                return st[ind];
            }
            int mid = (l+r)/2;
            return (realQuery(l,mid,s,e,2*ind+1)*realQuery(mid+1,r,s,e,2*ind+2))%mod;
        }

        T query(int s,int e){
            return realQuery(0,n,s,e,0);
        }
};

int t = 1;
int *temp = &t;

segTree<long long> st(temp,1);
segTreeMax<long long> stmax(temp,1);
set<pair<int,int>>ones;

int finans(){
    int mx = n-1;
    long long curr = 1;
    int mxy = y[n-1];
    //cout << "here1" << endl;
    set<pair<int,int>>::iterator it = ones.end();
    //cout << "here2" << endl;
    //cout << "ones.size: " << ones.size() << endl;
    bool over = (ones.size()==0);
    if(!over)
        --it;
    for(int i = n-1;i>=0;i--){
        if(!over&&i==(*it).second){
            i=(*it).first;
            int cury = 0;
            if(1){
                for(int i = (*it).first;i<=(*it).second;i++){
                    cury=max(cury,y[i]);
                }
            }
            else{
                cury = stmax.query((*it).first,(*it).second);
            }
            if(cury>curr){
                mx=i;
                curr=cury;
                mxy=cury;
            }
            if(it==ones.begin()){
                over=1;
            }
            it--;
            if(curr>=1e9){
                break;
            }
            continue;
        }
        if(y[i]>curr){
            mx=i;
            curr=y[i];
            mxy=y[i];
        }
        curr*=x[i];
        //cout << i << endl;
        assert(x[i]!=1);
        if(curr>=1e9){
            break;
        }
    }
    //cout << "returning: " << (1LL*st.query(0,mx)*mxy)%mod << endl;
    return (1LL*st.query(0,mx)*mxy)%mod;
}

int init(int N, int X[], int Y[]) {
    x=X;
    y=Y;
    n=N;
    st = segTree<long long>(x,n);
    stmax = segTreeMax<long long>(y,n);
    pair<int,int>rg={-1,-1};
    for(int i = 0;i<n;i++){
        if(x[i]==1){
            if(rg.first==-1){
                rg.first=i;
                rg.second=i;
            }
            else{
                rg.second=i;
            }
        }
        else {
            if(rg.first!=-1)
                ones.insert(rg);
            rg={-1,-1};
        }
    }
    if(rg.first!=-1){
        ones.insert(rg);
    }
    //cout << "here" << endl;
    for(pair<int,int>p:ones){
        //cout << p.first << " " << p.second << endl;
    }
    return finans();
}

int updateX(int pos, int val) {
    if(x[pos]==1&&val!=1){
        set<pair<int,int>>::iterator it = ones.upper_bound({pos,2e9});
        pair<int,int>p = *(--it);
        ones.erase(p);
        if(p.first!=pos){
            ones.insert({p.first,pos-1});
        }
        if(p.second!=pos){
            ones.insert({pos+1,p.second});
        }
    }
    else if(x[pos]!=1&&val==1){
        if(ones.size()==0){
            ones.insert({pos,pos});
        }
        else{
            set<pair<int,int>>::iterator it = ones.upper_bound({pos,2e9});
            pair<int,int>p={0,0};
            if(it!=ones.begin()){
                p = *(--it);
                if(p.second==pos-1){
                    ones.erase(p);
                    ones.insert({p.first,pos});
                }
                else{
                    ones.insert({pos,pos});
                }
            }
            else{
                ones.insert({pos,pos});
            }
            it=ones.upper_bound({pos,2e9});
            if(it!=ones.end()){
                p=*(it);
                if(p.first==pos+1){
                    pair<int,int>p2=*(--it);
                    ones.erase(p);
                    ones.erase(p2);
                    ones.insert({p2.first,p.second});
                }
            }
        }
    }
    int las = -10;
    for(pair<int,int>p:ones){
        assert(p.first-las>1);
        las=p.second;
    }
    x[pos]=val;
    st.update(pos,val);
    //cout << "updated: " << endl;
    for(pair<int,int>p:ones){
        //cout << p.first << " " << p.second << endl;
    }
	return finans();
}

int updateY(int pos, int val) {
    y[pos]=val;
    stmax.update(pos,val);
	return finans();
}

Compilation message

horses.cpp: In constructor 'segTree<T>::segTree(int*, int)':
horses.cpp:31:17: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   31 |             int x = (int)pow(2,ceil(log2(siz)));
      |                 ^
horses.cpp:6:6: note: shadowed declaration is here
    6 | int *x;
      |      ^
horses.cpp: In constructor 'segTreeMax<T>::segTreeMax(int*, int)':
horses.cpp:93:17: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   93 |             int x = (int)pow(2,ceil(log2(siz)));
      |                 ^
horses.cpp:6:6: note: shadowed declaration is here
    6 | int *x;
      |      ^
horses.cpp: In function 'int finans()':
horses.cpp:156:25: warning: declaration of 'i' shadows a previous local [-Wshadow]
  156 |                 for(int i = (*it).first;i<=(*it).second;i++){
      |                         ^
horses.cpp:151:13: note: shadowed declaration is here
  151 |     for(int i = n-1;i>=0;i--){
      |             ^
horses.cpp:161:35: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  161 |                 cury = stmax.query((*it).first,(*it).second);
      |                        ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
horses.cpp:172:16: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
  172 |             if(curr>=1e9){
      |                ^~~~
horses.cpp:185:12: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
  185 |         if(curr>=1e9){
      |            ^~~~
horses.cpp:190:36: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  190 |     return (1LL*st.query(0,mx)*mxy)%mod;
      |            ~~~~~~~~~~~~~~~~~~~~~~~~^~~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:220:22: warning: variable 'p' set but not used [-Wunused-but-set-variable]
  220 |     for(pair<int,int>p:ones){
      |                      ^
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:278:22: warning: variable 'p' set but not used [-Wunused-but-set-variable]
  278 |     for(pair<int,int>p:ones){
      |                      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 0 ms 336 KB Output is correct
5 Correct 0 ms 336 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 336 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 336 KB Output is correct
11 Correct 0 ms 336 KB Output is correct
12 Correct 1 ms 336 KB Output is correct
13 Correct 1 ms 336 KB Output is correct
14 Correct 1 ms 504 KB Output is correct
15 Correct 0 ms 336 KB Output is correct
16 Correct 1 ms 336 KB Output is correct
17 Correct 1 ms 336 KB Output is correct
18 Correct 1 ms 336 KB Output is correct
19 Correct 0 ms 336 KB Output is correct
20 Correct 1 ms 336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 1 ms 336 KB Output is correct
6 Correct 1 ms 504 KB Output is correct
7 Correct 1 ms 336 KB Output is correct
8 Correct 1 ms 336 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 336 KB Output is correct
11 Correct 1 ms 336 KB Output is correct
12 Correct 1 ms 336 KB Output is correct
13 Correct 1 ms 336 KB Output is correct
14 Correct 1 ms 336 KB Output is correct
15 Correct 1 ms 336 KB Output is correct
16 Correct 1 ms 336 KB Output is correct
17 Correct 1 ms 428 KB Output is correct
18 Correct 1 ms 336 KB Output is correct
19 Correct 0 ms 336 KB Output is correct
20 Correct 1 ms 336 KB Output is correct
21 Correct 1 ms 336 KB Output is correct
22 Correct 1 ms 336 KB Output is correct
23 Correct 1 ms 336 KB Output is correct
24 Correct 1 ms 336 KB Output is correct
25 Correct 1 ms 336 KB Output is correct
26 Correct 1 ms 336 KB Output is correct
27 Correct 2 ms 564 KB Output is correct
28 Correct 2 ms 336 KB Output is correct
29 Correct 2 ms 336 KB Output is correct
30 Correct 1 ms 336 KB Output is correct
31 Correct 2 ms 336 KB Output is correct
32 Correct 1 ms 336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 21576 KB Output is correct
2 Correct 102 ms 21508 KB Output is correct
3 Correct 59 ms 21576 KB Output is correct
4 Correct 67 ms 21576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 1 ms 336 KB Output is correct
6 Correct 1 ms 336 KB Output is correct
7 Correct 1 ms 336 KB Output is correct
8 Correct 1 ms 336 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 336 KB Output is correct
11 Correct 0 ms 336 KB Output is correct
12 Correct 1 ms 336 KB Output is correct
13 Correct 0 ms 336 KB Output is correct
14 Correct 1 ms 336 KB Output is correct
15 Correct 1 ms 336 KB Output is correct
16 Correct 0 ms 336 KB Output is correct
17 Correct 1 ms 504 KB Output is correct
18 Correct 0 ms 336 KB Output is correct
19 Correct 0 ms 336 KB Output is correct
20 Correct 1 ms 336 KB Output is correct
21 Correct 1 ms 508 KB Output is correct
22 Correct 0 ms 336 KB Output is correct
23 Correct 1 ms 336 KB Output is correct
24 Correct 1 ms 488 KB Output is correct
25 Correct 1 ms 336 KB Output is correct
26 Correct 1 ms 336 KB Output is correct
27 Correct 2 ms 336 KB Output is correct
28 Correct 3 ms 336 KB Output is correct
29 Correct 1 ms 336 KB Output is correct
30 Correct 1 ms 336 KB Output is correct
31 Correct 1 ms 336 KB Output is correct
32 Correct 2 ms 336 KB Output is correct
33 Correct 76 ms 24072 KB Output is correct
34 Correct 64 ms 23112 KB Output is correct
35 Correct 58 ms 26912 KB Output is correct
36 Correct 58 ms 26536 KB Output is correct
37 Correct 198 ms 21584 KB Output is correct
38 Execution timed out 1550 ms 32936 KB Time limit exceeded
39 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 336 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Correct 1 ms 336 KB Output is correct
6 Correct 1 ms 504 KB Output is correct
7 Correct 1 ms 336 KB Output is correct
8 Correct 1 ms 336 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 1 ms 336 KB Output is correct
11 Correct 1 ms 336 KB Output is correct
12 Correct 1 ms 336 KB Output is correct
13 Correct 1 ms 336 KB Output is correct
14 Correct 1 ms 336 KB Output is correct
15 Correct 1 ms 336 KB Output is correct
16 Correct 1 ms 336 KB Output is correct
17 Correct 1 ms 336 KB Output is correct
18 Correct 1 ms 336 KB Output is correct
19 Correct 1 ms 336 KB Output is correct
20 Correct 0 ms 336 KB Output is correct
21 Correct 1 ms 336 KB Output is correct
22 Correct 1 ms 336 KB Output is correct
23 Correct 1 ms 484 KB Output is correct
24 Correct 1 ms 508 KB Output is correct
25 Correct 1 ms 336 KB Output is correct
26 Correct 1 ms 336 KB Output is correct
27 Correct 1 ms 336 KB Output is correct
28 Correct 2 ms 504 KB Output is correct
29 Correct 2 ms 336 KB Output is correct
30 Correct 1 ms 336 KB Output is correct
31 Correct 1 ms 336 KB Output is correct
32 Correct 1 ms 336 KB Output is correct
33 Correct 67 ms 23636 KB Output is correct
34 Correct 84 ms 21576 KB Output is correct
35 Correct 58 ms 23872 KB Output is correct
36 Correct 75 ms 26444 KB Output is correct
37 Correct 78 ms 22600 KB Output is correct
38 Correct 67 ms 23112 KB Output is correct
39 Correct 59 ms 26440 KB Output is correct
40 Correct 57 ms 25244 KB Output is correct
41 Correct 197 ms 22284 KB Output is correct
42 Execution timed out 1561 ms 34496 KB Time limit exceeded
43 Halted 0 ms 0 KB -