結果
| 問題 |
No.905 Sorted?
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-10-14 20:24:24 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 284 ms / 2,000 ms |
| コード長 | 3,608 bytes |
| コンパイル時間 | 1,749 ms |
| コンパイル使用メモリ | 144,328 KB |
| 最終ジャッジ日時 | 2025-01-07 22:02:16 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
//include
//------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <unordered_map>
#include <climits>
#include <set>
#include <unordered_set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <queue>
#include <random>
#include <complex>
#include <regex>
#include <locale>
#include <random>
#include <type_traits>
using namespace std;
#define SHOW_VECTOR(v) {std::cerr << #v << "\t:";for(const auto& xxx : v){std::cerr << xxx << " ";}std::cerr << "\n";}
#define SHOW_MAP(v){std::cerr << #v << endl; for(const auto& xxx: v){std::cerr << xxx.first << " " << xxx.second << "\n";}}
using LL = long long;
//------------------------------------------
//------------------------------------------
template<typename T>
class CulSum {
private:
long long N;
vector<T> a;
vector<T> aa;
vector<T> b;
vector<T> bb;
function<T(T, T)> func;
public:
/// @param a original array
CulSum(vector<T> _a) {
N = _a.size();
a = _a;
b = _a;
reverse(b.begin(), b.end());
this->aa = vector<T>(N + 1, T{});
this->bb = vector<T>(N + 1, T{});
for (int i = 0; i < N; i++) aa[i + 1] = a[i] + aa[i];
for (int i = 0; i < N; i++) bb[i + 1] = b[i] + bb[i];
}
/// @param a original array
CulSum(vector<T> _a, function<T(T, T)> func) : func(func) {
N = _a.size();
a = _a;
b = _a;
reverse(b.begin(), b.end());
this->aa = vector<T>(N + 1, T{});
this->bb = vector<T>(N + 1, T{});
for (int i = 0; i < N; i++) aa[i + 1] = func(a[i], aa[i]);
for (int i = 0; i < N; i++) bb[i + 1] = func(b[i], bb[i]);
}
/// @brief 0-index original
/// @param l original close
/// @param r original open
T get_sum(int l, int r) {
return aa[r] - aa[l];
}
/// @brief 0-index original
/// @param l original close
/// @param r original open
T get_sum_reverse(int l, int r) {
l = N - l;
r = N - r;
return bb[l] - bb[r];
}
/// @brief 0-index original
/// @param k length
T get_sum_lead_k_len(int k) {
return get_sum(0, k);
}
/// @brief 0-index original
/// @param k length
T get_sum_tail_k_len(int k) {
return get_sum_reverse(N - k, N);
}
void show() {
for (int i = 0; i < N + 1; i++) cout << aa[i] << " ";
cout << endl;
}
void show_reverse() {
for (int i = N; i >= 0; i--) cout << bb[i] << " ";
cout << endl;
}
};
int main() {
int N;
cin >> N;
vector<LL> A(N);
for (int i = 0; i < N; i++) cin >> A[i];
vector<LL> B(N - 1);
for (int i = 0; i < N - 1; i++) B[i] = (A[i + 1] - A[i]) >= 0;
vector<LL> C(N - 1);
for (int i = 0; i < N - 1; i++) C[i] = (A[i + 1] - A[i]) <= 0;
auto f = [](const LL a, const LL b) {
return a + b;
};
CulSum<LL> culSum_B(B, f);
CulSum<LL> culSum_C(C, f);
int Q;
cin >> Q;
while (Q--) {
int l, r;
cin >> l >> r;
if (culSum_B.get_sum(l, r) == r - l) cout << 1 << " ";
else cout << 0 << " ";
if (culSum_C.get_sum(l, r) == r - l) cout << 1 << endl;
else cout << 0 << endl;
}
return 0;
}