제출 #288477

#제출 시각아이디문제언어결과실행 시간메모리
288477amoo_safar말 (IOI15_horses)C++17
100 / 100
935 ms49144 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 10; const int MX = 1e9 + 1; const int Mod = 1e9 + 7; ll mul(ll a, ll b){ return (a * b) % Mod; } ll bin_pow(ll b, ll p){ ll res = 1; for(ll j = 1, pw = b; j <= p; j <<= 1, pw = mul(pw, pw)) if(j & p) res = mul(res, pw); return res; } ll inv(ll x){ return bin_pow(x, Mod - 2); } int n; set<int> Big; ll dp[N]; ll X[N], Y[N]; ll fen[N]; void Add(ll idx, ll x){ idx += 2; for(; idx < N; idx += (idx & (-idx))) fen[idx] = mul(fen[idx], x); } ll Get(ll idx){ if(idx < 0) return 1; idx += 2; ll res = 1; for(; idx; idx -= (idx & (-idx))) res = mul(res, fen[idx]); return res; } ll seg[N << 2]; void Change(int id, int idx, ll x, int L = 0, int R = N){ if(L + 1 == R){ seg[id] = x; return ; } int mid = (L + R) >> 1; if(idx < mid) Change(id << 1, idx, x, L, mid); else Change(id << 1 | 1, idx, x, mid, R); seg[id] = max(seg[id << 1], seg[id << 1 | 1]); } ll Max(int id, int l, int r, int L = 0, int R = N){ if(r <= L || R <= l) return 0; if(l <= L && R <= r) return seg[id]; int mid = (L + R) >> 1; return max(Max(id << 1, l, r, L, mid), Max(id << 1 | 1, l, r, mid, R)); } ll Calc(){ dp[n] = 0; Big.insert(0); int pos, la = n; for(auto it = Big.rbegin(); it != Big.rend(); it ++){ pos = *it; //for(int pos = n - 1; pos >= 0; pos --){ dp[pos] = X[pos] * max(Max(1, pos, la), dp[la]); //dp[pos] = X[pos] * max(Y[pos], dp[la]); //assert((X[pos] > 1 || pos == 0)); if(dp[pos] >= MX) return mul(dp[pos] % Mod, Get(pos - 1)); la = pos; } return dp[0] % Mod; } int init(int _n, int _X[], int _Y[]) { fill(fen, fen + N, 1); Big.clear(); n = _n; for(int i = 0; i < n; i++){ X[i] = _X[i]; Y[i] = _Y[i]; Change(1, i, Y[i]); Add(i, X[i]); if(X[i] > 1) Big.insert(i); } return Calc(); } int updateX(int pos, int val) { Big.erase(pos); Add(pos, mul(inv(X[pos]), val) ); X[pos] = val; if(val > 1) Big.insert(pos); return Calc(); } int updateY(int pos, int val) { Y[pos] = val; Change(1, pos, val); return Calc(); }

컴파일 시 표준 에러 (stderr) 메시지

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:101:13: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  101 |  return Calc();
      |         ~~~~^~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:110:13: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  110 |  return Calc();
      |         ~~~~^~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:116:13: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  116 |  return Calc();
      |         ~~~~^~
#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...