Submission #1064983

#TimeUsernameProblemLanguageResultExecution timeMemory
1064983Edu175Holiday (IOI14_holiday)C++17
100 / 100
369 ms19488 KiB
#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define fore(i,a,b) for(ll i=a,ioi=b;i<ioi;i++)
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset((a),(v),sizeof(a))
#define imp(v) {for(auto fdgkj:v)cout<<fdgkj<<" ";cout<<endl;}
#define impr(v) {cout<<"{ ";for(auto fdgkj:v)cout<<fdgkj<<" ";cout<<"}";}
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
const ll MAXN=1e5+5;

ii NEUT={0,0};
ii oper(ii a, ii b){
	return {a.fst+b.fst,a.snd+b.snd};
}
ll tec(ll n){
	ll res=0;
	while(n>1)res++,n=(n+1)/2;
	return 1ll<<res;
}
struct STree{
	ll n; vector<ii>t; vector<ll>a,idx;
	STree(){}
	STree(vector<ll>A):n(tec(SZ(A))),t(2*n+5,NEUT),a(A){
		a.resize(n);
		vector<ii>b;
		fore(i,0,n)b.pb({a[i],i});
		sort(ALL(b));
		idx=vector<ll>(n);
		fore(i,0,n){
			idx[b[i].snd]=i;
		}
	}
	void upd(ll p, ll fg){ // 1 add, 0 remove
		// cout<<"upd "<<p<<"("<<n<<") "<<SZ(a)<<" --> ";
		ll i=p;
		p=idx[p];
		// cout<<p<<endl;
		p+=n;
		t[p]={fg,fg*a[i]};
		for(;p>1;p>>=1)t[p>>1]=oper(t[p],t[p^1]);
	}
	ll p=0;
	void adjust(ll m){
		m++;
		while(p<m)upd(p++,1);
		while(p>m)upd(--p,0);
	}
	ll find(ll k, ll v){
		if(k>=n)return v>0?t[k].snd:0;
		if(t[2*k+1].fst<=v){
			return t[2*k+1].snd+find(2*k,v-t[2*k+1].fst);
		}
		return find(2*k+1,v);
	}
	ll query(ll v){
		return find(1,v);
	}
};
ll val[3*MAXN];
STree st;
ll fg;
void dnc(ll l, ll r, ll s, ll e){
	// cout<<"dnc "<<l<<","<<r<<" "<<s<<","<<e<<endl;
	ll m=(l+r)/2;
	ll opt=0, &res=val[m]; res=-1;
	fore(i,s,e){
		st.adjust(i);
		ll di=m-(1+fg)*i;
		ll resi=st.query(di);
		if(resi>res)opt=i,res=resi;
	}
	if(r-l>1){
		dnc(l,m,s,opt+1);
		dnc(m+1,r,opt,e);
	}
}
vector<ll> getds(vector<ll>a, ll d, ll _fg){
	// cout<<"getds: "<<fg<<", "; imp(a); 
	ll n=SZ(a);
	fg=_fg;
	st=STree(a);
	vector<ll>res(d);
	if(!SZ(a))return res;
	dnc(0,d,0,n);
	fore(i,0,d)res[i]=val[i];
	// cout<<" = "; imp(res); 
	return res;
}

long long findMaxAttraction(int N, int s, int d, int A[]) {
	ll n=N;
	vector<ll>a(n);
	fore(i,0,n)a[i]=A[i];
	vector<ll>l,r;
	fore(i,0,n){
		if(i<s)l.pb(a[i]);
		else r.pb(a[i]);
	}
	reverse(ALL(l));
	ll res=0;
	fore(fg,0,2){
		auto lhs=getds(l,d+2,fg);
		auto rhs=getds(r,d+2,fg^1);
		fore(i,0,fg+1)lhs.insert(lhs.begin(),0);
		fore(i,0,d+1)res=max(res,lhs[i]+rhs[d-i]);
	}
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...