Submission #587503

#TimeUsernameProblemLanguageResultExecution timeMemory
587503benson1029Horses (IOI15_horses)C++14
54 / 100
333 ms66016 KiB
#include "horses.h" #include<bits/stdc++.h> using namespace std; long long mod = 1e9+7; double seglog[2000005]; long long segmul[2000005]; double lzylog[2000005]; long long lzymul[2000005]; int n; long long x[500005], y[500005]; long long fpw(long long n, long long p) { if(p==0) return 1LL; long long t = fpw(n, p/2); t = (t*t) % mod; if(p%2) t = (t*n) % mod; return t; } long long inv(long long n) { return fpw(n, mod-2); } void push(int x) { seglog[x*2] += lzylog[x]; seglog[x*2+1] += lzylog[x]; lzylog[x*2] += lzylog[x]; lzylog[x*2+1] += lzylog[x]; lzylog[x] = 0; segmul[x*2] = (segmul[x*2] * lzymul[x]) % mod; segmul[x*2+1] = (segmul[x*2+1] * lzymul[x]) % mod; lzymul[x*2] = (lzymul[x*2] * lzymul[x]) % mod; lzymul[x*2+1] = (lzymul[x*2+1] * lzymul[x]) % mod; lzymul[x] = 1; } void seg_set(int x, int l, int r, int pos, int val, double LOG) { if(l==r) { segmul[x] = val; seglog[x] = LOG; } else { if(pos <= (l+r)/2) seg_set(x*2, l, (l+r)/2, pos, val, LOG); else seg_set(x*2+1, (l+r)/2+1, r, pos, val, LOG); if(seglog[x*2] > seglog[x*2+1]) { seglog[x] = seglog[x*2]; segmul[x] = segmul[x*2]; } else { seglog[x] = seglog[x*2+1]; segmul[x] = segmul[x*2+1]; } } } void seg_upd(int x, int l, int r, int ll, int rr, long long val, double LOG) { if(l!=r) push(x); if(ll <= l && r <= rr) { seglog[x] += LOG; segmul[x] = (segmul[x] * val) % mod; lzylog[x] += LOG; lzymul[x] = (lzymul[x] * val) % mod; } else if(l > rr || r < ll) { } else { seg_upd(x*2, l, (l+r)/2, ll, rr, val, LOG); seg_upd(x*2+1, (l+r)/2+1, r, ll, rr, val, LOG); if(seglog[x*2] > seglog[x*2+1]) { seglog[x] = seglog[x*2]; segmul[x] = segmul[x*2]; } else { seglog[x] = seglog[x*2+1]; segmul[x] = segmul[x*2+1]; } } } int init(int N, int X[], int Y[]) { n = N; for(int i=0; i<4*n; i++) lzymul[i] = 1; double logc = 0; long long mulc = 1; for(int i=0; i<N; i++) { x[i] = X[i]; y[i] = Y[i]; mulc = (mulc * X[i]) % mod; logc += log(X[i]); seg_set(1, 0, n-1, i, (mulc * Y[i]) % mod, logc + log(Y[i])); } return segmul[1]; } int updateX(int pos, int val) { long long v = (inv(x[pos]) * val) % mod; double t = log(val) - log(x[pos]); seg_upd(1, 0, n-1, pos, n-1, v, t); x[pos] = val; return segmul[1]; } int updateY(int pos, int val) { long long v = (inv(y[pos]) * val) % mod; double t = log(val) - log(y[pos]); seg_upd(1, 0, n-1, pos, pos, v, t); y[pos] = val; return segmul[1]; }

Compilation message (stderr)

horses.cpp: In function 'long long int fpw(long long int, long long int)':
horses.cpp:13:25: warning: declaration of 'n' shadows a global declaration [-Wshadow]
   13 | long long fpw(long long n, long long p) {
      |               ~~~~~~~~~~^
horses.cpp:10:5: note: shadowed declaration is here
   10 | int n;
      |     ^
horses.cpp: In function 'long long int inv(long long int)':
horses.cpp:21:25: warning: declaration of 'n' shadows a global declaration [-Wshadow]
   21 | long long inv(long long n) {
      |               ~~~~~~~~~~^
horses.cpp:10:5: note: shadowed declaration is here
   10 | int n;
      |     ^
horses.cpp: In function 'void push(int)':
horses.cpp:25:15: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   25 | void push(int x) {
      |           ~~~~^
horses.cpp:11:11: note: shadowed declaration is here
   11 | long long x[500005], y[500005];
      |           ^
horses.cpp: In function 'void seg_set(int, int, int, int, int, double)':
horses.cpp:38:18: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   38 | void seg_set(int x, int l, int r, int pos, int val, double LOG) {
      |              ~~~~^
horses.cpp:11:11: note: shadowed declaration is here
   11 | long long x[500005], y[500005];
      |           ^
horses.cpp: In function 'void seg_upd(int, int, int, int, int, long long int, double)':
horses.cpp:55:18: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   55 | void seg_upd(int x, int l, int r, int ll, int rr, long long val, double LOG) {
      |              ~~~~^
horses.cpp:11:11: note: shadowed declaration is here
   11 | long long x[500005], y[500005];
      |           ^
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:85:39: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   85 |   seg_set(1, 0, n-1, i, (mulc * Y[i]) % mod, logc + log(Y[i]));
      |                         ~~~~~~~~~~~~~~^~~~~
horses.cpp:87:17: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   87 |  return segmul[1];
      |         ~~~~~~~~^
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:95:17: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   95 |  return segmul[1];
      |         ~~~~~~~~^
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:103:17: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  103 |  return segmul[1];
      |         ~~~~~~~~^
#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...