Submission #1318597

#TimeUsernameProblemLanguageResultExecution timeMemory
1318597keremHoliday (IOI14_holiday)C++20
7 / 100
49 ms26464 KiB
#include"holiday.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define emb emplace_back
#define all(x) x.begin(),x.end()
#define sp << " " <<
#define inf 1e9
typedef tuple<int,int,int,int> iiii;

struct Node{
	int64_t sum;
	int sz,l,r;
	Node(){sz=sum=l=r=0;}
	Node(int ll,int rr){sz=sum=0;l=ll;r=rr;}
};
vector<Node> st;
vector<int> root;
vector<int> zort;
int addNode(int l,int r){
	st.emplace_back(l,r);
	st.back().sz=st[l].sz+st[r].sz;
	st.back().sum=st[l].sum+st[r].sum;
	return st.size()-1;
}
int update(int node,int l,int r,int qx){
	if(l==r){
		if(!node)
			node=addNode(0,0);
		st[node].sz++;
		st[node].sum+=zort[qx];
		return node;
	}
	int mid=(l+r)/2;
	if(qx<=mid)
		return addNode(update(st[node].l,l,mid,qx),st[node].r);
	else
		return addNode(st[node].l,update(st[node].r,mid+1,r,qx));
}
int64_t query(int nodeL,int nodeR,int l,int r,int qk){
	if(l==r) return 1LL*qk*zort[l];
	int t=st[st[nodeR].r].sz-st[st[nodeL].r].sz;
	int mid=(l+r)/2;
	if(qk>=t)
		return query(st[nodeL].l,st[nodeR].l,l,mid,qk-t)+(st[st[nodeR].r].sum-st[st[nodeL].r].sum);
	else
		return query(st[nodeL].r,st[nodeR].r,mid+1,r,qk);
}
long long int findMaxAttraction(int n, int start, int d, int attraction[]) {
	for(int i=0;i<n;i++)
		zort.pb(attraction[i]);
	sort(all(zort));
	zort.resize(unique(all(zort))-zort.begin());
	
    root.pb(addNode(0,0));
    for(int i=0;i<n;i++){
		int j=lower_bound(all(zort),attraction[i])-zort.begin();
		root.pb(update(root[i],0,zort.size()-1,j));
	}
	//~ cout << "yuppi" << endl;
	int64_t ans=0;
	queue<iiii> q;
	q.emplace(0,start,start,n-1);
	while(!q.empty()){
		int optl,optr,l,r;
		tie(optl,optr,l,r)=q.front();
		q.pop();
		//~ cout << optl sp optr sp l sp r << endl;
		int mid=(l+r)/2;
		pair<int64_t,int> opt={0,start};
		for(int i=optl;i<=optr;i++){
			int t=(mid-i)+min(start-i,mid-start);
			if(t<=d){
				int64_t val=query(root[i],root[mid+1],0,zort.size()-1,min(d-t,mid-i+1));
				opt=max(opt,make_pair(val,i));
			}
		}
		ans=max(ans,opt.first);
		if(l<r){
			q.emplace(optl,opt.second,l,mid-1);
			q.emplace(opt.second,optr,mid+1,r);
		}
	}
	return 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...