Submission #377778

#TimeUsernameProblemLanguageResultExecution timeMemory
377778ntabc05101Zoltan (COCI16_zoltan)C++14
140 / 140
172 ms14732 KiB
#ifndef LOCAL
#define NDEBUG 1
#endif // LOCAL
#include<bits/stdc++.h>

#define f first
#define s second

const int max_n=200000;
const int mod=1e9+7;

std::pair<int, int> bits[max_n+5], bits2[max_n+5];

void update(int x, std::pair<int, int> delta) {
        assert(x>0);
        for (; x<=max_n; x+=x&-x) {
                if (bits[x].f<delta.f) {
                        bits[x]=delta;
                }
                else if (bits[x].f==delta.f) {
                        bits[x].s+=delta.s;
                        if (bits[x].s>=mod) {
                                bits[x].s-=mod;
                        }
                }
        }
}

std::pair<int, int> get(int x) {
        std::pair<int, int> ret={0, 0};
        for (; x>0; x&=x-1) {
                if (ret.f<bits[x].f) {
                        ret=bits[x];
                }
                else if (ret.f==bits[x].f) {
                        ret.s+=bits[x].s;
                        if (ret.s>=mod) {
                                ret.s-=mod;
                        }
                }
        }

        return ret;
}

void update2(int x, std::pair<int, int> delta) {
        for (; x>0; x&=x-1) {
                if (bits2[x].f<delta.f) {
                        bits2[x]=delta;
                }
                else if (bits2[x].f==delta.f) {
                        bits2[x].s+=delta.s;
                        if (bits2[x].s>=mod) {
                                bits2[x].s-=mod;
                        }
                }
        }
}

std::pair<int, int> get2(int x) {
        assert(x>0);
        std::pair<int, int> ret={0, 0};
        for (; x<=max_n; x+=x&-x) {
                if (ret.f<bits2[x].f) {
                        ret=bits2[x];
                }
                else if (ret.f==bits2[x].f) {
                        ret.s+=bits2[x].s;
                        if (ret.s>=mod) {
                                ret.s-=mod;
                        }
                }
        }

        return ret;
}


int main() {
        if (fopen("input.txt", "r")) {
                freopen("input.txt", "r", stdin);
                freopen("output.tx", "w", stdout);
        }

        std::ios_base::sync_with_stdio(0); std::cin.tie(0);

        int n; std::cin>>n;
        int a[n];
        std::vector<int> points;
        for (int i=0; i<n; ++i) {
                std::cin>>a[i];
                points.push_back(a[i]);
        }

        std::sort(begin(points), end(points));
        points.resize(std::distance(begin(points), std::unique(begin(points), end(points))));

        std::unordered_map<int, int> cpts;
        for (int i=0; i<points.size(); ++i) {
                cpts[points[i]]=i+1;
        }
        for (int i=0; i<n; ++i) {
                a[i]=cpts[a[i]];
        }

        int64_t pow2[n+5];
        pow2[0]=1;
        for (int i=1; i<=n; ++i) {
                pow2[i]=(pow2[i-1]*2)%mod;
        }

        //for (int i=0; i<n; ++i) std::cout<<a[i]<<" "; std::cout<<"\n";

        update(1, {0, 1}); //[0] + 1
        update2(n, {0, 1}); //[n+1] - 1

        std::pair<int, int> result={0, 0};
        for (int i=n-1; i>=0; --i) {
                auto inc=get(a[i]), dec=get2(a[i]);
                //std::cout<<inc.f<<" "<<dec.f<<"\n";

                int len=inc.f+dec.f+1;
                int count=pow2[n-len]*inc.s%mod*dec.s%mod;

                if (result.f<len) {
                        result={len, count};
                }
                else if (result.f==len) {
                        result.s+=count;
                        if (result.s>=mod) {
                                result.s-=mod;
                        }
                }

                update(a[i]+1, {inc.f+1, inc.s});
                update2(a[i]-1, {dec.f+1, dec.s});
        }

        std::cout<<result.f<<" "<<result.s<<"\n";

        return 0;
}

Compilation message (stderr)

zoltan.cpp: In function 'int main()':
zoltan.cpp:99:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |         for (int i=0; i<points.size(); ++i) {
      |                       ~^~~~~~~~~~~~~~
zoltan.cpp:81:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   81 |                 freopen("input.txt", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
zoltan.cpp:82:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   82 |                 freopen("output.tx", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...