제출 #1197672

#제출 시각아이디문제언어결과실행 시간메모리
1197672cpdreamerHorses (IOI15_horses)C++20
17 / 100
1594 ms48808 KiB
#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 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...