Submission #813938

#TimeUsernameProblemLanguageResultExecution timeMemory
813938t6twotwoDiversity (CEOI21_diversity)C++17
64 / 100
7049 ms26700 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define FFOR(i,a,b,c) for(int i=(a);(c)>0?i<=(b):i>=(b);i+=(c)) #define FOOR(i,a,b) FFOR(i,a,b-1,1) #define ROOF(i,a,b) FFOR(i,b-1,a,-1) #define FOR(i,n) FOOR(i,0,n) #define ROF(i,n) ROOF(i,0,n) #define FORR(x,v) for(auto &x:v) #define all(v) (v).begin(),(v).end() #define lla(v) (v).rbegin(),(v).rend() #define sz(v) (int)((v).size()) #define vc vector #define pb push_back #define ppb pop_back #define bk back() #define fr front() #define pp pop() #define eb emplace_back #define lb lower_bound #define ub upper_bound #define bg begin() #define en end() #define em empty() #define f first #define s second constexpr int T=300000,B=543; int f[T+1],pos[T],lo[T+1],hi[T+1]; ll s; struct node{ ll sum,up,dw; int len=0; node(){sum=up=dw=len=0;} node(ll a){sum=a;up=dw=2*a;len=1;} }st[2*T]; node operator+(const node &a, const node &b){ node c; c.len=a.len+b.len; c.sum=a.sum+b.sum; c.up=a.up+b.up+b.sum*a.len; c.dw=b.dw+a.dw+a.sum*b.len; return c; } void update(int i,int v){ for(i+=T,st[i]=st[i].sum+v;i/=2;){ st[i]=st[i*2]+st[i*2+1]; } } node query(int l, int r){ node a,b; for(l+=T,r+=T;l<r;l/=2,r/=2){ if(l&1) a=a+st[l++]; if(r&1) b=st[--r]+b; } return a+b; } void add(int v){ s-=1LL*f[v]*(f[v]+1)/2; int p=hi[f[v]]; if(lo[f[v]]==hi[f[v]]){ lo[f[v]]=hi[f[v]]=-1; }else hi[f[v]]--; f[v]++; lo[f[v]]=p; if(hi[f[v]]==-1){ hi[f[v]]=p; } s+=1LL*f[v]*(f[v]+1)/2; update(pos[p],1); s+=query(0,pos[p]).dw+query(pos[p]+1,T).up; } void rem(int v){ s-=1LL*f[v]*(f[v]+1)/2; int p=lo[f[v]]; if(lo[f[v]]==hi[f[v]]){ lo[f[v]]=hi[f[v]]=-1; }else lo[f[v]]++; f[v]--; hi[f[v]]=p; if(lo[f[v]]==-1){ lo[f[v]]=p; } s+=1LL*f[v]*(f[v]+1)/2; update(pos[p],-1); s-=query(0,pos[p]).dw+query(pos[p]+1,T).up; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); fill(lo,lo+T+1,-1); fill(hi,hi+T+1,-1); lo[0]=0; hi[0]=T-1; for(int i=0,l=0,r=T-1;i<T;i++){ pos[i]=i%2==0?l++:r--; } ROOF(i,T,2*T) st[i]=0; ROOF(i,1,T) st[i]=st[i*2]+st[i*2+1]; int N,Q; cin>>N>>Q; vc<int> A(N); FORR(x,A)cin>>x; vc<tuple<int,int,int,int>> query(Q); FOR(i,Q){ int l,r; cin>>l>>r; l--; query[i]={l/B,-r,l,i}; } sort(all(query)); vc<ll> ans(Q); int L=0,R=0; for(auto[_,r,l,i]:query) { r=-r; while(l<L) add(A[--L]); while(R<r) add(A[R++]); while(L<l) rem(A[L++]); while(r<R) rem(A[--R]); ans[i]=s; } FORR(x,ans) cout<<x<<"\n"; return 6/22; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...