제출 #999658

#제출 시각아이디문제언어결과실행 시간메모리
999658Alfraganus말 (IOI15_horses)C++17
54 / 100
1577 ms53964 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; const long long mod = 1e9 + 7; vector<long long> x, y; struct SegTree { int size = 1; vector<long long> pr; vector<int> mx; void init(){ while(size < (int)x.size()) size <<= 1; pr.resize(size << 1, 1); mx.resize(size << 1, 0); build(0, 0, size); } void build(int ind, int lx, int rx){ if(lx + 1 == rx){ if(lx < x.size()) pr[ind] = x[lx], mx[ind] = y[lx]; return; } int mid = (lx + rx) >> 1; build((ind << 1) + 1, lx, mid); build((ind << 1) + 2, mid, rx); pr[ind] = (pr[(ind << 1) + 1] * pr[(ind << 1) + 2]) % mod; mx[ind] = max(mx[(ind << 1) + 1], mx[(ind << 1) + 2]); } void change(int pos, int val, int x, int lx, int rx){ if(lx + 1 == rx){ pr[x] = val; return; } int mid = (lx + rx) >> 1; if(pos < mid) change(pos, val, (x << 1) + 1, lx, mid); else change(pos, val, (x << 1) + 2, mid, rx); pr[x] = (pr[(x << 1) + 1] * pr[(x << 1) + 2]) % mod; } void change(int pos, int val){ change(pos, val, 0, 0, size); } void set(int pos, int val, int x, int lx, int rx){ if(lx + 1 == rx){ mx[x] = val; return; } int mid = (lx + rx) >> 1; if(pos < mid) set(pos, val, (x << 1) + 1, lx, mid); else set(pos, val, (x << 1) + 2, mid, rx); mx[x] = max(mx[(x << 1) + 1], mx[(x << 1) + 2]); } void set(int pos, int val){ set(pos, val, 0, 0, size); } long long get(int l, int r, int ind, int lx, int rx){ if(l <= lx and rx <= r) return pr[ind]; if(r <= lx or rx <= l) return 1ll; int mid = (lx + rx) >> 1; return (get(l, r, (ind << 1) + 1, lx, mid) * get(l, r, (ind << 1) + 2, mid, rx)) % mod; } long long get(int l, int r){ return get(l, r, 0, 0, size); } int res(int l, int r, int x, int lx, int rx){ if(l <= lx and rx <= r) return mx[x]; if(r <= lx or rx <= l) return 0; int mid = (lx + rx) >> 1; return max(res(l, r, (x << 1) + 1, lx, mid), res(l, r, (x << 1) + 2, mid, rx)); } int res(int l, int r){ return res(l, r, 0, 0, size); } }; SegTree s; set<int> st; int init(int n, int X[], int Y[]) { x.resize(n); y.resize(n); for(int i = 0; i < n; i ++) x[i] = X[i], y[i] = Y[i]; st.insert(-1); for(int i = 0; i < n; i ++) if(x[i] != 1) st.insert(i); s.init(); auto cur = --st.end(), prev = cur; long long y1 = s.res(max(0, *cur), n), p = 1, ans = (s.res(max(0, *cur), n) * s.get(0, *cur + 1)) % mod; while(1){ if(prev == st.begin()) return ans; prev --; p = p * x[*cur]; if(p > (int)1e9 or y1 * p > (int)1e9) return ans; if(s.res(max(0, *prev), *cur + 1) > y1 * p){ y1 = s.res(max(0, *prev), *cur + 1); p = 1; ans = (y1 * s.get(0, *prev + 1)) % mod; } cur --; } return ans; } int updateX(int pos, int val) { if(x[pos] != -1) st.erase(pos); x[pos] = val; if(x[pos] != -1) st.insert(pos); s.change(pos, val); int n = (int)x.size(); auto cur = --st.end(), prev = cur; long long y1 = s.res(max(0, *cur), n), p = 1, ans = (s.res(max(0, *cur), n) * s.get(0, *cur + 1)) % mod; while(1){ if(prev == st.begin()) return ans; prev --; p = p * x[*cur]; if(p > (int)1e9 or y1 * p > (int)1e9) return ans; if(s.res(max(0, *prev), *cur + 1) > y1 * p){ y1 = s.res(max(0, *prev), *cur + 1); p = 1; ans = (y1 * s.get(0, *prev + 1)) % mod; } cur --; } return ans; } int updateY(int pos, int val) { y[pos] = val; s.set(pos, val); int n = (int)x.size(); auto cur = --st.end(), prev = cur; long long y1 = s.res(max(0, *cur), n), p = 1, ans = (s.res(max(0, *cur), n) * s.get(0, *cur + 1)) % mod; while(1){ if(prev == st.begin()) return ans; prev --; p = p * x[*cur]; if(p > (int)1e9 or y1 * p > (int)1e9) return ans; if(s.res(max(0, *prev), *cur + 1) > y1 * p){ y1 = s.res(max(0, *prev), *cur + 1); p = 1; ans = (y1 * s.get(0, *prev + 1)) % mod; } cur --; } return ans; }

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

horses.cpp: In member function 'void SegTree::build(int, int, int)':
horses.cpp:24:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |    if(lx < x.size())
      |       ~~~^~~~~~~~~~
horses.cpp:25:36: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} may change value [-Wconversion]
   25 |     pr[ind] = x[lx], mx[ind] = y[lx];
      |                                    ^
horses.cpp: In member function 'void SegTree::change(int, int, int, int, int)':
horses.cpp:35:36: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   35 |  void change(int pos, int val, int x, int lx, int rx){
      |                                ~~~~^
horses.cpp:6:19: note: shadowed declaration is here
    6 | vector<long long> x, y;
      |                   ^
horses.cpp: In member function 'void SegTree::set(int, int, int, int, int)':
horses.cpp:52:33: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   52 |  void set(int pos, int val, int x, int lx, int rx){
      |                             ~~~~^
horses.cpp:6:19: note: shadowed declaration is here
    6 | vector<long long> x, y;
      |                   ^
horses.cpp: In member function 'int SegTree::res(int, int, int, int, int)':
horses.cpp:82:28: warning: declaration of 'x' shadows a global declaration [-Wshadow]
   82 |  int res(int l, int r, int x, int lx, int rx){
      |                        ~~~~^
horses.cpp:6:19: note: shadowed declaration is here
    6 | vector<long long> x, y;
      |                   ^
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:113:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  113 |    return ans;
      |           ^~~
horses.cpp:117:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  117 |    return ans;
      |           ^~~
horses.cpp:125:9: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  125 |  return ans;
      |         ^~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:140:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  140 |    return ans;
      |           ^~~
horses.cpp:144:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  144 |    return ans;
      |           ^~~
horses.cpp:152:9: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  152 |  return ans;
      |         ^~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:163:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  163 |    return ans;
      |           ^~~
horses.cpp:167:11: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  167 |    return ans;
      |           ^~~
horses.cpp:175:9: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
  175 |  return ans;
      |         ^~~
#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...