제출 #609862

#제출 시각아이디문제언어결과실행 시간메모리
609862jairRS말 (IOI15_horses)C++17
34 / 100
20 ms8404 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 1000; const ll MOD = 1000000000LL + 7LL; ll gN, gX[MAXN], gY[MAXN]; struct bignum{ ll val = 0; bool overMOD = false; bignum(ll _val){ overMOD = _val/MOD > 0; val = _val % MOD; } void scale(ll x){ bignum newBignum = bignum(val * x); overMOD |= newBignum.overMOD; val = newBignum.val; } bignum operator*(const bignum &a) const { bignum res(val*a.val); res.overMOD |= overMOD | a.overMOD; return res; } }; struct node{ ll soldY = 0; bignum XBlue = bignum(1); bignum XRed = bignum(1); }; //1-based struct segmentTree{ vector<node> tree; int treeSize, power2 = 1; segmentTree(int size){ while(power2 < size) power2 *= 2; treeSize = 2*power2 - 1; tree = vector<node>(treeSize + 1); } node merge(const node &a, const node &b){ if(b.soldY == 0) return a; bignum XProduct = a.XRed * b.XBlue; XProduct.scale(b.soldY); node res = a; if(!XProduct.overMOD && a.soldY > XProduct.val){ res = a; res.XRed = a.XRed * b.XBlue * b.XRed; } else { res = b; res.XBlue = a.XRed * b.XBlue * a.XBlue; } return res; } //i is 1-based void update(int i){ int in = i + treeSize/2; tree[in].soldY = gY[i - 1]; tree[in].XBlue = gX[i - 1]; in /= 2; while(in > 0){ tree[in] = merge(tree[in*2], tree[in*2 + 1]); in /= 2; } } node query(int ql, int qr){ return query(1, power2, ql, qr); } node query(int l, int r, int ql, int qr, int i = 1){ if(l > qr || r < ql) return node(); if(ql <= l && r <= qr) return tree[i]; int mid = (l + r)/2; node q1 = query(l, mid, ql, qr, i*2); node q2 = query(mid + 1, r, ql, qr, i*2 + 1); return merge(q1, q2); } }; segmentTree segTree(1); int getAns(){ node ans = segTree.query(1, gN); ans.XBlue.scale(ans.soldY); return ans.XBlue.val; } int init(int N, int X[], int Y[]) { gN = N; for (int i = 0; i < N; i++) { gX[i] = X[i]; gY[i] = Y[i]; } segTree = segmentTree(N); for (int i = 0; i < N; i++) segTree.update(i + 1); /* for (int i = 1; i <= 7; i++) { node cur = segTree.tree[i]; cerr << i << ": " << cur.soldY << " " << cur.XBlue.val << " " << cur.XRed.val << endl; } */ return getAns(); } int updateX(int pos, int val) { gX[pos] = val; segTree.update(pos + 1); return getAns(); } int updateY(int pos, int val) { gY[pos] = val; segTree.update(pos + 1); return getAns(); }

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

horses.cpp: In function 'int getAns()':
horses.cpp:97:30: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   97 |  node ans = segTree.query(1, gN);
      |                              ^~
horses.cpp:99:19: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   99 |  return ans.XBlue.val;
      |         ~~~~~~~~~~^~~
#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...