P1081 95pt求助
查看原帖
P1081 95pt求助
124918
LinkyChristian楼主2021/11/25 19:36
#include<bits/stdc++.h>
#define N 400010
#define int long long
using namespace std;
struct node{int id,h;}c[N];
int operator<(node a1,node a2) {return (a1.h==a2.h)?a1.id<a2.id:a1.h<a2.h;}
int d(int a1,int a2) {return a1-a2<0?a2-a1:a1-a2;}
int n,m,x0,f[N][22][2],db[N][22][2],da[N][22][2],t1,t2,t3,INF=1e16,his=-INF,ansid;
multiset<node> st;
set<node>::iterator IT,nxt,nxtt,pre,pree;
double bis=INF*1.0;
node solve(int id,int num) {
    node ans;
    ans.id=ans.h=0;
    for(int i=20; i>=0; i--)
        if(f[id][i][1]!=-1&&num-db[id][i][1]-da[id][i][1]>=0) 
            ans.id+=da[id][i][1],ans.h+=db[id][i][1],
            num=num-db[id][i][1]-da[id][i][1],id=f[id][i][1];
    return ans; 
}
signed main()
{
//  freopen("1081_8.in","r",stdin);
//  freopen("output.txt","w",stdout);
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>c[i].h;
        c[i].id=i;
    }
    st.insert(node{-1,INF}),st.insert(node{-1,INF});;
    st.insert(node{-1,-INF}),st.insert(node{-1,-INF});
    for(int i=n; i>=1; i--) {
        st.insert(c[i]);
        IT=st.lower_bound(c[i]),nxt=++IT,nxtt=++IT,--IT,--IT,pre=--IT,pree=--IT,++IT,++IT;
        if((t1=d((*nxt).h,c[i].h))<(t3=d((*pre).h,c[i].h))) {
            f[i][0][0]=(*nxt).id,db[i][0][0]=t1;
            if((t2=d((*nxtt).h,c[i].h))<d((*pre).h,c[i].h)) 
                f[i][0][1]=(*nxtt).id,da[i][0][1]=t2;
            else f[i][0][1]=(*pre).id,da[i][0][1]=t3;
        } else {
            f[i][0][0]=(*pre).id,db[i][0][0]=t3;
            if((t2=d((*pree).h,c[i].h))<d((*nxt).h,c[i].h))
                f[i][0][1]=(*pree).id,da[i][0][1]=t2;
            else f[i][0][1]=(*nxt).id,da[i][0][1]=t1;
        }
        if(f[i][0][0]==-1) db[i][0][0]=0;
        if(f[i][0][1]==-1) da[i][0][1]=0;
    }
    for(int i=1; i<=n; i++) 
        f[i][1][1]=f[f[i][0][1]][0][0],
        db[i][1][1]=db[f[i][0][1]][0][0],da[i][1][1]=da[i][0][1];
    for(int k=2; k<21; k++)
        for(int i=1; i<=n; i++) 
            f[i][k][1]=f[f[i][k-1][1]][k-1][1],
            db[i][k][1]=db[i][k-1][1]+db[f[i][k-1][1]][k-1][1],
            da[i][k][1]=da[i][k-1][1]+da[f[i][k-1][1]][k-1][1];
    cin>>x0;
    for(int i=1; i<=n; i++) {
        node res=solve(i,x0);
        double ns=(res.h?(double)res.id/(double)res.h:1.0*INF); 
        if(bis-ns>0) bis=ns,his=c[i].h,ansid=i;
        else if(fabs(ns-bis)<1e-6&&c[i].h>his) his=c[i].h,ansid=i;
    }
    cout<<ansid<<endl;
    cin>>m;
    for(int i=1; i<=m; i++) {
        int si,xi;
        cin>>si>>xi;
        node otpt=solve(si,xi);
        cout<<otpt.id<<" "<<otpt.h<<endl;
    }
    return 0;
}
2021/11/25 19:36
加载中...