Submission #903235

#TimeUsernameProblemLanguageResultExecution timeMemory
903235Faisal_SaqibHoliday (IOI14_holiday)C++17
30 / 100
1167 ms2944 KiB
#pragma once
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define ll long long
const int N=30000;
int MN=3003;
int seg_cnt[N];
long long seg_sum[N];
void Update(int i,ll val=-1,int v=1,int s=0,int e=MN)
{
	if(i<s or e<i)
		return;
	if(s==e)
	{
		seg_cnt[v]++;
		if(val==-1)
			seg_sum[v]+=i;
		else
		{
			seg_sum[v]+=val;
		}
		return;
	}
	int mid=(s+e)/2;
	Update(i,val,2*v,s,mid);
	Update(i,val,2*v+1,1+mid,e);
	seg_cnt[v]=seg_cnt[2*v]+seg_cnt[2*v+1];
	seg_sum[v]=seg_sum[2*v]+seg_sum[2*v+1];
}
void Update1(int i,ll val=-1,int v=1,int s=0,int e=MN)
{
	if(i<s or e<i)
		return;
	if(s==e)
	{
		seg_cnt[v]--;
		if(val==-1)
			seg_sum[v]-=i;
		else
			seg_sum[v]-=val;
		return;
	}
	int mid=(s+e)/2;
	Update1(i,val,2*v,s,mid);
	Update1(i,val,2*v+1,1+mid,e);
	seg_cnt[v]=seg_cnt[2*v]+seg_cnt[2*v+1];
	seg_sum[v]=seg_sum[2*v]+seg_sum[2*v+1];
}
int get_cnt(int l,int r,int v=1,int s=0,int e=MN)
{
	if(r<s or e<l)
		return 0;
	if(l<=s and e<=r)
		return seg_cnt[v];
	int mid=(s+e)/2;
	return get_cnt(l,r,2*v,s,mid)+get_cnt(l,r,2*v+1,mid+1,e);
}
long long get_sum(int l,int r,int v=1,int s=0,int e=MN)
{
	if(r<s or e<l)
		return 0;
	if(l<=s and e<=r)
		return seg_sum[v];
	int mid=(s+e)/2;
	return get_sum(l,r,2*v,s,mid)+get_sum(l,r,2*v+1,mid+1,e);
}
long long findMaxAttraction(int n, int cc, int d, int a[])
{
	int mx=0;
	for(int i=0;i<n;i++)
		mx=max(mx,a[i]);
	if(mx<=100 and cc==0)
	{
		long long ans=0;
		for(int i=0;i<n;i++)
		{
			Update(a[i]);
			// // Find the maximum point such that (get_cnt(s,100)+i)>d
			int s=-1;
			int e=MN+1;
			while(s+1<e)
			{
				int mid=(s+e)/2;
				if((get_cnt(mid,MN)+i)>d)
				{
					s=mid;
				}
				else
				{
					e=mid;
				}
			}
			// cout<<"ad\n";
			// cout<<"HASD "<<get_cnt(s,100)<<' '<<i<<' '<<d<<endl;
			long long cur=get_sum(s+1,MN);
			// cout<<"Hola "<<i<<' '<<s<<' '<<cur<<endl;;
			if(s!=-1)
			{
				cur+=(s*(d-i-get_cnt(s+1,MN)));
			}
			ans=max(ans,cur);
			// Now for s We can see how many can we pick
		}
		return ans;
	}
	else
	{
		// cout<<"asd\n";
		vector<int> op,dp;
		for(int i=0;i<n;i++)
		{
			op.push_back(a[i]);
		}
		sort(begin(op),end(op));
		for(int i=0;i<n;i++)
			dp.push_back(lower_bound(begin(op),end(op),a[i])-begin(op));
		long long ans=0;
		for(int left=cc;left>=0;left--)
		{
			Update(dp[left],a[left]);
			{
				int right=cc;
				ll tmie=min(right-cc,cc-left)+right-left;
				if(tmie<=d)
				{
					int s=-1;
					int e=MN+1;
					while(s+1<e)
					{
						int mid=(s+e)/2;
						if((get_cnt(mid,MN)+tmie)>d)
						{
							s=mid;
						}
						else
						{
							e=mid;
						}
					}
					long long cur=get_sum(s+1,MN);
					if(s!=-1)
					{
						cur+=(a[s]*(d-tmie-get_cnt(s+1,MN)));
					}
					ans=max(ans,cur);
				}
			}
			for(int right=cc+1;right<n;right++)
			{
				Update(dp[right],a[right]);
				ll tmie=min(right-cc,cc-left)+right-left;
				if(tmie>d)
					continue;
				int s=-1;
				int e=MN+1;
				while(s+1<e)
				{
					int mid=(s+e)/2;
					if((get_cnt(mid,MN)+tmie)>d)
					{
						s=mid;
					}
					else
					{
						e=mid;
					}
				}
				long long cur=get_sum(s+1,MN);
				if(s!=-1)
				{
					cur+=(a[s]*(d-tmie-get_cnt(s+1,MN)));
				}
				ans=max(ans,cur);
			}
			for(int right=cc+1;right<n;right++)
				Update1(dp[right],a[right]);
		}
		return ans;
	}
	return 0;
}

Compilation message (stderr)

holiday.cpp:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...