Submission #153830

#TimeUsernameProblemLanguageResultExecution timeMemory
153830alexandra_udristoiuHorses (IOI15_horses)C++14
54 / 100
1568 ms53404 KiB
#include<iostream> #include<set> #include "horses.h" #define DIM 500005 #define mod 1000000007 #define f first #define s second using namespace std; static int n; static int x[DIM], y[DIM], lst[DIM]; static pair<int, int> aint[4 * DIM], aux; static set< pair<int, int> > w; static void build(int nod, int st, int dr){ if(st == dr){ aint[nod] = make_pair(x[st], y[st]); } else{ int mid = (st + dr) / 2; build(2 * nod, st, mid); build(2 * nod + 1, mid + 1, dr); aint[nod].f = aint[2 * nod].f * 1LL * aint[2 * nod + 1].f % mod; aint[nod].s = max(aint[2 * nod].s, aint[2 * nod + 1].s); } } static void update(int nod, int st, int dr, int p){ if(st == dr){ aint[nod] = make_pair(x[st], y[st]); } else{ int mid = (st + dr) / 2; if(p <= mid){ update(2 * nod, st, mid, p); } else{ update(2 * nod + 1, mid + 1, dr, p); } aint[nod].f = aint[2 * nod].f * 1LL * aint[2 * nod + 1].f % mod; aint[nod].s = max(aint[2 * nod].s, aint[2 * nod + 1].s); } } static void query(int nod, int st, int dr, int p, int u){ if(p <= st && dr <= u){ aux.f = aux.f * 1LL * aint[nod].f % mod; aux.s = max(aux.s, aint[nod].s); } else{ int mid = (st + dr) / 2; if(p <= mid){ query(2 * nod, st, mid, p, u); } if(u > mid){ query(2 * nod + 1, mid + 1, dr, p, u); } } } static int solve(){ int i, ind, ymax; long long val, sol; set< pair<int, int> > :: iterator it; val = 1; it = w.end(); it--; for(; it != w.begin(); it--){ val *= x[ it->f ]; if(val > 1000000000){ break; } } val = 1; sol = ymax = y[ it->f ]; ind = it->f; it++; for(; it != w.end(); it++){ val *= x[ it->f ]; aux = make_pair(1, 0); query(1, 1, n, it->f, it->s); if(sol < val * aux.s){ sol = val * aux.s; ymax = aux.s; ind = it->s; } } aux = make_pair(1, 0); query(1, 1, n, 1, ind); return aux.f * 1LL * ymax % mod; } int init(int N, int X[], int Y[]) { n = N; w.insert( make_pair(0, 0) ); int lst; for(int i = 1; i <= n; i++){ x[i] = X[i - 1]; y[i] = Y[i - 1]; if(x[i] != 1){ w.insert( make_pair(i, i) ); } else{ if(x[i - 1] != 1){ lst = i; } if(x[i + 1] != 1){ w.insert( make_pair(lst, i) ); } } } build(1, 1, n); return solve(); } int updateX(int pos, int val) { pos++; set< pair<int, int> > :: iterator it; pair<int, int> a; if(x[pos] == 1){ it = w.lower_bound( make_pair(pos + 1, 0) ); it--; a = *it; w.erase(it); if(a.f != pos){ w.insert( make_pair(a.f, pos - 1) ); } if(a.s != pos){ w.insert( make_pair(pos + 1, a.s) ); } w.insert( make_pair(pos, pos) ); } x[pos] = val; update(1, 1, n, pos); if(x[pos] == 1){ w.erase( make_pair(pos, pos) ); a = make_pair(pos, pos); if(x[pos - 1] == 1){ it = w.lower_bound( make_pair(pos, pos) ); it--; a.f = it->f; w.erase(it); } if(x[pos + 1] == 1){ it = w.lower_bound( make_pair(pos, pos) ); a.s = it->s; w.erase(it); } w.insert(a); } return solve(); } int updateY(int pos, int val) { pos++; y[pos] = val; update(1, 1, n, pos); return solve(); }

Compilation message (stderr)

horses.cpp: In function 'void build(int, int, int)':
horses.cpp:21:67: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
         aint[nod].f = aint[2 * nod].f * 1LL * aint[2 * nod + 1].f % mod;
                                                                   ^
horses.cpp: In function 'void update(int, int, int, int)':
horses.cpp:37:67: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
         aint[nod].f = aint[2 * nod].f * 1LL * aint[2 * nod + 1].f % mod;
                                                                   ^
horses.cpp: In function 'void query(int, int, int, int, int)':
horses.cpp:43:43: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
         aux.f = aux.f * 1LL * aint[nod].f % mod;
                                           ^
horses.cpp: In function 'int solve()':
horses.cpp:85:31: warning: conversion to 'int' from 'long long int' may alter its value [-Wconversion]
     return aux.f * 1LL * ymax % mod;
                               ^
horses.cpp:57:9: warning: unused variable 'i' [-Wunused-variable]
     int i, ind, ymax;
         ^
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:90:6: warning: declaration of 'lst' shadows a global declaration [-Wshadow]
  int lst;
      ^~~
horses.cpp:10:28: note: shadowed declaration is here
 static int x[DIM], y[DIM], lst[DIM];
                            ^~~
horses.cpp: At global scope:
horses.cpp:10:28: warning: 'lst' defined but not used [-Wunused-variable]
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:102:36: warning: 'lst' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 w.insert( make_pair(lst, i) );
                           ~~~~~~~~~^~~~~~~~
#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...