Submission #00131
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #pragma GCC optimize("Ofast") #include <bits/extc++.h> using namespace std; #define rep(i,n) for(int i=0;i<(n);++i) #define reps(i,n) for(int i=1;i<=(n);++i) #define all(x) begin(x), end(x) #define Fixed fixed << setprecision(12) #define int int_fast64_t using pii = pair< int , int >; constexpr int32_t INF = 0x3f3f3f3f; constexpr int_fast64_t LINF = 0x3f3f3f3f3f3f3f3fLL; constexpr int mod1 = 1e9+7; constexpr int mod2 = 998244353; template < class Func> class FixPoint : Func { public : explicit constexpr FixPoint(Func&& f) noexcept : Func(forward<Func>(f)) {} template < class ... Args> constexpr decltype(auto) operator()(Args&&... args) const { return Func::operator()(* this , std::forward<Args>(args)...); } }; template < class Func> static inline constexpr decltype(auto) makeFixPoint(Func&& f) noexcept { return FixPoint<Func>{forward<Func>(f)}; } template < class A, class B> inline bool chmax(A &a, const B &b) { return b > a && (a = b, true ); } template < class A, class B> inline bool chmin(A &a, const B &b) { return b < a && (a = b, true ); } template < class T> using max_heap = priority_queue<T>; template < class T> using min_heap = priority_queue<T,vector<T>,greater<T> >; template < class A, class B> using umap = unordered_map<A,B>; template < class T> using Max_Heap = __gnu_pbds::priority_queue<T, less<T>, __gnu_pbds::rc_binomial_heap_tag>; template < class T> using Min_Heap = __gnu_pbds::priority_queue<T, greater<T>, __gnu_pbds::rc_binomial_heap_tag>; template < class T> using Set = __gnu_pbds::tree<T, __gnu_pbds::null_type, less<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>; template < class K, class V> using Umap = __gnu_pbds::gp_hash_table<K, V>; using Trie = __gnu_pbds::trie<string, __gnu_pbds::null_type, __gnu_pbds::trie_string_access_traits<>, __gnu_pbds::pat_trie_tag, __gnu_pbds::trie_prefix_search_node_update>; template < class T> inline void bye(T x) { cout << x << '\n' , exit (0); } inline int square( int a){ return a * a;} inline int updiv( int a, int b){ return (a + b - 1) / b; } constexpr int dx[] = {1,0,-1,0,1,1,-1,-1}; constexpr int dy[] = {0,-1,0,1,1,-1,-1,1}; signed main( void ){ cin.tie(nullptr); ios_base::sync_with_stdio( false ); cout.setf(ios_base::fixed); cout.precision(10); int n; while (cin >> n, n){ int sx, sy, gx, gy; cin >> sx >> sy >> gx >> gy; --sx, --sy, --gx, --gy; vector<vector< int > > matv(1e3 + 5, vector< int >(1e3 + 5)); vector<vector< int > > math(1e3 + 5, vector< int >(1e3 + 5)); vector<vector< int > > dp(1e3 + 5, vector< int >(1e3 + 5, LINF)); vector< int > x(n), y(n), r(n); for ( int i = 0; i < n; ++i){ cin >> x[i] >> y[i] >> r[i]; --x[i], --y[i]; } if (sy > gy){ for ( int i = 0; i < n; ++i){ y[i] = 1e3 - y[i] - 1; } sy = 1e3 - sy - 1; gy = 1e3 - gy - 1; } if (sx > gx){ for ( int i = 0; i < n; ++i){ x[i] = 1e3 - x[i] - 1; } sx = 1e3 - sx - 1; gx = 1e3 - gx - 1; } /* cout << sy << ' ' << gy << endl; cout << sx << ' ' << gx << endl; */ ++sy, ++sx, ++gy, ++gx; dp[sy][sx] = 0; for ( int i = 0; i < n; ++i){ ++x[i], ++y[i]; int lx = max< int >(0, x[i] - r[i]); int hx = min< int >(1e3 + 2, x[i] + r[i]); int ly = max< int >(0, y[i] - r[i]); int hy = min< int >(1e3 + 2, y[i] + r[i]); if (ly <= sy && sy <= hy && lx <= sx && sx <= hx){ ++dp[sy][sx]; } else { math[ly][lx]++; math[ly][hx + 1]--; matv[ly][lx]++; matv[hy + 1][lx]--; } } for ( int i = 0; i <= 1e3 + 2; ++i){ for ( int j = 1; j <= 1e3 + 2; ++j){ math[i][j] += math[i][j - 1]; } } for ( int j = 0; j <= 1e3 + 2; ++j){ for ( int i = 1; i <= 1e3 + 2; ++i){ matv[i][j] += matv[i - 1][j]; } } for ( int i = sy; i <= gy; ++i){ for ( int j = sx; j <= gx; ++j){ if (i == sy && j == sx) continue ; chmin(dp[i][j], dp[i - 1][j] + math[i][j]); chmin(dp[i][j], dp[i][j - 1] + matv[i][j]); } } cout << dp[gy][gx] << '\n' ; } return 0; } |
ステータス
項目 | データ |
---|---|
問題 | 0007 - 忍ぶべし |
ユーザー名 | ei1903 |
投稿日時 | 2021-03-30 14:23:42 |
言語 | C++17 |
状態 | Accepted |
得点 | 30 |
ソースコード長 | 4647 Byte |
最大実行時間 | 1036 ms |
最大メモリ使用量 | 26780 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 30 / 30 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
C1 | AC | 963 ms | 26756 KB |
1
|
C2 | AC | 964 ms | 26780 KB |
1
|
C3 | AC | 956 ms | 26596 KB |
1
|
C4 | AC | 1036 ms | 26596 KB |
1
|