Submission #52720

#TimeUsernameProblemLanguageResultExecution timeMemory
52720zetapiHoliday (IOI14_holiday)C++14
23 / 100
869 ms11476 KiB
#include <holiday.h>
#include <bits/stdc++.h>
using namespace std;
 
#define pb  push_back
#define mp  make_pair
#define ll long long
#define itr ::iterator 
 
typedef pair<ll,ll>  pii;
 
const int MAX=3e5;
 
struct data
{
	ll ind;
	ll sum;
}	seg[MAX];
 
vector<pii> sorted;
vector<int> lol;

ll N,D,Start,f[MAX],g[MAX],pos[MAX];
 
void build(int low,int high,int node)
{
	if(low==high)
	{
		if(low<=sorted.size())
		{
			seg[node].ind=1;
			seg[node].sum=sorted[low-1].first;
		}
		else
		{
			seg[node].ind=0;
			seg[node].sum=0;
		}
		return ;
	}
	int mid=(low+high)/2;
	build(low,mid,2*node);
	build(mid+1,high,2*node+1);
	seg[node].ind=seg[2*node].ind+seg[2*node+1].ind;
	seg[node].sum=seg[2*node].sum+seg[2*node+1].sum;
	return ;
}

void update(int low,int high,int node,int idx,int delta)
{
	if(low==high)
	{
		seg[node].ind=delta;
		if(delta)
			seg[node].sum=sorted[low-1].first;
		else
			seg[node].sum=0;
		return ;
	}
	int mid=(low+high)/2;
	if(idx>=low and idx<=mid)
		update(low,mid,2*node,idx,delta);
	else
		update(mid+1,high,2*node+1,idx,delta);
	seg[node].ind=seg[2*node].ind+seg[2*node+1].ind;
	seg[node].sum=seg[2*node].sum+seg[2*node+1].sum;
	return ;
} 

ll query(int low,int high,int node,int K)
{
	if(low==high)
		return seg[node].sum;
	int mid=(low+high)/2;
	if(seg[2*node].ind>=K)
		return query(low,mid,2*node,K);
	return seg[2*node].sum+query(mid+1,high,2*node+1,K-seg[2*node].ind);
}

ll cal2(int idx,int qlow,int qhigh)
{
	int rem;
	pii res=mp(0,qhigh);
	for(int A=qlow;A<=qhigh;A++)
	{	
		rem=idx-(Start-A);
		if(rem>0)
			res=max(res,mp(query(1,N,1,rem),(ll)A));
		update(1,N,1,pos[A],0);
	}
	for(int A=qlow;A<=qhigh;A++)
		update(1,N,1,pos[A],1);
	return res.second;
}
 
void cal2(int low,int high,int qlow,int qhigh)
{
	if(low>high)
		return ;
	int mid=(low+high)/2;
	g[mid]=cal2(mid,qlow,qhigh);
	//cout<<mid<<" "<<g[mid]<<"\n";
	if(low==high)
	{
		for(int A=qlow;A<qhigh;A++)
			update(1,N,1,pos[A],0);
		return ;
	}
	cal2(mid+1,high,qlow,g[mid]);
	cal2(low,mid-1,g[mid],qhigh);
	return ;
}

//long long int findMaxAttraction(int n=5,int start=0,int d=7,vector<int> attraction={10,2,20,30,1})
long long int findMaxAttraction(int n,int start,int d,int attraction[])
{//1,30,20,2,10

	N=n;
	D=d;
	start=N-1;
	Start=N;
	reverse(attraction,attraction+N);
	ll cur,res=0;
	for(int A=0;A<=start;A++)
		sorted.pb(mp(attraction[A],A+1));
	sort(sorted.begin(),sorted.end());
	reverse(sorted.begin(),sorted.end());
	for(int A=0;A<sorted.size();A++)
		pos[sorted[A].second]=A+1;
	build(1,N,1);
	cal2(1,D,max((ll)1,Start-D),Start);
	//cout<<g[D]<<"\n";
	for(int A=Start;A>=g[D];A--)
		lol.pb(attraction[A-1]);
	sort(lol.begin(),lol.end());
	reverse(lol.begin(),lol.end());
	int rem=D-(Start-g[D]);
	for(int A=0;A<rem;A++)
	if(A>=lol.size())
		break;
	else
		res+=lol[A];
	return res;
}
 
/*int main()
{
	ios_base::sync_with_stdio(false);

	cout<<findMaxAttraction();
	return 0;
}*/

Compilation message (stderr)

holiday.cpp: In function 'void build(int, int, int)':
holiday.cpp:29:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(low<=sorted.size())
      ~~~^~~~~~~~~~~~~~~
holiday.cpp: In function 'long long int findMaxAttraction(int, int, int, int*)':
holiday.cpp:128:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int A=0;A<sorted.size();A++)
              ~^~~~~~~~~~~~~~
holiday.cpp:139:6: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(A>=lol.size())
     ~^~~~~~~~~~~~
holiday.cpp:123:5: warning: unused variable 'cur' [-Wunused-variable]
  ll cur,res=0;
     ^~~
grader.cpp: In function 'int main()':
grader.cpp:7:12: warning: variable 'n_s' set but not used [-Wunused-but-set-variable]
     int i, n_s;
            ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...