제출 #1270448

#제출 시각아이디문제언어결과실행 시간메모리
1270448algoproclubIzbori (COCI22_izbori)C++20
40 / 110
3096 ms8292 KiB
// UUID: 5aeeb374-457f-4caa-a204-77f4c30c9636 #include <bits/stdc++.h> using namespace std; const int gy=1200,c=4e5+12; using ll = long long; int val[4*c]; void upd(int cs, int tl, int tr, int pos) { if(tl==tr) { val[cs]++; return; } int mid=(tl+tr)/2; if(pos<=mid) upd(2*cs,tl,mid,pos); else upd(2*cs+1,mid+1,tr,pos); val[cs]=val[2*cs]+val[2*cs+1]; } int query(int cs, int tl, int tr, int l, int r) { if(l>r) return 0; if(l==tl && r==tr) return val[cs]; int mid=(tl+tr)/2; return query(2*cs,tl,mid,l,min(r,mid))+query(2*cs+1,mid+1,tr,max(mid+1,l),r); } int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n; cin>>n; vector<int> pontok{0},v(n+1); for(int i=1; i<=n; i++) { cin>>v[i]; pontok.push_back(v[i]); } sort(pontok.begin(),pontok.end()); pontok.erase(unique(pontok.begin(),pontok.end()),pontok.end()); for(int i=1; i<=n; i++) { v[i]=lower_bound(pontok.begin(),pontok.end(),v[i])-pontok.begin(); } int mer=pontok.size(); vector<int> cnt(mer); for(int i=1; i<=n; i++) { cnt[v[i]]++; } ll ans=0; vector<int> db(mer); for(int kezd=1; kezd<=n; kezd++) { int tmp=0; for(int i=kezd; i<=min(n,kezd+2*gy); i++) { if(++db[v[i]]>db[tmp]) tmp=v[i]; int h=i-kezd+1; if(db[tmp]>h/2 && cnt[tmp]<gy) ans++; } for(int i=kezd; i<=min(n,kezd+2*gy); i++) db[v[i]]=0; } for(int e=1; e<mer; e++) { if(cnt[e]>=gy) { for(int i=1; i<=8*n; i++) val[i]=0; int pref=0; upd(1,0,2*n+2,n); for(int i=1; i<=n; i++) { if(v[i]==e) pref++; else pref--; ans+=ll(query(1,0,2*n+2,0,pref+n-1)); upd(1,0,2*n+2,pref+n); } } } cout<<ans<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...