过了,但我也有“钉子精神”
查看原帖
过了,但我也有“钉子精神”
313567
王子轩320404楼主2020/8/18 11:13
#include<set>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
	int key,val;
	bool operator<(const node b)const {
        if(val!=b.val)
		    return val<b.val;
        else return key<b.key;
    }
};
int m,n,ans;
int s[100001],x[100001];
node A[100001],B[100001],h[100001],may[5];
int f[21][100001][2],fA[21][100001][2],fB[21][100001][2];
set<node> S;
node go(int sta,int step) {
    int a=0,b=0;
    for(int i=20;i>=0;i--)
        if(f[i][sta][0]&&a+b+fA[i][sta][0]+fB[i][sta][0]<=step) {
            a+=fA[i][sta][0];
            b+=fB[i][sta][0];
            sta=f[i][sta][0];
        }
    return (node){a,b};
}
bool cmp(node a,node b) {
    return a.val<b.val;
}
int main() {
	node temp;
	double max,quo;
	S.insert((node){0,-2147483647});
    S.insert((node){0,-2147483646});
    S.insert((node){0,2147483646});
    S.insert((node){0,2147483647});
	cin>>n;
    for(int i=1;i<=n;i++) {
	    cin>>h[i].val;
	    h[i].key=i;
	}
	cin>>x[0]>>m;
	for(int i=1;i<=m;i++)
	    cin>>s[i]>>x[i];
	for(int i=n;i>=1;i--) {
	    S.insert(h[i]);
        may[1]=*--S.lower_bound(h[i]);
        may[2]=*--S.lower_bound(may[1]);
        may[3]=*S.upper_bound(h[i]);
        may[4]=*S.upper_bound(may[3]);
        for(int j=1;j<=4;j++)
		    may[j].val=abs(may[j].val-h[i].val);
        sort(may+1,may+5,cmp);
        A[i]=may[2];
        B[i]=may[1];
	}
	for(int i=1;i<=n;i++) {
        f[0][i][0]=A[i].key;
        f[0][i][1]=B[i].key;
    }
    for(int i=1;i<=20;i++)
    	for(int j=1;j<=n;j++)
	        if(j+(1<<i)<=n)
		        for(int k=0;k<=1;k++)
			        if(i==1)
				        f[1][j][k]=f[0][f[0][j][k]][1-k];
				    else
				        f[i][j][k]=f[i-1][f[i-1][j][k]][k];
	for(int i=1;i<=n;i++) {
        fA[0][i][0]=A[i].val;
        fA[0][i][1]=0;
    }
    for(int i=1;i<=20;i++)
        for(int j=1;j<=n;j++)
	        if(j+(1<<i)<=n)
		        for(int k=0;k<=1;k++)
                    if(i==1)
                        fA[1][j][k]=fA[0][j][k]+fA[0][f[0][j][k]][1-k];
                    else
					    fA[i][j][k]=fA[i-1][j][k]+fA[i-1][f[i-1][j][k]][k];
	for(int i=1;i<=n;i++) {
        fB[0][i][0]=0;
        fB[0][i][1]=B[i].val;
    }
    for(int i=1;i<=20;i++)
        for(int j=1;j<=n;j++)
	        if(j+(1<<i)<=n)
		        for(int k=0;k<=1;k++)
				    if(i==1)
                        fB[1][j][k]=fB[0][j][k]+fB[0][f[0][j][k]][1-k];
                    else
					    fB[i][j][k]=fB[i-1][j][k]+fB[i-1][f[i-1][j][k]][k];
	max=2000000000;
	for(int i=1;i<=n;i++) {
		temp=go(i,x[0]);
		if(temp.val==0)
		    continue;
        quo=(double)temp.key/(double)temp.val;
        if(quo<max||quo==0) {
        	max=quo;
        	ans=i;
		}
	}
	if(ans!=0)
	    cout<<ans;
	else
	    cout<<n;
	for(int i=1;i<=m;i++) {
		cout<<endl;
		temp=go(s[i],x[i]);
        cout<<temp.key<<' '<<temp.val;
	}	
	return 0;
}

95pts

S.insert((node){0,-2147483647});
S.insert((node){0,-2147483646});
S.insert((node){0,2147483646});
S.insert((node){0,2147483647});

改成

S.insert((node){0,-2000000002});
S.insert((node){0,-2000000001});
S.insert((node){0,2000000001});
S.insert((node){0,2000000002});

则AC

这是为什么啊???

2020/8/18 11:13
加载中...