제출 #380387

#제출 시각아이디문제언어결과실행 시간메모리
380387ritul_kr_singhVudu (COCI15_vudu)C++17
140 / 140
613 ms46572 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define sp << ' ' << #define nl << '\n' struct segtree{ int sz = 1; vector<int> a; segtree(int n){ while(sz < n) sz *= 2; a.assign(2*sz, 0); } void update(int i, int x, int lx, int rx){ if(rx-lx==1) return void(++a[x]); int mx = (lx+rx)/2; if(i<mx) update(i, 2*x+1, lx, mx); else update(i, 2*x+2, mx, rx); ++a[x]; } int get(int r, int x, int lx, int rx){ if(lx>=r) return 0; if(rx<=r) return a[x]; int mx = (lx+rx)/2; return get(r, 2*x+1, lx, mx) + get(r, 2*x+2, mx, rx); } int get(int r){ update(r, 0, 0, sz); return get(r+1, 0, 0, sz)-1; } }; signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, p; cin >> n; pair<int, int> pre[n+1] = {{0, 0}}; for(int i=1; i<=n; ++i){ pre[i].second = i; cin >> pre[i].first; pre[i].first += pre[i-1].first; } cin >> p; for(int i=1; i<=n; ++i) pre[i].first -= i*p; sort(pre, pre+n+1); int rank[n+1]={0}, curr = 0; for(int i=1; i<=n; ++i){ curr += pre[i].first != pre[i-1].first; rank[pre[i].second] = curr; } ++curr; segtree st(curr); int ans = 0; for(int i=0; i<=n; ++i) ans += st.get(rank[i]); cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...