Submission #253192

#TimeUsernameProblemLanguageResultExecution timeMemory
253192PyqePotatoes and fertilizers (LMIO19_bulves)C++14
30 / 100
1096 ms137336 KiB
#include <bits/stdc++.h>
#pragma GCC optimize ("unroll-loops")

using namespace std;

#define mp make_pair
#define fr first
#define sc second

long long n,d=0,a[2][500069],wg[500069],inf=1e18;

struct segtree
{
	long long l,r,lz;
	pair<long long,long long> mn;
	segtree *p[2];
	
	void bd(long long lh,long long rh)
	{
		l=lh;
		r=rh;
		lz=0;
		if(l==r)
		{
			mn={wg[l],l};
		}
		else
		{
			long long md=(l+r)/2;
			
			p[0]=new segtree;
			p[0]->bd(l,md);
			p[1]=new segtree;
			p[1]->bd(md+1,r);
			mn=min(p[0]->mn,p[1]->mn);
		}
	}
	void blc()
	{
		if(lz)
		{
			p[0]->mn.fr+=lz;
			p[0]->lz+=lz;
			p[1]->mn.fr+=lz;
			p[1]->lz+=lz;
			lz=0;
		}
	}
	void ud(long long lh,long long rh,long long w)
	{
		if(l>rh||r<lh);
		else if(l>=lh&&r<=rh)
		{
			mn.fr+=w;
			lz+=w;
		}
		else
		{
			blc();
			p[0]->ud(lh,rh,w);
			p[1]->ud(lh,rh,w);
			mn=min(p[0]->mn,p[1]->mn);
		}
	}
	pair<long long,long long> qr(long long lh,long long rh)
	{
		if(l>rh||r<lh)
		{
			return {inf,-1};
		}
		else if(l>=lh&&r<=rh)
		{
			return mn;
		}
		else
		{
			blc();
			return min(p[0]->qr(lh,rh),p[1]->qr(lh,rh));
		}
	}
}
sg[2];

int main()
{
	long long i,ii,k,l,w,ww,z=0;
	pair<long long,long long> tmp;
	
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
	{
		for(ii=0;ii<2;ii++)
		{
			scanf("%lld",&a[ii][i]);
		}
	}
	k=0;
	for(i=n;i;i--)
	{
		k+=a[1][i];
		wg[i]=k+inf*!k;
		z+=k;
	}
	d=k;
	sg[0].bd(1,n);
	k=0;
	for(i=1;i<=n;i++)
	{
		k+=(wg[i]<=0||wg[i]==inf)*2-1;
		if(a[0][i])
		{
			wg[i]=k;
		}
		else
		{
			wg[i]=inf;
		}
	}
	sg[1].bd(1,n);
	for(;d;)
	{
		tmp=sg[1].qr(1,n);
		k=tmp.sc;
		w=tmp.fr;
		tmp=sg[0].qr(1,k);
		ww=min(min(tmp.fr,a[0][k]),d);
		z+=w*ww;
		d-=ww;
		a[0][k]-=ww;
		if(!a[0][k])
		{
			sg[1].ud(k,k,inf);
		}
		sg[0].ud(1,k,-ww);
		for(;1;)
		{
			tmp=sg[0].qr(1,k);
			l=tmp.sc;
			w=tmp.fr;
			if(w)
			{
				break;
			}
			sg[1].ud(l,n,2);
			sg[0].ud(l,l,inf);
		}
	}
	printf("%lld\n",z);
}

Compilation message (stderr)

bulves.cpp: In function 'int main()':
bulves.cpp:89:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld",&n);
  ~~~~~^~~~~~~~~~~
bulves.cpp:94:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%lld",&a[ii][i]);
    ~~~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...