1 条题解
-
1
废话不多说,上代码!
#include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> const long long maxlongint=2147483647; using namespace std; struct lyd { long long last; long long next; }; lyd a[200000]; long long h[200000][2],c[200000][5][3],qu[200000][3],yh[200000],lf[3],n,m,tot,sum,num,g[150000][17],fa[150000][17],fb[150000][17]; double ans; void q(long long l,long long r) { long long i=l,j=r,mid=h[(l+r)/2][1],e; while(i<j) { while(h[i][1]<mid) i++; while(h[j][1]>mid) j--; if(i<=j) { e=h[i][0]; h[i][0]=h[j][0]; h[j][0]=e; e=h[i][1]; h[i][1]=h[j][1]; h[j][1]=e; i++; j--; } } if(i<r) q(i,r); if(l<j) q(l,j); } int work(long long x,long long value) { long long i,j,k=0,l; for(i=log2(n);i>=0;i--) { if(fa[x][i]+fb[x][i]+k<=value) { k+=fa[x][i]+fb[x][i]; lf[0]+=fa[x][i]; lf[1]+=fb[x][i]; x=g[x][i]; } } if(c[x][2][1]+k<=value) { k+=c[x][2][1]; lf[0]+=c[x][2][1]; } } int main() { long long i,j,k,l,x,y; scanf("%lld",&n); for(i=1;i<=n;i++) { scanf("%lld",&h[i][1]); yh[i]=h[i][1]; h[i][0]=i; } scanf("%lld",&qu[0][2]); scanf("%lld",&m); for(i=1;i<=m;i++) { scanf("%lld%lld",&qu[i][1],&qu[i][2]); } q(1,n); for(i=1;i<=n;i++) { a[h[i][0]].last=h[i-1][0]; a[h[i][0]].next=h[i+1][0]; } for(i=1;i<=n;i++) { j=i; while(a[j].last!=0) { j=a[j].last; if(j<i) { a[a[j].next].last=a[j].last; a[a[j].last].next=a[j].next; j=a[j].last; } if(j!=0) { c[i][0][0]++; c[i][c[i][0][0]][0]=j; c[i][c[i][0][0]][1]=abs(yh[i]-yh[j]); c[i][c[i][0][0]][2]=yh[j]; if(c[i][0][0]==2) break; } } j=i; while(a[j].next!=0) { j=a[j].next; if(j<i) { a[a[j].next].last=a[j].last; a[a[j].last].next=a[j].next; j=a[j].next; } if(j!=0) { c[i][0][0]++; c[i][c[i][0][0]][0]=j; c[i][c[i][0][0]][1]=abs(yh[i]-yh[j]); c[i][c[i][0][0]][2]=yh[j]; if(c[i][0][0]==4) break; } } for(j=1;j<=c[i][0][0];j++) { for(k=1;k<=c[i][0][0];k++) if(c[i][j][1]<c[i][k][1] || c[i][j][1]==c[i][k][1] && c[i][j][2]<c[i][k][2]) { l=c[i][k][1]; c[i][k][1]=c[i][j][1]; c[i][j][1]=l; l=c[i][k][0]; c[i][k][0]=c[i][j][0]; c[i][j][0]=l; l=c[i][k][2]; c[i][k][2]=c[i][j][2]; c[i][j][2]=l; } } } for(i=1;i<=n;i++) { g[i][0]=c[c[i][2][0]][1][0]; fa[i][0]=c[i][2][1]; fb[i][0]=c[c[i][2][0]][1][1]; } for(j=1;j<=log2(n);j++) { for(i=1;i<=n;i++) { g[i][j]=g[g[i][j-1]][j-1]; fa[i][j]=fa[i][j-1]+fa[g[i][j-1]][j-1]; fb[i][j]=fb[i][j-1]+fb[g[i][j-1]][j-1]; } } ans=double(maxlongint); for(i=1;i<=n;i++) { lf[0]=lf[1]=0; work(i,qu[0][2]); if(lf[1]!=0) if(double(lf[0])/double(lf[1])<ans) { ans=double(lf[0])/double(lf[1]); num=i; } } cout<<num<<endl; for(i=1;i<=m;i++) { lf[0]=lf[1]=0; work(qu[i][1],qu[i][2]); printf("%lld %lld\n",lf[0],lf[1]); } }
已AC,放心食用!使用完点个赞哦!!!👍
- 1
信息
- ID
- 1491
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 32
- 已通过
- 20
- 上传者