# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
795263 |
2023-07-27T07:54:14 Z |
Josia |
Horses (IOI15_horses) |
C++17 |
|
1500 ms |
48344 KB |
#include "horses.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9+7;
struct seg {
vector<int> tree;
void init(int n) {
tree.assign(n*4, 0);
}
void update(int v, int rl, int rr, int pos, int x) {
if (rl == rr) {
tree[v] = x;
return;
}
int rm = (rl + rr)/2;
if (pos <= rm) update(v*2, rl, rm, pos, x);
else update(v*2+1, rm+1, rr, pos, x);
tree[v] = max(tree[v*2], tree[v*2+1]);
}
int query(int v, int rl, int rr, int ql, int qr) {
if (ql > qr) return 0;
if (rl == ql && rr == qr) return tree[v];
int rm = (rl + rr)/2;
return max(query(v*2, rl, rm, ql, min(qr, rm)), query(v*2+1, rm+1, rr, max(ql, rm+1), qr));
}
};
struct segY {
vector<pair<int, int>> tree;
void init(int n) {
tree.assign(n*4, {0, 0});
}
void update(int v, int rl, int rr, int pos, int x) {
if (rl == rr) {
tree[v] = {x, pos};
return;
}
int rm = (rl + rr)/2;
if (pos <= rm) update(v*2, rl, rm, pos, x);
else update(v*2+1, rm+1, rr, pos, x);
tree[v] = max(tree[v*2], tree[v*2+1]);
}
pair<int, int> query(int v, int rl, int rr, int ql, int qr) {
if (ql > qr) return {0, -1};
if (rl == ql && rr == qr) return tree[v];
int rm = (rl + rr)/2;
return max(query(v*2, rl, rm, ql, min(qr, rm)), query(v*2+1, rm+1, rr, max(ql, rm+1), qr));
}
};
ll mult(ll a, ll b) {
return (a*b)%mod;
}
struct seg2 {
vector<ll> tree;
void init(int n) {
tree.assign(n*4, 0);
}
void update(int v, int rl, int rr, int pos, int x) {
if (rl == rr) {
tree[v] = x;
return;
}
int rm = (rl + rr)/2;
if (pos <= rm) update(v*2, rl, rm, pos, x);
else update(v*2+1, rm+1, rr, pos, x);
tree[v] = mult(tree[v*2], tree[v*2+1]);
}
ll query(int v, int rl, int rr, int ql, int qr) {
if (ql > qr) return 1;
if (rl == ql && rr == qr) return tree[v];
int rm = (rl + rr)/2;
return mult(query(v*2, rl, rm, ql, min(qr, rm)), query(v*2+1, rm+1, rr, max(ql, rm+1), qr));
}
};
seg tree;
segY treeY;
seg2 tree2;
int N;
vector<int> X, Y;
struct getSol {
int sol = 0;
int BS(int pos) {
int l = 0, r = pos-1;
while (l<r) {
int m = (l+r+1)/2;
// cerr << m << " " << pos-1 << " " << tree.query(1, 0, N-1, m, pos-1) << "\n";
if (tree.query(1, 0, N-1, m, pos-1) > 1) {
l = m;
} else {
r = m-1;
}
}
if (tree.query(1, 0, N-1, l, pos-1) <= 1) return -1;
return l;
}
int BSinv(int pos) {
if (pos == N-1) return N-1;
int l = pos+1, r = N-1;
while (l<r) {
int m = (l+r+1)/2;
// cerr << m << " " << pos-1 << " " << tree.query(1, 0, N-1, m, pos-1) << "\n";
if (tree.query(1, 0, N-1, pos+1, m) > 1) {
r = m-1;
} else {
l = m;
}
}
return l;
}
int findInd() {
int currInd = N-1;
ll currProd = 1;
for (int i = N-1; i>=0; i = BS(i)) {
// cerr << i << " " << currProd << " " << currInd << " " << BSinv(i) << "\n";
if (currProd*Y[currInd] <= treeY.query(1, 0, N-1, i, BSinv(i)).first) {currInd = treeY.query(1, 0, N-1, i, BSinv(i)).second; currProd=1;}
currProd *= X[i];
if (currProd > 1e9) break;
}
return currInd;
}
getSol() {
int ind = findInd();
// cerr << ind << " " << tree2.query(1, 0, N-1, 0, ind) << " " << Y[ind] << "\n\n";
sol = (tree2.query(1, 0, N-1, 0, ind) * Y[ind])%mod;
}
};
int init(int _N, int _X[], int _Y[]) {
N = _N;
X.resize(N);
Y.resize(N);
for (int i = 0; i<N; i++) X[i] = _X[i];
for (int i = 0; i<N; i++) Y[i] = _Y[i];
tree.init(N);
treeY.init(N);
tree2.init(N);
for (int i = 0; i<N; i++) {
tree.update(1, 0, N-1, i, X[i]);
treeY.update(1, 0, N-1, i, Y[i]);
tree2.update(1, 0, N-1, i, X[i]);
}
return getSol().sol;
}
int updateX(int pos, int val) {
tree.update(1, 0, N-1, pos, val);
tree2.update(1, 0, N-1, pos, val);
X[pos] = val;
return getSol().sol;
}
int updateY(int pos, int val) {
treeY.update(1, 0, N-1, pos, val);
Y[pos] = val;
return getSol().sol;
}
Compilation message
horses.cpp: In member function 'int getSol::findInd()':
horses.cpp:165:8: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
165 | if (currProd > 1e9) break;
| ^~~~~~~~
horses.cpp: In constructor 'getSol::getSol()':
horses.cpp:175:50: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
175 | sol = (tree2.query(1, 0, N-1, 0, ind) * Y[ind])%mod;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
0 ms |
300 KB |
Output is correct |
6 |
Incorrect |
0 ms |
300 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
296 KB |
Output is correct |
4 |
Correct |
0 ms |
212 KB |
Output is correct |
5 |
Correct |
0 ms |
212 KB |
Output is correct |
6 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1556 ms |
48344 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
0 ms |
296 KB |
Output is correct |
4 |
Correct |
0 ms |
212 KB |
Output is correct |
5 |
Correct |
0 ms |
212 KB |
Output is correct |
6 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
300 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |