Submission #1201345

#TimeUsernameProblemLanguageResultExecution timeMemory
1201345notmeHorses (IOI15_horses)C++20
37 / 100
519 ms61272 KiB
#include<bits/stdc++.h>
#define pb push_back
#include "horses.h"
using namespace std;
const int maxn = 5e5 + 10;
const long long mod = 1e9 + 7;
long long n, a[maxn], b[maxn];
long long t[maxn * 4], ti[maxn * 4], tg[maxn * 4];
void build(int i, int l, int r)
{
    t[i] = b[l];
    ti[i] = l;
    tg[i] = a[l];
    if(l == r)return;
    int mid = (l + r)/2;
    build(2*i, l, mid);
    build(2*i+1, mid+1, r);
    t[i] = max(t[2*i], t[2*i+1]);
    if(t[2*i] > t[2*i+1])ti[i] = ti[2*i];
    else ti[i] = ti[2*i+1];
    tg[i] = tg[2*i] * tg[2*i+1];
    tg[i] %= mod;
}
long long  updpos, updval;
void update_prod(int i, int l, int r)
{
    if(l == r)
    {
        tg[i] = updval;
        a[l] = updval;
        return;
    }
    int mid = (l + r)/2;
    if(updpos <= mid)update_prod(2*i, l, mid);
    else update_prod(2*i+1, mid+1, r);
    tg[i] = 1LL * tg[2*i] * tg[2*i+1];
    tg[i] %= mod;
}
void update_max(int i, int l, int r)
{
    if(l == r)
    {
        b[l] = updval;
        ti[i] = l;
        t[i] = b[l];
        return;
    }
    int mid = (l + r)/2;
    if(updpos <= mid)update_max(2*i, l, mid);
    else update_max(2*i+1, mid+1, r);
    t[i] = max(t[2*i], t[2*i+1]);
    if(t[2*i] > t[2*i+1])ti[i] = ti[2*i];
    else ti[i] = ti[2*i+1];
}
int ql, qr;
long long query_prod(int i, int l, int r)
{
    if(l > r)return 1;
    if(ql > r || qr < l)return 1;
    if(ql <= l && r <= qr)return tg[i];
    int mid = (l + r)/2;
    long long pos1 = query_prod(2*i, l, mid);
    long long pos2 = query_prod(2*i+1, mid+1, r);
    return (pos1 * pos2) % mod;
}
long long query_max(int i, int l, int r)
{
    if(l > r)return 0;
    if(ql > r || qr < l)return 0;
    if(ql <= l && r <= qr)return ti[i];
    int mid = (l + r)/2;
    int pos1 = query_max(2*i, l, mid);
    int pos2 = query_max(2*i+1, mid+1, r);
    if(!pos1 || !pos2)return (pos1 + pos2);
    if(b[pos1] > b[pos2])return pos1;
    else return pos2;
}


set < int > s;
int cnt = 0;
long long solve()
{
    cnt ++;
    if(s.size() == 0)
    {
        ql = 1;
       qr = n;
       // cout << pos << " " << n << endl;
       return b[query_max(1, 1, n)];
    }
    s.insert(1);
    set < int >::iterator it = s.end();
    long long best = 0, bestsell = 0, index = 1;
    while(it != s.begin())
    {
        int pre = n;
        if(it != s.end())pre = *it - 1;

        it --;


        long long pos = *it;
       // if(cnt < 10)cout << pre << " " << pos << endl;
        ql = pos;
        qr = pre;
        long long sell = b[query_max(1, 1, n)];
       // if(cnt < 10)cout << "sell is " << sell << endl;
        if(sell > best)
        {
            best = sell;
            index = pos;
            bestsell = sell;
        }
        best *= a[pos];
        if(best > 1LL * 1e9)break;

    }
    s.erase(1);
      //  cout << bestprod << " " << bestsell << endl;
      ql = 1;
      qr = index;
    return 1LL * (bestsell * query_prod(1, 1, n))%mod;

}
int init(int N, int X[], int Y[])
{
    n = N;
    for (int i = 0; i < n; ++ i)
        a[i+1] = X[i];
    for (int i = 0; i < n; ++ i)
        b[i+1] = Y[i];
    build(1, 1, n);
    for (int i = 1; i <= n; ++ i)
        if(a[i] > 1)s.insert(i);

    long long ans =  solve();
    //cout << "ans s " << ans << endl;
    return ans;
}

int updateX(int pos, int val)
{
    pos ++;
    if(a[pos] > 1)s.erase(pos);
    updpos = pos;
    updval = val;
    update_prod(1, 1, n);
    if(val > 1)s.insert(pos);
	return solve();
}

int updateY(int pos, int val)
{
    pos ++;
    b[pos] = val;
    updpos = pos;
    updval = val;
    update_max(1, 1, n);
	return solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...