蒟蒻80分求组orz
查看原帖
蒟蒻80分求组orz
146837
吴铭轼楼主2020/11/26 11:23

RT

#include <bits/stdc++.h>
using namespace std;
int n;
struct zdq{
	long long a;
	int num;
}a[100005];
int nxt[2][100005][20];
long long l[2][2][100005][20];
struct lian{
	int l,r;
}ln[100005];
bool cmp(zdq x,zdq y)
{
	return x.a<y.a;
}
bool cmp2(zdq x,zdq y)
{
	return x.num<y.num;
}
long long L(int i,int j,int k)
{
	return l[i][i][j][k]+l[i][i^1][j][k];
}
pair<long long,long long> getl(long long now,long long k)
{
	long long la=0,lb=0;
	for(int i=19;i>=0;i--){
        if(nxt[1][now][i] && la+lb+l[1][0][now][i]+l[1][1][now][i]<=k){
            la+=l[1][1][now][i];
            lb+=l[1][0][now][i];
            now=nxt[1][now][i];
        }
    }
    if(nxt[1][now][0]&&la+lb+l[1][1][now][0]<=k)
	la+=l[1][1][now][0];
	return {la,lb};
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].a ;
		a[i].num=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=n;i>=1;i--)
	{
		ln[a[i].num ].l=a[i-1].num ;
		ln[a[i].num ].r=a[i+1].num ;
	}
	sort(a+1,a+n+1,cmp2);
	a[0].a=-1e18,a[n+1].a=1e18;
	l[0][0][0][0]=l[0][1][0][0]=l[1][0][0][0]=l[1][1][0][0]=1e18;
	for(int i=1;i<=n;i++)
	{
		//cout<<a[i].num<<" "<<a[i].a<<" "<<ln[i].l<<" "<<ln[i].r<<endl;
		if(a[ln[i].r].a-a[i].a<a[i].a-a[ln[i].l ].a )
		{
			nxt[0][i][0]=ln[i].r;
			if(a[ln[ln[i].r ].r ].a -a[i].a<a[i].a-a[ln[i].l ].a &&ln[ln[i].r ].r )
			nxt[1][i][0]=ln[ln[i].r ].r;
			else
			nxt[1][i][0]=ln[i].l;
		}
		else
		{
			nxt[0][i][0]=ln[i].l;
			if(a[i].a-a[ln[ln[i].l ].l ].a<=a[ln[i].r].a-a[i].a &&ln[ln[i].l ].l )
			nxt[1][i][0]=ln[ln[i].l ].l;
			else
			nxt[1][i][0]=ln[i].r;
		}
		ln[ln[i].l ].r=ln[i].r;
		ln[ln[i].r ].l=ln[i].l;
		if(nxt[0][i][0]==i)
		nxt[0][i][0]=0;
		if(nxt[1][i][0]==i)
		nxt[1][i][0]=0;
		l[0][0][i][0]=abs(a[i].a-a[nxt[0][i][0]].a );
		l[1][1][i][0]=abs(a[i].a-a[nxt[1][i][0]].a );
		l[0][1][i][0]=l[1][0][i][0]=1e18;
		//cout<<nxt[0][i][0]<<" "<<nxt[1][i][0]<<endl;
	}
	for(int i=0;i<=n;i++)
	{
		nxt[0][i][1]=nxt[1][nxt[0][i][0]][0],nxt[1][i][1]=nxt[0][nxt[1][i][0]][0];
		l[0][1][i][1]=l[1][1][nxt[0][i][0]][0];
		l[0][0][i][1]=l[0][0][i][0];
		l[1][0][i][1]=l[0][0][nxt[1][i][0]][0];
		l[1][1][i][1]=l[1][1][i][0];
	}
	for(int i=2;i<20;i++)
	{
		for(int j=0;j<=n;j++)
		{
			for(int k=0;k<=1;k++)
			{
				nxt[k][j][i]=nxt[k][nxt[k][j][i-1]][i-1];
				l[k][k][j][i]=l[k][k][j][i-1]+l[k][k][nxt[k][j][i-1]][i-1];
				l[k][k^1][j][i]=l[k][k^1][j][i-1]+l[k][k^1][nxt[k][j][i-1]][i-1];
			}
		}
	}/*
	for(int j=0;j<=n;j++)
	{
		for(int k=0;k<5;k++)
		{
			cout<<nxt[0][j][k]<<"/"<<nxt[1][j][k]<<" ";
		}
		cout<<endl;
	}
	for(int j=0;j<=n;j++)
	{
		for(int k=0;k<5;k++)
		{
			if(l[0][0][j][k]<1e8)
			cout<<l[0][0][j][k];
			else
			cout<<"INF";
			cout<<"/";
			if(l[0][1][j][k]<1e8)
			cout<<l[0][1][j][k];
			else
			cout<<"INF";
			cout<<"/";
			if(l[1][0][j][k]<1e8)
			cout<<l[1][0][j][k];
			else
			cout<<"INF";
			cout<<"/";
			if(l[1][1][j][k]<1e8)
			cout<<l[1][1][j][k];
			else
			cout<<"INF";
			cout<<" ";
		}
		cout<<endl;
	}*/
	long long x;
	cin>>x;
	long long ans;
	long double sum=1e18;
	for(int i=1;i<=n;i++)
	{
		long double la=getl(i,x).first,lb=getl(i,x).second;
		if(lb<=1e-5&&lb>=-1e-5)
		{
			la=1e18,lb=1;
		}
		if(la/lb<sum)
		{
			sum=la/lb;
			ans=i;
		}
	}
	cout<<ans<<endl;
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		long long s;
		cin>>s>>x;
		long long la=getl(s,x).first,lb=getl(s,x).second;
		cout<<la<<" "<<lb<<endl;
	}
	return 0;
}
2020/11/26 11:23
加载中...