#include "horses.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define V vector
using namespace std;
typedef long long ll;
#define all(v) v.begin(), v.end()
#define P pair
#define F first
#define S second
const ll MOD=(ll)1e9+7;
void file() {
freopen("input.txt.txt", "r", stdin);
freopen("output.txt.txt", "w", stdout);
}
struct segtree {
private:
struct node {
double ans;
double sum;
int id;
};
node single(P<P<double,double>,int>p) {
return {p.F.F+p.F.S,p.F.F,p.S};
}
node neutral={0,0,-1};
node merge(node a,node b) {
if (a.id==-1)return b;
if (b.id==-1)return a;
node c;
c.sum=a.sum+b.sum;
if (a.ans>a.sum+b.ans) {
c.ans=a.ans;
c.id=a.id;
}
else {
c.ans=b.ans+a.sum;
c.id=b.id;
}
return c;
}
public:
int size;
V<node>query;
void init(int n) {
size=1;
while (size<n)size*=2;
query.assign(2*size,neutral);
}
void build(V<P<double,double>>&a,int x,int lx,int rx) {
if (rx-lx==1) {
if (lx<a.size()) {
query[x]=single({a[lx],lx});
}
return;
}
int m=(lx+rx)/2;
build(a,2*x+1,lx,m);
build(a,2*x+2,m,rx);
query[x]=merge(query[2*x+1],query[2*x+2]);
}
void build(V<P<double,double>>&a) {
build(a,0,0,size);
}
void set(int i,P<double,double>v,int x,int lx,int rx) {
if (rx-lx==1) {
query[x]=single({v,lx});
return;
}
int m=(lx+rx)/2;
if (i<m)
set(i,v,2*x+1,lx,m);
else
set(i,v,2*x+2,m,rx);
query[x]=merge(query[2*x+1],query[2*x+2]);
}
void set(int i,P<double,double>v) {
set(i,v,0,0,size);
}
};
int n;
segtree tree;
double A[(int)5e5+1],B[(int)5e5+1];
int a[(int)5e5+1],b[(int)5e5+1];
int f(int id) {
ll x=1;
for (int i=0;i<=id;i++) {
x*=(ll)a[i]%MOD;
x%=MOD;
}
x*=b[id];
x%=MOD;
return (int)x;
}
int init(int N, int X[], int Y[]) {
n=N;
for (int i=0;i<n;i++) {
a[i]=X[i];
b[i]=Y[i];
}
for (int i=0;i<n;i++) {
A[i]=log(X[i]);
B[i]=log(Y[i]);
}
tree.init(n);
V<P<double,double>>vp;
for (int i=0;i<n;i++) {
vp.pb({A[i],B[i]});
}
tree.build(vp);
return f(tree.query[0].id);
}
int updateX(int pos, int val) {
a[pos]=val;
A[pos]=log(a[pos]);
tree.set(pos,{A[pos],B[pos]});
return f(tree.query[0].id);
}
int updateY(int pos, int val) {
b[pos]=val;
B[pos]=log(a[pos]);
tree.set(pos,{A[pos],B[pos]});
return f(tree.query[0].id);
}
컴파일 시 표준 에러 (stderr) 메시지
horses.cpp: In function 'void file()':
horses.cpp:15:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
15 | freopen("input.txt.txt", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
horses.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
16 | freopen("output.txt.txt", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |