# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
247678 | super_j6 | 말 (IOI15_horses) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "horses.h"
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define endl '\n'
#define ll long long
#define ld long double
#define pi pair<int, int>
#define f first
#define s second
#define vi vector<int>
const int mod = 1000000007;
struct mint{
int x;
ld y;
mint(int x = 0) : x(x), y(x) {}
mint(int x, ld y) : x(x), y(y) {}
explicit operator int() const{ return x;}
friend mint operator+(mint a, mint b){
return mint((a.x + b.x) % mod, a.y + b.y);
}
friend mint operator*(mint a, mint b){
return mint((ll)a.x * b.x % mod, a.y * b.y);
}
friend bool operator<(mint a, mint b){
return a.y < b.y;
}
};
struct segTree{
int l, r;
segTree *left, *right;
mint val[2];
segTree(int a, int b){
l = a, r = b;
if(l != r){
int mid = (l + r) / 2;
left = new segTree(l, mid);
right = new segTree(mid + 1, r);
}
}
void add(int x, mint v, int t){
if(x < l || r < x) return;
if(l == r){
val[t] = v * (t ? val[0] : 1);
return;
}
left->add(x, v, t);
right->add(x, v, t);
val[0] = left->val[0] * right->val[0];
val[1] = max(left->val[1], left->val[0] * right->val[1]);
}
} *tre;
int sol(){
return (int)tre->val[1];
}
int init(int n, vi x, vi y){
tre = new segTree(0, n - 1);
for(int i = 0; i < n; i++){
tre->add(i, x[i], 0);
tre->add(i, y[i], 1);
}
return sol();
}
int updateX(int a, int b){
tre->add(a, b, 0);
return sol();
}
int updateY(int a, int b){
tre->add(a, b, 1);
return sol();
}
/*
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n, q;
vi x, y;
cin >> n;
x.resize(n), y.resize(n);
for(int &i : x) cin >> i;
for(int &i : y) cin >> i;
cout << init(n, x, y) << endl;
cin >> q;
while(q--){
int t, a, b;
cin >> t >> a >> b;
cout << (!t ? updateX(a, b) : updateY(a, b)) << endl;
}
return 0;
}
*/