제출 #60115

#제출 시각아이디문제언어결과실행 시간메모리
60115Flugan42말 (IOI15_horses)C++14
17 / 100
290 ms173920 KiB
//#include "horses.h" #include <bits/stdc++.h> #include <stdio.h> #include <stdlib.h> using namespace std; typedef long long ll; typedef long double Ld; typedef vector<ll> vi; typedef pair<ll,ll> ii; typedef vector<ii> vii; #define rep(i,a,b) for(ll i = a; i < b; i++) #define per(i,a,b) for(ll i = a; i >= b; i--) #define all(x) x.begin(),x.end() #define inf 1000000000000000000 #define sz(x) (ll)(x).size() const ll mod = 1000000007; ll pw(ll a, ll x){ if (x == 0) return 1; if (x == 1) return a%mod; ll temp = pw(a,x/2); if (x%2) return (((temp*temp)%mod)*a)%mod; else return ((temp*temp)%mod); } class segT { private: vector<pair<Ld,ll> > tree; vector<Ld> lazy; vector<Ld> a; ll n; ll left(ll v) { return 2*v; } ll right(ll v) { return 2*v+1; } void build(ll v, ll l, ll r){ if (l == r) tree[v] = make_pair(a[l],l); else { build(left(v),l,(l+r)/2); build(right(v),(l+r)/2+1,r); if (tree[left(v)].first > tree[right(v)].first) tree[v] = tree[left(v)]; else tree[v] = tree[right(v)]; } } pair<Ld,ll> rmq(ll v, ll l, ll r, ll i, ll j){ if (lazy[v] != 0.0){ tree[v].first += lazy[v]; lazy[left(v)] += lazy[v]; lazy[right(v)] += lazy[v]; lazy[v] = 0.0; } if (l > j || r < i) return make_pair(-1,-1); if (i <= l && r <= j) return tree[v]; else { pair<Ld,ll> p1 = rmq(left(v),l,(l+r)/2,i,j); pair<Ld,ll> p2 = rmq(right(v),(l+r)/2+1,r,i,j); if (p1.first == -1 && p2.first == -1) return make_pair(-1,-1); if (p1.first == -1) return p2; if (p2.first == -1) return p1; if (p1.first > p2.first) return p1; else return p2; } } void rangeadd(ll v, ll l, ll r, ll i, ll j, Ld val){ if (l > j || r < i) return; if (i <= l && r <= j) { tree[v].first += val; lazy[left(v)] += val; lazy[right(v)] += val; } else { rangeadd(left(v), l, (l+r)/2, i, j, val); rangeadd(right(v), (l+r)/2+1, r, i, j, val); if (tree[left(v)].first > tree[right(v)].first) tree[v] = tree[left(v)]; else tree[v] = tree[right(v)]; } } public: void build(vector<Ld> &_a){ a = _a; n = sz(_a); tree.assign(4*n+10,make_pair(0.0,0)); lazy.assign(8*n+10,0.0); build(1,0,n-1); } pair<Ld,ll> rmq(ll i, ll j) { return rmq(1,0,n-1,i,j); } void rangeadd(ll i, ll j, Ld val) { rangeadd(1,0,n-1,i,j,val); } } ; class segTp { private: vi tree,a; ll n; ll left(ll v) { return 2*v; } ll right(ll v) { return 2*v+1; } void build(ll v, ll l, ll r){ if (l == r) tree[v] = a[l]; else { build(left(v),l,(l+r)/2); build(right(v),(l+r)/2+1,r); tree[v] = (tree[left(v)]*tree[right(v)])%mod; } } ll rmq(ll v, ll l, ll r, ll i, ll j){ if (l > j || r < i) return -1; if (i <= l && r <= j) return tree[v]; else { ll p1 = rmq(left(v),l,(l+r)/2,i,j); ll p2 = rmq(right(v),(l+r)/2+1,r,i,j); if (p1 == -1 && p2 == -1) return -1; if (p1 == -1) return p2; if (p2 == -1) return p1; return (p1*p2)%mod; } } void rangeprod(ll v, ll l, ll r, ll i, ll val){ if (l > i || r < i) return; if (l == r && i == l) tree[v] = val%mod; else { rangeprod(left(v), l, (l+r)/2, i, val); rangeprod(right(v), (l+r)/2+1, r, i, val); tree[v] = (tree[left(v)]*tree[right(v)])%mod; } } public: void build(vi &_a){ a = _a; n = sz(_a); tree.assign(4*n+10,0); build(1,0,n-1); } ll rmq(ll i, ll j) { return rmq(1,0,n-1,i,j); } void rangeprod(ll i, ll val) { rangeprod(1,0,n-1,i,val); } } ; vi YY,XX; vector<Ld> lnsum; pair<Ld,ll> res; segT myT; segTp pT; ll NN; int init(int N, int X[], int Y[]) { lnsum.assign(N,0.0); lnsum[0] = log(Ld(X[0])); rep(i,0,N) YY.push_back(ll(Y[i])); rep(i,0,N) XX.push_back(ll(X[i])); rep(i,1,N){ lnsum[i] = lnsum[i-1]+log(X[i]); } rep(i,0,N){ lnsum[i] += log(Y[i]); } /* rep(i,0,N){ cout << XX[i] << " "; } cout << endl; rep(i,0,N){ cout << lnsum[i] << " "; } cout << endl; */ myT.build(lnsum); pT.build(XX); res = myT.rmq(0,N-1); //cout << res.first << " " << res.second << endl; NN = N; return int((pT.rmq(0,res.second)*YY[res.second])%mod); } int updateX(int pos, int val) { //cout << "update" << endl; myT.rangeadd(0,pos,log(val)-log(XX[pos])); pT.rangeprod(pos,val); res = myT.rmq(0,NN-1); //cout << res.first << " " << res.second << endl; return int((pT.rmq(0,res.second)*YY[res.second])%mod); } int updateY(int pos, int val) { //cout << "updateY" << endl; myT.rangeadd(pos,pos,log(val)-log(YY[pos])); res = myT.rmq(0,NN-1); return int((pT.rmq(0,res.second)*YY[res.second])%mod); } /* static char _buffer[1024]; static int _currentChar = 0; static int _charsNumber = 0; static FILE *_inputFile, *_outputFile; static inline int _read() { if (_charsNumber < 0) { exit(1); } if (!_charsNumber || _currentChar == _charsNumber) { _charsNumber = (int)fread(_buffer, sizeof(_buffer[0]), sizeof(_buffer), _inputFile); _currentChar = 0; } if (_charsNumber <= 0) { return -1; } return _buffer[_currentChar++]; } static inline int _readInt() { int c, x, s; c = _read(); while (c <= 32) c = _read(); x = 0; s = 1; if (c == '-') { s = -1; c = _read(); } while (c > 32) { x *= 10; x += c - '0'; c = _read(); } if (s < 0) x = -x; return x; } int main() { _inputFile = fopen("horses.in", "rb"); _outputFile = fopen("horses.out", "w"); int N; N = _readInt(); int *X = (int*)malloc(sizeof(int)*(unsigned int)N); int *Y = (int*)malloc(sizeof(int)*(unsigned int)N); for (int i = 0; i < N; i++) { X[i] = _readInt(); } for (int i = 0; i < N; i++) { Y[i] = _readInt(); } fprintf(_outputFile,"%d\n",init(N,X,Y)); int M; M = _readInt(); for (int i = 0; i < M; i++) { int type; type = _readInt(); int pos; pos = _readInt(); int val; val = _readInt(); if (type == 1) { fprintf(_outputFile,"%d\n",updateX(pos,val)); } else if (type == 2) { fprintf(_outputFile,"%d\n",updateY(pos,val)); } } return 0; } */
#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...