제출 #1163434

#제출 시각아이디문제언어결과실행 시간메모리
1163434salmonEkoeko (COCI21_ekoeko)C++20
110 / 110
69 ms16084 KiB
#include <bits/stdc++.h> using namespace std; int N; int cont[30]; int tcont[30]; string s; map<pair<int,int>,int> mep; int num = 0; struct node{ int s, e, m; int v; node *l , *r; node(int S, int E){ s = S; e = E; m = (s + e)/2; v = e - s + 1; if(s != e){ l = new node(s,m); r = new node(m + 1, e); } } void update(int i){ v--; if(s != e){ if(i <= m) l -> update(i); else r-> update(i); } } int query(int S, int E){ if(S <= s && e <= E) return v; int V = 0; if(S <= m) V += l -> query(S,E); if(m < E) V += r -> query(S,E); return V; } }*root; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cin >> N; cin >> s; N *= 2; for(int i = 0; i <= 26; i++) cont[i] = 0; for(int i = 0; i <= 26; i++) tcont[i] = 0; for(int i = 0; i < N; i++){ cont[s[i] - 'a']++; } root = new node(0,N/2 - 1); long long int ans = 0; int cant = 0; for(int i = 0; i < N; i++){ tcont[s[i] - 'a']++; if(tcont[s[i] - 'a'] <= cont[s[i]-'a']/2){ mep[{s[i]-'a',tcont[s[i] - 'a']}] = num; num++; ans += cant; } else{ cant++; } } for(int i = 0; i <= 26; i++) tcont[i] = 0; for(int i = 0; i < N; i++){ tcont[s[i] - 'a']++; if(tcont[s[i] - 'a'] > cont[s[i]-'a']/2){ root -> update(mep[{s[i]-'a',tcont[s[i] - 'a'] - cont[s[i]-'a']/2}]); ans += root -> query(0,mep[{s[i]-'a',tcont[s[i] - 'a'] - cont[s[i]-'a']/2}]); } } printf("%lld",ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...