結果
| 問題 |
No.121 傾向と対策:門松列(その2)
|
| コンテスト | |
| ユーザー |
mayoko_
|
| 提出日時 | 2015-01-09 17:17:07 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1,427 ms / 5,000 ms |
| コード長 | 2,736 bytes |
| コンパイル時間 | 736 ms |
| コンパイル使用メモリ | 81,356 KB |
| 実行使用メモリ | 34,644 KB |
| 最終ジャッジ日時 | 2024-06-28 18:33:00 |
| 合計ジャッジ時間 | 4,817 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 9 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:48:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
48 | scanf("%d", A+i);
| ~~~~~^~~~~~~~~~~
ソースコード
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define INF 1000000000
using namespace std;
typedef long long ll;
const int MAXN = 1000100;
int A[MAXN];
int N;
int m;
ll L[MAXN], R[MAXN];
int bitl[MAXN+1], bitr[MAXN+1];
ll sum(int i, int *b) {
ll s = 0;
while (i > 0) {
s += b[i];
i -= i & -i;
}
return s;
}
void add(int i, int x, int *b) {
while (i <= m) {
b[i] += x;
i += i & -i;
}
}
int main(void) {
cin >> N;
vector<int> vals;
for (int i = 0; i < N; i++) {
scanf("%d", A+i);
vals.push_back(A[i]);
}
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
m = vals.size();
for (int i = 2; i < N; i++) {
int index = lower_bound(vals.begin(), vals.end(), A[i]) - vals.begin();
add(index+1, 1, bitr);
}
{
int index = lower_bound(vals.begin(), vals.end(), A[0]) - vals.begin();
add(index+1, 1, bitl);
}
ll ans = 0;
for (int i = 1; i < N-1; i++) {
int index = lower_bound(vals.begin(), vals.end(), A[i]) - vals.begin();
int index2 = lower_bound(vals.begin(), vals.end(), A[i+1]) - vals.begin();
// cout << i << endl;
// cout << "bitl" << endl;
// for (int j = 1; j <= m; j++) {
// cout << sum(j, bitl) << " ";
// }
// cout << endl;
// cout << "bitr" << endl;
// for (int j = 1; j <= m; j++) {
// cout << sum(j, bitr) << " ";
// }
// cout << endl;
// 左と右がどちらも真ん中よりも小さい
ans += sum(index, bitl) * sum(index, bitr);
// 左と右がどちらも真ん中より大きい
ans += (sum(m, bitl) - sum(index+1, bitl)) * (sum(m, bitr) - sum(index+1, bitr));
add(index+1, 1, bitl);
add(index2+1, -1, bitr);
}
ll sum = 0;
for (int i = 1; i < N; i++) {
int index = lower_bound(vals.begin(), vals.end(), A[i]) - vals.begin();
R[index]++;
}
{
int index = lower_bound(vals.begin(), vals.end(), A[0]) - vals.begin();
L[index]++;
sum = L[index] * R[index];
}
for (int i = 1; i < N-1; i++) {
int index = lower_bound(vals.begin(), vals.end(), A[i]) - vals.begin();
ans -= sum - L[index] * R[index];
ll tmp = L[index] * R[index];
L[index]++;
R[index]--;
ll diff = tmp - (L[index] * R[index]);
sum -= diff;
}
cout << ans << endl;
return 0;
}
mayoko_