萌新刚学跳表1ms,30pts求助
查看原帖
萌新刚学跳表1ms,30pts求助
171544
cp152楼主2021/8/26 10:12

TLE了七个点,只A了#1#6#9 求助

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long A=493564916,B=346182549,MO=1000000007;//乱敲的数 
bool rndm()
{
	A*=B;
	A%=MO;
	return A%2;
}
//以上部分用于生成随机数 
long long n;
struct ABC{
	long long num,nxt,lst,dwn;
}a[2000000];
long long h;
long long top;
long long cs;
long long ans;
long long sum;
long long tmp[100005];
void add(int x)
{
	int i=h,j=cs;
	while(1)
	{
		tmp[j]=i;
		if(a[a[i].nxt].num<x)	i=a[i].nxt;
		else if(j==1)			break;
		else
		{
			j--;
			i=a[i].dwn;
		}
	}
	++top;
	a[top].num=x;
	a[top].nxt=a[i].nxt;
	a[top].lst=i;
	a[top].dwn=0;
	a[a[i].nxt].lst=top;
	a[i].nxt=top;
	for(j=2;j<=cs;j++)
	{
		if(rndm())
		{
			break;
		}
		i=tmp[j];
		++top;
		a[top].num=x;
		a[top].nxt=a[i].nxt;
		a[top].lst=a[a[i].nxt].lst;
		a[top].dwn=top-1;
		a[a[i].nxt].lst=top;
		a[i].nxt=top;
	}
	if((j==cs||cs==1)&&rndm())
	{
		cs++;
		++top;
		a[top].num=x;
		a[top].nxt=1;
		a[top].dwn=top-1;
		a[top].lst=top+1;
		++top;
		a[top].num=-1e16;
		a[top].lst=0;
		a[top].nxt=top-1;
		a[top].dwn=h;
		h=top;
	}
	return;
}
void del(int now)
{
	if(a[now].num==a[now+1].num)	del(now+1);
	if(a[now].nxt==1&&a[a[now].lst].lst==0)
	{
		a[now].num=1e16;
		if(cs>1)
		{
			cs--;
			h=a[h].dwn;
		}
		return;
	}
	a[a[now].lst].nxt=a[now].nxt;
	a[a[now].nxt].lst=a[now].lst;
	a[now].num=1e16;
	return;
}
void find(int x)
{
	int i=h,j=cs;
	while(1)
	{
		if(a[a[i].nxt].num<x)	i=a[i].nxt;
		else if(j==1)			break;
		else
		{
			j--;
			i=a[i].dwn;
		}
	}
	if(x-a[i].num>a[a[i].nxt].num-x)	i=a[i].nxt;
	ans+=abs(x-a[i].num);
	ans%=1000000;
	del(i);
	return;	
}
int main()
{
	cs=1;
	a[++top].num=1e16;
	a[++top].num=-1e16;
	a[top].nxt=1;
	a[top].lst=0;
	a[top].dwn=0;
	h=2;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		long long x,y;
		scanf("%lld%lld",&x,&y);
		if(x==0)	x=-1;
		if(sum*x>=0)
		{
			add(y);
		}
		else
		{
			find(y);
		}
		sum+=x;
	}
	cout<<ans;
	return 0;
}

2021/8/26 10:12
加载中...