結果
問題 | No.777 再帰的ケーキ |
ユーザー | yumakmc |
提出日時 | 2019-03-18 22:08:40 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 702 ms / 2,000 ms |
コード長 | 2,150 bytes |
コンパイル時間 | 1,594 ms |
コンパイル使用メモリ | 186,464 KB |
実行使用メモリ | 48,904 KB |
最終ジャッジ日時 | 2024-07-19 06:18:08 |
合計ジャッジ時間 | 7,317 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
7,424 KB |
testcase_01 | AC | 4 ms
7,424 KB |
testcase_02 | AC | 3 ms
7,296 KB |
testcase_03 | AC | 4 ms
7,296 KB |
testcase_04 | AC | 4 ms
7,296 KB |
testcase_05 | AC | 4 ms
7,296 KB |
testcase_06 | AC | 4 ms
7,296 KB |
testcase_07 | AC | 4 ms
7,296 KB |
testcase_08 | AC | 4 ms
7,296 KB |
testcase_09 | AC | 4 ms
7,296 KB |
testcase_10 | AC | 4 ms
7,296 KB |
testcase_11 | AC | 4 ms
7,296 KB |
testcase_12 | AC | 4 ms
7,296 KB |
testcase_13 | AC | 3 ms
7,296 KB |
testcase_14 | AC | 3 ms
7,296 KB |
testcase_15 | AC | 3 ms
7,296 KB |
testcase_16 | AC | 3 ms
7,168 KB |
testcase_17 | AC | 3 ms
7,296 KB |
testcase_18 | AC | 3 ms
7,296 KB |
testcase_19 | AC | 4 ms
7,424 KB |
testcase_20 | AC | 4 ms
7,296 KB |
testcase_21 | AC | 6 ms
7,680 KB |
testcase_22 | AC | 6 ms
7,680 KB |
testcase_23 | AC | 4 ms
7,296 KB |
testcase_24 | AC | 4 ms
7,424 KB |
testcase_25 | AC | 6 ms
7,808 KB |
testcase_26 | AC | 7 ms
7,808 KB |
testcase_27 | AC | 4 ms
7,296 KB |
testcase_28 | AC | 680 ms
48,772 KB |
testcase_29 | AC | 701 ms
48,776 KB |
testcase_30 | AC | 696 ms
48,780 KB |
testcase_31 | AC | 702 ms
48,780 KB |
testcase_32 | AC | 409 ms
48,904 KB |
testcase_33 | AC | 72 ms
15,568 KB |
testcase_34 | AC | 103 ms
18,516 KB |
testcase_35 | AC | 434 ms
30,036 KB |
testcase_36 | AC | 403 ms
48,780 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:86:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 86 | scanf("%d %d %lld",&a,&b,&c); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include "bits/stdc++.h" using namespace std; #pragma warning(disable:4996) #define Seg_Max_N (1<<18) using Value = long long int; const Value ini =0; struct segtree { int N; vector<Value>dat; segtree() {} segtree(int n) :dat(2 * Seg_Max_N) { N = 1; while (N < n) N *= 2; for (int i = 0; i < 2 * N - 1; i++) { dat[i] = ini; } } Value connect(const Value&l, const Value&r) { return max(l,r); } // update k th element void update(int k, Value a) { k += N - 1; dat[k] = a; while (k > 0) { k = (k - 1) / 2; const Value al(dat[k * 2 + 1]); const Value ar(dat[k * 2 + 2]); dat[k] = connect(al, ar); } } // min [a, b) Value query(int a, int b) { return query(a, b, 0, 0, N); } Value query(int a, int b, int k, int l, int r) { if (r <= a or b <= l) return ini; if (a <= l and r <= b) return dat[k]; const int m = (l + r) / 2; const Value al(query(a, b, k * 2 + 1, l, m)); const Value ar(query(a, b, k * 2 + 2, m, r)); return connect(al, ar); } }; struct cake { int a; int b; long long int c; }; bool operator<(const cake&l, const cake&r) { return l.a<r.a; } template<typename T> struct Compress { map<T, int>mp; map<int, T>revmp; Compress(vector<T>vs) { setmp(vs); } Compress() :mp(), revmp() { } void setmp(vector<T>vs) { sort(vs.begin(), vs.end()); vs.erase(unique(vs.begin(), vs.end()), vs.end()); for (int i = 0; i < static_cast<int>(vs.size()); ++i) { mp[vs[i]] = i; revmp[i] = vs[i]; } } }; int main() { int N;cin>>N; map<int,vector<cake>>mp; vector<int>bs{ 0 }; for (int i = 0; i < N; ++i) { int a,b; long long int c; scanf("%d %d %lld",&a,&b,&c); bs.push_back(b); mp[a].push_back(cake{ a,b,c }); } Compress<int> cb(bs); segtree seg(N+1); seg.update(0,0); for (auto m : mp) { vector<long long int>nums; for (auto c : m.second) { long long int num = seg.query(0, cb.mp[c.b]); nums.push_back(num); } int id = 0; for (auto c : m.second) { seg.update(cb.mp[c.b], max(seg.query(cb.mp[c.b], cb.mp[c.b] + 1), nums[id] + c.c)); id++; } } long long int answer=seg.query(0,N+1); cout<<answer<<endl; return 0; }