#line 2 "nachia\\misc\\fastio.hpp" #include #include #include #include namespace nachia{ struct InputBufIterator{ private: static const unsigned int INPUT_BUF_SIZE = 1 << 17; unsigned int p = INPUT_BUF_SIZE; static char Q[INPUT_BUF_SIZE]; public: using MyType = InputBufIterator; char seekChar(){ if(p == INPUT_BUF_SIZE){ size_t len = fread(Q, 1, INPUT_BUF_SIZE, stdin); if(len != INPUT_BUF_SIZE) Q[len] = '\0'; p = 0; } return Q[p]; } void skipSpace(){ while(isspace(seekChar())) p++; } unsigned int nextUint(){ skipSpace(); unsigned int buf = 0; while(true){ char tmp = seekChar(); if('9' < tmp || tmp < '0') break; buf = buf * 10 + (tmp - '0'); p++; } return buf; } int nextInt(){ skipSpace(); if(seekChar() == '-'){ p++; return (int)(-nextUint()); } return (int)nextUint(); } unsigned long long nextUlong(){ skipSpace(); unsigned long long buf = 0; while(true){ char tmp = seekChar(); if('9' < tmp || tmp < '0') break; buf = buf * 10 + (tmp - '0'); p++; } return buf; } long long nextLong(){ skipSpace(); if(seekChar() == '-'){ p++; return (long long)(-nextUlong()); } return (long long)nextUlong(); } char nextChar(){ skipSpace(); char buf = seekChar(); p++; return buf; } std::string nextToken(){ skipSpace(); std::string buf; while(true){ char ch = seekChar(); if(isspace(ch) || ch == '\0') break; buf.push_back(ch); p++; } return buf; } MyType& operator>>(unsigned int& dest){ dest = nextUint(); return *this; } MyType& operator>>(int& dest){ dest = nextInt(); return *this; } MyType& operator>>(unsigned long& dest){ dest = nextUlong(); return *this; } MyType& operator>>(long& dest){ dest = nextLong(); return *this; } MyType& operator>>(unsigned long long& dest){ dest = nextUlong(); return *this; } MyType& operator>>(long long& dest){ dest = nextLong(); return *this; } MyType& operator>>(std::string& dest){ dest = nextToken(); return *this; } MyType& operator>>(char& dest){ dest = nextChar(); return *this; } }; struct FastOutputTable{ char LZ[1000][4] = {}; char NLZ[1000][4] = {}; constexpr FastOutputTable(){ using u32 = uint_fast32_t; for(u32 d=0; d<1000; d++){ LZ[d][0] = ('0' + d / 100 % 10); LZ[d][1] = ('0' + d / 10 % 10); LZ[d][2] = ('0' + d / 1 % 10); LZ[d][3] = '\0'; } for(u32 d=0; d<1000; d++){ u32 i = 0; if(d >= 100) NLZ[d][i++] = ('0' + d / 100 % 10); if(d >= 10) NLZ[d][i++] = ('0' + d / 10 % 10); if(d >= 1) NLZ[d][i++] = ('0' + d / 1 % 10); NLZ[d][i++] = '\0'; } } }; char InputBufIterator::Q[INPUT_BUF_SIZE]; struct OutputBufIterator{ private: using u32 = uint_fast32_t; using u64 = uint_fast64_t; using MyType = OutputBufIterator; static const unsigned int OUTPUT_BUF_SIZE = 1 << 17; static char Q[OUTPUT_BUF_SIZE]; static constexpr FastOutputTable TB = FastOutputTable(); u32 p = 0; static constexpr u32 POW10(int d){ return (d<=0) ? 1 : (POW10(d-1)*10); } static constexpr u64 POW10LL(int d){ return (d<=0) ? 1 : (POW10LL(d-1)*10); } template static void Fil(T& m, U& l, U x) noexcept { m = l/x; l -= m*x; } void next_dig9(u32 x){ u32 y; Fil(y, x, POW10(6)); nextCstr(TB.LZ[y]); Fil(y, x, POW10(3)); nextCstr(TB.LZ[y]); nextCstr(TB.LZ[x]); } public: void nextChar(char c){ Q[p++] = c; if(p == OUTPUT_BUF_SIZE){ fwrite(Q, p, 1, stdout); p = 0; } } void next_eoln(){ nextChar('\n'); } void nextCstr(const char* s){ while(*s) nextChar(*(s++)); } void nextU32(uint_fast32_t x){ u32 y = 0; if(x >= POW10(9)){ Fil(y, x, POW10(9)); nextCstr(TB.NLZ[y]); next_dig9(x); } else if(x >= POW10(6)){ Fil(y, x, POW10(6)); nextCstr(TB.NLZ[y]); Fil(y, x, POW10(3)); nextCstr(TB.LZ[y]); nextCstr(TB.LZ[x]); } else if(x >= POW10(3)){ Fil(y, x, POW10(3)); nextCstr(TB.NLZ[y]); nextCstr(TB.LZ[x]); } else if(x >= 1) nextCstr(TB.NLZ[x]); else nextChar('0'); } void nextI32(int_fast32_t x){ if(x >= 0) nextU32(x); else{ nextChar('-'); nextU32((u32)-x); } } void nextU64(uint_fast64_t x){ u32 y = 0; if(x >= POW10LL(18)){ Fil(y, x, POW10LL(18)); nextU32(y); Fil(y, x, POW10LL(9)); next_dig9(y); next_dig9(x); } else if(x >= POW10LL(9)){ Fil(y, x, POW10LL(9)); nextU32(y); next_dig9(x); } else nextU32(x); } void nextI64(long long x){ if(x >= 0) nextU64(x); else{ nextChar('-'); nextU64((u64)-x); } } void writeToFile(bool flush = false){ fwrite(Q, p, 1, stdout); if(flush) fflush(stdout); p = 0; } OutputBufIterator(){ Q[0] = 0; } ~OutputBufIterator(){ writeToFile(); } MyType& operator<<(unsigned int tg){ nextU32(tg); return *this; } MyType& operator<<(unsigned long tg){ nextU64(tg); return *this; } MyType& operator<<(unsigned long long tg){ nextU64(tg); return *this; } MyType& operator<<(int tg){ nextI32(tg); return *this; } MyType& operator<<(long tg){ nextI64(tg); return *this; } MyType& operator<<(long long tg){ nextI64(tg); return *this; } MyType& operator<<(const std::string& tg){ nextCstr(tg.c_str()); return *this; } MyType& operator<<(const char* tg){ nextCstr(tg); return *this; } MyType& operator<<(char tg){ nextChar(tg); return *this; } }; char OutputBufIterator::Q[OUTPUT_BUF_SIZE]; } // namespace nachia #line 2 "Main.cpp" #include #include #define rep(i,n) for(int i=0; i<(int)(n); i++) int main(){ nachia::InputBufIterator cin; nachia::OutputBufIterator cout; int N, M; cin >> N >> M; std::vector dp(M, 0); std::vector A(M, 0); rep(i,N){ rep(j,M) cin >> A[j]; rep(j,M) dp[j] += A[j]; long long mdp = *std::min_element(dp.begin(), dp.end()); rep(j,M) dp[j] = std::min(dp[j], mdp + A[j]); } long long ans = *std::min_element(dp.begin(), dp.end()); if(N == 1) ans = 0; cout << ans << '\n'; return 0; }