結果
問題 | No.742 にゃんにゃんにゃん 猫の挨拶 |
ユーザー | ciel |
提出日時 | 2018-10-07 11:09:49 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 7 ms / 2,500 ms |
コード長 | 1,310 bytes |
コンパイル時間 | 236 ms |
コンパイル使用メモリ | 39,808 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-12 14:09:48 |
合計ジャッジ時間 | 794 ms |
ジャッジサーバーID (参考情報) |
judge / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 0 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 1 ms
5,248 KB |
testcase_03 | AC | 1 ms
5,248 KB |
testcase_04 | AC | 0 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 1 ms
5,248 KB |
testcase_07 | AC | 1 ms
5,248 KB |
testcase_08 | AC | 1 ms
5,248 KB |
testcase_09 | AC | 1 ms
5,248 KB |
testcase_10 | AC | 1 ms
5,248 KB |
testcase_11 | AC | 7 ms
5,248 KB |
testcase_12 | AC | 5 ms
5,248 KB |
testcase_13 | AC | 1 ms
5,248 KB |
testcase_14 | AC | 1 ms
5,248 KB |
testcase_15 | AC | 1 ms
5,248 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:34:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 34 | scanf("%d",&N);for(i=0;i<N;i++)scanf("%d",A+i);printf("%lld\n",merge_and_count(0,N)); | ~~~~~^~~~~~~~~ main.cpp:34:45: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 34 | scanf("%d",&N);for(i=0;i<N;i++)scanf("%d",A+i);printf("%lld\n",merge_and_count(0,N)); | ~~~~~^~~~~~~~~~
ソースコード
#include <cstdio> #include <vector> #include <algorithm> #include <numeric> int A[999999], W[999999]; long long merge_and_count(int l, int r) { // range [l,r) if (l+1 >= r) return 0; // empty if (l+2 == r) { // [l,r) == [l,l+1] 要素2つだけ if (A[l] <= A[l+1]) return 0; // 逆転はなし std::swap(A[l], A[l+1]); return 1; // 逆転一つ } int m = (l+r)/2; // [l,r) == [l,m) + [m,r) long long cl = merge_and_count(l, m); // 左半分を再帰的に数える long long cr = merge_and_count(m, r); // 右半分を再帰的に数える long long c = 0; // 左と右を混ぜるときの逆転数 int i=l, j=m; // iは[l,m)を動き, jは[m,r)を動いて、 int k=l; // 小さいものから W[k] に書き込む while (i<m && j<r) { // A[i]とA[j]を比べながら進む if (A[i] <= A[j]) W[k++] = A[i++]; // 左半分の方が小さく逆転なし else { W[k++] = A[j++]; c += m-i; // 左半分の方が大きい、左半分で未処理の要素だけ飛び越える } } while (i<m) W[k++] = A[i++]; // 左半分が余った場合 while (j<r) W[k++] = A[j++]; // 右半分が余った場合 //assert(k == r); std::copy(W+l, W+r, A+l); return cl + cr + c; } int main(){ int T,i,N; scanf("%d",&N);for(i=0;i<N;i++)scanf("%d",A+i);printf("%lld\n",merge_and_count(0,N)); }