#include //#include #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") using namespace std; //using namespace atcoder; typedef long long ll; typedef unsigned long long ull; #define rep(i,N) for(int i=0;i<(N);++i) #define rrep(i,N) for(int i=(N)-1;i>=0;--i) #define all(A) A.begin(),A.end() using vvi = vector>; using P = pair; templatebool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; } templatebool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; } template void YesNo(T flg){ cout << (flg? "Yes\n" : "No\n"); } //時間管理 const double TimeLimit=1780; std::chrono::system_clock::time_point start; std::chrono::system_clock::time_point finish; inline void TimerStart(){ start=finish=chrono::system_clock::now(); } inline void TimerUpdate(){ finish=chrono::system_clock::now(); } double TimeDist(){ return chrono::duration_cast(finish-start).count(); } random_device rnd; mt19937 mt(rnd()); default_random_engine eng(rnd()); int NextInt(int minval,int maxval) { uniform_int_distribution distr(minval,maxval); return distr(mt); } vector>> cross; const ll Mod=1e8; namespace Input{ int N; vector> A; void Init(){ cin >> N; A.resize(N); rep(i,N){ rep(j,i+1){ ll a;cin >> a; A[i].push_back(a); } } cross.resize(N,vector>(N,vector(N,0))); rep(i,N){ cross[i][N-1][i]=1; rrep(j,N){ rep(k,j+1){ cross[i][j][k]%=Mod; if(k> pyramid; vector> dist; vector> score; ll maxScore; P maxPos; void Init(){ N=Input::N; maxScore=0; pyramid.resize(N,vector(N,0)); dist.resize(N,vector(N,0)); score.resize(N,vector(N,0)); rep(i,N){ pyramid[N-1][i]=Input::A[N-1][i]; } for(int i=N-1;i>0;--i){ rep(j,i+1){ if(jN-1){ // if(pyramid[x+1][y]<=0 && pyramid[x+1][y+1]<=0){ // ll // } // } // auto [x,y]=pos; // pyramid[x][y]+=val; // if(pyramid[i][j]<0){ // pyramid[i][j]=Mod-abs(pyramid[i][j]%Mod); // } // pyramid[i][j]%=Mod; // ScoreUpdate(x,y); // return subValue; // } void ScoreUpdate(const int& x,const int& y){ score[x][y]=GetScore(x,y); } ll GetScore(const int& x,const int& y){ ll d=Input::A[x][y]-pyramid[x][y]; dist[x][y]=d; d=abs(d); return min(d,Mod-d); } }; struct Solver{ int N; Pyramid pyramid; ll bestScore; vector bestAns; void Init(){ N=Input::N; pyramid.Init(); bestScore=pyramid.maxScore; bestAns=pyramid.pyramid[N-1]; } void Solve(){ TimerStart(); while(TimeDist()