제출 #597118

#제출 시각아이디문제언어결과실행 시간메모리
597118Apiram말 (IOI15_horses)C++14
34 / 100
1596 ms27844 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; const int mod = 1e9 + 7; struct dataa{ long long v = 0; bool ok = 1; void add(long long val){ v = val; //sum += val *(right - left + 1); } }; long long S,T; struct Segment_Tree{ vector<dataa>tree; void build(long long node,long long left,long long right,vector<long long>&arr,long long n){ if (left == right){ tree[node].v = arr[left]; return ; } long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); build(node + 1,left,mid,arr,n); build(z,mid + 1,right,arr,n); tree[node] = combine(tree[node + 1],tree[z]); } void init(long long n,vector<long long>&arr){ tree.resize(2*n - 1); build(0,0,n-1,arr,n); } dataa combine(dataa left,dataa right){ dataa res; res.v = (left.v * right.v)%mod; res.ok = left.ok & right.ok; if (res.ok){ if (left.v * right.v > 1e9)res.ok = false; } return res; } dataa query(long long node,long long left,long long right,long long qleft,long long qright){ if (qright<left|| qleft > right)return {1,1}; if (qleft<=left && qright>=right){ return tree[node]; } long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); return combine(query(node + 1,left,mid,qleft,qright),query(z,mid + 1,right,qleft,qright)); } void update(long long node,long long left,long long right,long long uleft,long long uright,long long v){ if (left > uright || right < uleft) return; if (uleft <= left && right <=uright){ tree[node].add(v); return; } long long mid = (left + right)>>1; long long z = node + ((mid - left + 1)<<1); if (uleft<=mid){ update(node + 1,left,mid,uleft,uright,v); } if (uright > mid){ update(z,mid + 1,right,uleft,uright,v); } tree[node] = combine(tree[node + 1],tree[z]); } }; vector<long long>x,y; Segment_Tree st; int solve(){ int N = (int)x.size(); int ans = 0; long long maxxy = y[N - 1],index = N - 1; auto temp = st.query(0,0,N - 1,0,N - 1); ans = (temp.v * y[N - 1])%mod; for (int i = N - 2;i>=0;--i){ temp = st.query(0,0,N - 1,i + 1,index); bool ok = temp.ok; //cout<<temp<<" "<<Y[i - 1] / Y[index]<<" "<<i<<" "<<maxxy<<" "<<index<<'\n'; if (y[i] > maxxy && (ok && temp.v * y[index] <= y[i])){ maxxy = y[i]; index = i; temp = st.query(0,0,N - 1,0,i); ans = (temp.v * y[i])%mod; } } return ans; } int init(int N, int X[], int Y[]) { for (int i = 0;i<N;++i){ x.push_back(X[i]); y.push_back(Y[i]); } st.init(N,x); return solve(); } int updateX(int pos, int val) { st.update(0,0,(int)x.size()-1,pos,pos,val); return solve(); } int updateY(int pos, int val) { y[pos] = val; return solve(); }

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

horses.cpp: In member function 'dataa Segment_Tree::combine(dataa, dataa)':
horses.cpp:36:15: warning: conversion from 'long long int' to 'double' may change value [-Wconversion]
   36 |    if (left.v * right.v > 1e9)res.ok = false;
      |        ~~~~~~~^~~~~~~~~
horses.cpp: In function 'int solve()':
horses.cpp:74:27: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   74 |  ans = (temp.v * y[N - 1])%mod;
      |        ~~~~~~~~~~~~~~~~~~~^~~~
horses.cpp:83:25: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   83 |    ans = (temp.v * y[i])%mod;
      |          ~~~~~~~~~~~~~~~^~~~
#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...