結果
問題 | No.742 にゃんにゃんにゃん 猫の挨拶 |
ユーザー |
![]() |
提出日時 | 2018-10-05 21:54:29 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 16 ms / 2,500 ms |
コード長 | 2,307 bytes |
コンパイル時間 | 938 ms |
コンパイル使用メモリ | 106,912 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-10-12 13:56:26 |
合計ジャッジ時間 | 1,624 ms |
ジャッジサーバーID (参考情報) |
judge / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 16 |
ソースコード
#include<iostream>#include<vector>#include<algorithm>#include<functional>#include<queue>#include<stack>#include<set>#include<map>#include<unordered_map>#include<climits>#include<cstdlib>#include<cmath>#include<string>#include<iomanip>using namespace std;#define INF 1 << 29#define LL long long intLL const MOD = 1000000007;template<typename T>class SegmentTree{int n;int realsize;T initialvalue;vector<T> tree;public:SegmentTree(int size,T initial):realsize(size),initialvalue(initial){n = 1;while(n < size)n *= 2;tree = vector<T>(2*n + 1,initial);}//1-indexedvoid insert(int i,T data){int ind = n+i-1;tree[ind] = data;ind >>= 1;while(ind > 0){tree[ind] = tree[ind*2] + tree[ind*2+1];ind >>= 1;}}void add(int i,T data){int ind = n+i-1;tree[ind] += data;ind >>= 1;while(ind > 0){tree[ind] = tree[ind*2] + tree[ind*2+1];ind >>= 1;}}T get(int l,int r){if(l > realsize || r > realsize || l <= 0 || r <= 0)return initialvalue;l = n+l-1;r = n+r-1;if(l == r)return tree[l];int prel = l;int prer = r;T lnum = tree[l];T rnum = tree[r];l >>= 1;r >>= 1;while(l != r){if(l*2 == prel){lnum += tree[l*2+1];}if(r*2+1 == prer){rnum += tree[r*2];}prel = l;prer = r;l >>= 1;r >>= 1;}return lnum+rnum;}};int main(){cin.tie(0);ios::sync_with_stdio(false);LL n;cin >> n;vector<LL> a(n);vector<LL> s(n);for(int i = 0; i < n; i++){cin >> a[i];s[i] = a[i];}SegmentTree<LL> st(n+1,0);sort(s.begin(),s.end());LL ans = 0;for(int i = 0; i < n; i++){st.add(lower_bound(s.begin(),s.end(),a[i])-s.begin()+1,1);auto itr = upper_bound(s.begin(),s.end(),a[i]);LL discount = st.get(1,itr - s.begin());ans += itr - s.begin() - discount;}cout << ans << endl;return 0;}