結果
問題 | No.1270 Range Arrange Query |
ユーザー | mtsd |
提出日時 | 2020-10-23 23:04:00 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,304 ms / 7,000 ms |
コード長 | 3,111 bytes |
コンパイル時間 | 1,205 ms |
コンパイル使用メモリ | 118,552 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-21 12:22:17 |
合計ジャッジ時間 | 11,683 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 34 ms
5,376 KB |
testcase_07 | AC | 584 ms
5,376 KB |
testcase_08 | AC | 58 ms
5,376 KB |
testcase_09 | AC | 345 ms
5,376 KB |
testcase_10 | AC | 422 ms
5,376 KB |
testcase_11 | AC | 1,240 ms
5,376 KB |
testcase_12 | AC | 1,240 ms
5,376 KB |
testcase_13 | AC | 1,239 ms
5,376 KB |
testcase_14 | AC | 884 ms
5,376 KB |
testcase_15 | AC | 1,304 ms
5,376 KB |
testcase_16 | AC | 1,091 ms
5,376 KB |
testcase_17 | AC | 1,149 ms
5,376 KB |
ソースコード
#include <algorithm> #include <bitset> #include <cassert> #include <chrono> #include <climits> #include <cmath> #include <complex> #include <cstring> #include <deque> #include <functional> #include <iostream> #include <iomanip> #include <list> #include <map> #include <numeric> #include <queue> #include <random> #include <set> #include <stack> #include <unordered_map> #include <unordered_set> #include <vector> #include <cstdint> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pii; #define MP make_pair #define PB push_back #define inf 1000000007 #define rep(i,n) for(int i = 0; i < (int)(n); ++i) #define all(x) (x).begin(),(x).end() template<typename A, size_t N, typename T> void Fill(A (&array)[N], const T &val){ std::fill( (T*)array, (T*)(array+N), val ); } template<class T> inline bool chmax(T &a, T b){ if(a<b){ a = b; return true; } return false; } template<class T> inline bool chmin(T &a, T b){ if(a>b){ a = b; return true; } return false; } template<typename T> class BIT { private: int n; vector<T> bit; public: // 0_indexed で i 番目の要素に x を加える void add(int i, T x){ i++; while(i < n){ bit[i] += x, i += i & -i; } } // 0_indexed で [0,i] の要素の和(両閉区間!!) T sum(int i){ i++; T s = 0; while(i > 0){ s += bit[i], i -= i & -i; } return s; } BIT(){} //初期値がすべて0の場合 BIT(int sz) : n(sz+1), bit(n, 0){} BIT(vector<T>& v) : n((int)v.size()+1), bit(n, 0){ for(int i = 0; i < n-1; i++){ add(i,v[i]); } } void print(){ for(int i = 0; i < n-1; i++){ cout<<sum(i)-sum(i-1)<< " "; } cout<<endl; } //-1スタート void print_sum(){ for(int i = 0; i < n; i++){ cout<<sum(i-1)<<" "; } cout<<endl; } }; int a[20001]; int b[20001]; int c[20001]; int L[20001]; int R[20001]; int main(){ cin.tie(0); ios::sync_with_stdio(false); int n,q; cin >> n >> q; rep(i,n)cin >> a[i]; BIT<int> bit(n+1),bit2(n+1); rep(i,n){ int k = bit.sum(n) - bit.sum(a[i]); if(i==0){ L[i] = k; }else{ L[i] = k+L[i-1]; } bit.add(a[i],1); } for(int i=n-1;i>=0;i--){ int k = bit2.sum(a[i]-1); R[i] = R[i+1] + k; bit2.add(a[i],1); } rep(zz,q){ int l,r; cin >> l >> r; l--; ll tmp = 0; rep(i,n+1)b[i] = 0; rep(i,n+1)c[i] = 0; for(int i=0;i<l;i++){ b[a[i]-1]++; } for(int i=n-1;i>=0;i--){ b[i] += b[i+1]; } for(int i=r;i<n;i++){ c[a[i]+1]++; } rep(i,n){ c[i+1] += c[i]; } for(int i=0;i<l;i++){ tmp += c[a[i]]; } int mi = inf; rep(i,n){ chmin(mi,b[i+1]+c[i+1]); } int T = 0; if(l!=0)T = L[l-1]; // cerr << T << " "<< R[r] << " " << tmp << " " << mi << endl; cout << T + R[r] + tmp + mi*(r-l) << "\n"; } return 0; }