Submission #1207024

#TimeUsernameProblemLanguageResultExecution timeMemory
1207024peraHorses (IOI15_horses)C++20
34 / 100
1596 ms35492 KiB
#include<bits/stdc++.h>
#include "horses.h"
#define LL long long
using namespace std;
const int N_MAX = 5E5 + 1;
const LL mod = 1E9 + 7;
const __int128 oo = 1E9;
int n;
set<int> S;
vector<LL> x(N_MAX) , y(N_MAX);
int calc(){
   if(S.empty()){
      LL mx = 0;
      for(int i = 0;i < n;i ++){
         mx = max(mx , y[i]);
      }
      return mx;
   }
   int j = 0; 
   __int128 prd = 1;
   auto it = --S.end();
   while(true){
      j = *it;
      if(__int128(x[*it]) * prd > oo){
         break;
      }
      if(it == S.begin()){
         j = 0;
         break;
      }
      prd *= __int128(x[*it]);
      --it;
   }
   prd = 1;
   __int128 best = 0;
   for(int i = j;i < n;i ++){
      prd *= __int128(x[i]);
      __int128 A = __int128(prd) * __int128(y[i]);
      best = max(best , A);
   }
   best %= mod;
   for(int i = 0;i < j;i ++){
      best = x[i] * best % mod;
   }
   best %= mod;
   return (int)best;
}

int init(int N, int X[], int Y[]) {
   n = N;
   for(int i = 0;i < N;i ++){
      x[i] = X[i];
      y[i] = Y[i];
      if(x[i] > 1){
         S.insert(i);
      }
   }
   return calc();
}

int updateX(int pos, int val) {	
   if(x[pos] > 1){
      S.erase(pos);
   }
   x[pos] = val;
   if(x[pos] > 1){
      S.insert(pos);
   }
	return calc();
}

int updateY(int pos, int val) {
   y[pos] = val;
	return calc();
}
#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...