제출 #1176546

#제출 시각아이디문제언어결과실행 시간메모리
1176546vicvicVudu (COCI15_vudu)C++20
42 / 140
1097 ms86932 KiB
#include <iostream> #include <map> #include <fstream> #include <unordered_map> using namespace std; const int NMAX=1e6; int v[NMAX+5], sp[NMAX+5], n, p; map <int, int> mp; unordered_map <int, int> norm; class SegTree { public: int t[8*NMAX+5]; void actupdate (int nod, int st, int dr, int poz, int val) { if (st==dr) { t[nod]++; } else { int mij = (st+dr) >> 1; if (poz<=mij) actupdate (nod*2, st, mij, poz, val); else actupdate (nod*2+1, mij+1, dr, poz, val); t[nod]=t[nod*2]+t[nod*2+1]; } } void update (int poz, int val) { actupdate (1, 1, NMAX*2, poz, val); } int actquery (int nod, int st, int dr, int stq, int drq) { if (stq<=st && dr<=drq) { return t[nod]; } else { int mij = (st+dr) >> 1; if (drq<=mij) return actquery (nod*2, st, mij, stq, drq); if (stq>mij) return actquery (nod*2+1, mij+1, dr, stq, drq); return actquery (nod*2, st, mij, stq, drq)+actquery (nod*2+1, mij+1, dr, stq, drq); } } int query (int st, int dr) { return actquery (1, 1, 2*NMAX, st, dr); } }; SegTree aint; int main () { cin >> n; for (int i=1;i<=n;i++) { cin >> v[i]; sp[i]=sp[i-1]+v[i]; } cin >> p; for (int i=1;i<=n;i++) { mp[-sp[i-1]+p*i-p]++; mp[p*i-sp[i]]++; } int cnt=0; for (auto chestie : mp) { norm[chestie.first]=++cnt; } long long int ret=0; for (int i=1;i<=n;i++) { aint.update (norm[-sp[i-1]+p*i-p], 1); ret+=aint.query (norm[p*i-sp[i]], cnt); } cout << ret; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...