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;
}