結果
| 問題 |
No.913 木の燃やし方
|
| コンテスト | |
| ユーザー |
latte0119
|
| 提出日時 | 2019-10-18 22:30:25 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 174 ms / 3,000 ms |
| コード長 | 3,206 bytes |
| コンパイル時間 | 2,138 ms |
| コンパイル使用メモリ | 166,768 KB |
| 実行使用メモリ | 11,520 KB |
| 最終ジャッジ日時 | 2024-06-25 17:35:09 |
| 合計ジャッジ時間 | 10,883 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:135:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
135 | scanf("%lld",&N);
| ~~~~~^~~~~~~~~~~
main.cpp:136:18: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
136 | rep(i,N)scanf("%lld",&A[i]);
| ~~~~~^~~~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second
typedef vector<int>vint;
typedef pair<int,int>pint;
typedef vector<pint>vpint;
template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}
template<class A,class B>
ostream& operator<<(ostream& ost,const pair<A,B>&p){
ost<<"{"<<p.first<<","<<p.second<<"}";
return ost;
}
template<class T>
ostream& operator<<(ostream& ost,const vector<T>&v){
ost<<"{";
for(int i=0;i<v.size();i++){
if(i)ost<<",";
ost<<v[i];
}
ost<<"}";
return ost;
}
template<typename I,bool isMin>
struct ConvexHullTrick{
#define a first
#define b second
using Line=pair<I,I>;
deque<Line>lines;
//l.a>=m.a>=r.a
inline bool notNecessary(const Line &l,const Line &m,const Line &r){
return (m.a-l.a)*(r.b-m.b)>=(m.b-l.b)*(r.a-m.a);
}
void addLine(I a,I b){
if(!isMin)a*=-1,b*=-1;
Line l(a,b);
if(lines.empty())lines.push_back(l);
else if(lines.front().a<=a){
if(lines.front().a==a){
if(lines.front().b<=b)return;
lines.pop_front();
}
while(lines.size()>=2&¬Necessary(l,lines[0],lines[1]))lines.pop_front();
lines.push_front(l);
}
else{
if(lines.back().a==a){
if(lines.back().b<=b)return;
lines.pop_back();
}
while(lines.size()>=2&¬Necessary(lines[lines.size()-2],lines[lines.size()-1],l))lines.pop_back();
lines.push_back(l);
}
}
inline I eval(const Line &l,I x){
return l.a*x+l.b;
}
I query(I x){
int lb=-1,ub=lines.size()-1;
while(ub-lb>1){
int mid=(ub+lb)/2;
if(eval(lines[mid],x)<=eval(lines[mid+1],x))ub=mid;
else lb=mid;
}
if(isMin)return eval(lines[ub],x);
return -eval(lines[ub],x);
}
I queryMonotoneInc(I x){
while(lines.size()>=2&&eval(lines[0],x)>=eval(lines[1],x))lines.pop_front();
if(isMin)return eval(lines[0],x);
return -eval(lines[0],x);
}
I queryMonotoneDec(I x){
while(lines.size()>=2&&eval(lines[lines.size()-1],x)>=eval(lines[lines.size()-2],x))lines.pop_back();
if(isMin)return eval(lines.back(),x);
return -eval(lines.back(),x);
}
#undef a
#undef b
};
int N;
int A[222222];
int S[222222];
int ans[222222];
void solve(int l,int r){
if(r-l<=1)return;
int m=(l+r)/2;
ConvexHullTrick<int,true>cht;
for(int i=l;i<=m;i++){
cht.addLine(-2*i,i*i-S[i]);
}
int uku=1001001001001001001ll;
for(int i=r-1;i>=m;i--){
int tmp=cht.queryMonotoneDec(i+1)+(i+1)*(i+1)+S[i+1];
chmin(uku,tmp);
chmin(ans[i],uku);
}
cht=ConvexHullTrick<int,true>();
for(int i=m;i<r;i++){
cht.addLine(-2*(i+1),(i+1)*(i+1)+S[i+1]);
}
uku=1001001001001001001ll;
for(int i=l;i<=m;i++){
int tmp=cht.queryMonotoneInc(i)+i*i-S[i];
chmin(uku,tmp);
chmin(ans[i],uku);
}
solve(l,m);
solve(m+1,r);
}
signed main(){
scanf("%lld",&N);
rep(i,N)scanf("%lld",&A[i]);
rep(i,N)S[i+1]=S[i]+A[i];
rep(i,N)ans[i]=1+A[i];
solve(0,N);
rep(i,N){
printf("%lld\n",ans[i]);
}
return 0;
}
latte0119