Submission #1300870

#TimeUsernameProblemLanguageResultExecution timeMemory
1300870MuhammadSaramIzbori (COCI22_izbori)C++20
25 / 110
31 ms5420 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define all(v) v.begin(), v.end()

const int SQ = 463, M = 2e5 + 5;

int fen[M], cnt1[SQ*3];
int *cnt = cnt1+SQ*2;

void modify(int p)
{
	while (p<M)
		fen[p]++, p+=p&-p;
}

int get(int p)
{
	int ans=0;
	while (p)
		ans+=fen[p], p^=p&-p;
	return ans;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL), cout.tie(NULL);
	
	int n;
	cin>>n;
	map<int,vector<int>> ind;
	int a[n];
	for (int i=0;i<n;i++)
		cin>>a[i],ind[a[i]].push_back(i);
	ll ans=0;
	for (auto [x,v]:ind)
	{
		if (v.size()<SQ)
		{
			int m=v.size();
			for (int o=0;o<m;o++)
			{
				int nx=min(n,v[o]+m);
				if (o+1<v.size()) nx=min(nx,v[o+1]);
				int su=0, st=max(0,v[o]-2*m+1);
				cnt[0]++;
				for (int i=st;i<v[o];i++)
					su+=(a[i]==x)-(a[i]!=x), cnt[su]++;
				int t=0;
				for (int i=-2*m;i<=su;i++) t+=cnt[i];
				ans+=t;
				for (int i=v[o]+1;i<nx;i++)
					t-=(su<-2*SQ?0:cnt[su]), ans+=t, su--;
				for (int i=0;i<SQ*3;i++) cnt1[i]=0;
			}
		}
		else
		{
			vector<pair<int,int>> v1;
			v1.push_back({0,1});
			int su=0;
			for (int i=0;i<n;i++)
				su+=(a[i]==x)-(a[i]!=x), v1.push_back({su,i+2});
			sort(all(v1));
			for (auto [i,j]:v1)
				ans+=get(j), modify(j);
			for (int i=0;i<M;i++) fen[i]=0;
		}
	}
	cout<<ans<<endl;
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...