結果
問題 | No.956 Number of Unbalanced |
ユーザー | mtsd |
提出日時 | 2019-12-19 03:22:33 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 111 ms / 2,000 ms |
コード長 | 3,750 bytes |
コンパイル時間 | 1,422 ms |
コンパイル使用メモリ | 126,032 KB |
実行使用メモリ | 11,988 KB |
最終ジャッジ日時 | 2024-07-06 23:26:37 |
合計ジャッジ時間 | 4,208 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 5 ms
6,400 KB |
testcase_01 | AC | 4 ms
6,400 KB |
testcase_02 | AC | 4 ms
6,528 KB |
testcase_03 | AC | 4 ms
6,400 KB |
testcase_04 | AC | 4 ms
6,400 KB |
testcase_05 | AC | 5 ms
6,400 KB |
testcase_06 | AC | 84 ms
10,848 KB |
testcase_07 | AC | 77 ms
10,688 KB |
testcase_08 | AC | 84 ms
10,864 KB |
testcase_09 | AC | 71 ms
10,252 KB |
testcase_10 | AC | 71 ms
10,168 KB |
testcase_11 | AC | 110 ms
11,180 KB |
testcase_12 | AC | 85 ms
10,724 KB |
testcase_13 | AC | 25 ms
9,620 KB |
testcase_14 | AC | 98 ms
11,856 KB |
testcase_15 | AC | 26 ms
8,860 KB |
testcase_16 | AC | 75 ms
11,188 KB |
testcase_17 | AC | 23 ms
8,860 KB |
testcase_18 | AC | 98 ms
11,988 KB |
testcase_19 | AC | 27 ms
9,380 KB |
testcase_20 | AC | 99 ms
11,860 KB |
testcase_21 | AC | 53 ms
9,624 KB |
testcase_22 | AC | 24 ms
9,048 KB |
testcase_23 | AC | 82 ms
11,188 KB |
testcase_24 | AC | 29 ms
9,512 KB |
testcase_25 | AC | 84 ms
10,196 KB |
testcase_26 | AC | 111 ms
10,016 KB |
testcase_27 | AC | 83 ms
10,112 KB |
testcase_28 | AC | 85 ms
10,044 KB |
testcase_29 | AC | 97 ms
11,864 KB |
ソースコード
#include <algorithm> #include <bitset> #include <cassert> #include <chrono> #include <climits> #include <cmath> #include <complex> #include <cstring> #include <deque> #include <functional> #include <iostream> #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; #define MP make_pair #define PB push_back #define inf 1000000007 #define mod 1000000007 #define rep(i,n) for(int i = 0; i < (int)(n); ++i) #define int long long 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; } }; signed main(){ int n; cin >> n; vector<int> a(n); vector<int> c(100001); vector<vector<int> > pp(100001); rep(i,n){ cin >> a[i]; c[a[i]]++; pp[a[i]].push_back(i); } vector<pair<int,int> > p; rep(i,100001){ if(c[i]!=0){ p.push_back(MP(c[i],i)); } } ll sm = 0; sort(p.rbegin(),p.rend()); for(int z=0;z<p.size();z++){ int k = p[z].second; if(z<=10){ vector<int> d(n+1); rep(i,n){ if(a[i]==k){ d[i+1] = 1; }else{ d[i+1] = -1; } } int g = -1; for(int i=1;i<n;i++){ d[i+1] += d[i]; g = min(g,d[i+1]); } g = -g; int mx = 0; for(int i=0;i<=n;i++){ d[i] += g; mx = max(mx,d[i]); } BIT<int> bit(mx+1); for(int i=0;i<=n;i++){ sm += bit.sum(d[i]-1); bit.add(d[i],1); } }else{ vector<int> d = pp[k]; int m = d.size(); for(int i=0;i<m;i++){ for(int j=i;j<m;j++){ int g = j-i+1; if(d[j]-d[i]+1 < 2*g){ int P = 2*g-1-(d[j]-d[i]+1); int L,R; if(i==0){ L = d[0]; }else{ L = d[i]-d[i-1]-1; } if(j==m-1){ R = n-1-d[j]; }else{ R = d[j+1]-d[j]-1; } if(R+L<=P){ sm += (R+1)*(L+1); }else{ sm += (P+2)*(P+1)/2; if(R<P){ sm -= (P-R+1)*(P-R)/2; } if(L<P){ sm -= (P-L+1)*(P-L)/2; } } } } } } } cout << sm << endl; return 0; }