rt,Data#8 第二类提问的
47662 216093745
这一组数据出现了问题(第17827行), 答案输出:
12869469 6313758,
我是:
12805982 6369739
其余完全正确,求解答。
#include<bits/stdc++.h>
#define int long long
#define rint register int
#define fu(i,a,b,d,c) for(rint i=a;i<=b&&c;i+=d)
#define fd(i,a,b,d,c) for(rint i=a;i>=b&&c;i-=d)
using namespace std;
inline int read(){
char c=0,f=1;int num=0;
while(c<'0'||c>'9'&&c!='-')((c=getchar())=='-')&&(f=-f);
while(c>='0'&&c<='9')num=(num<<1)+(num<<3)+(c^48),c=getchar();
return num*f;
}
inline int aabs(int x){return x>0?x:-x;}
const int MAXN=100050;
struct node{int id,h;};
vector<node> c;
bool operator<(node a,node b){return a.h<b.h;}
int n,m,h[MAXN],KMAX;
int ga[MAXN][23][2],gb[MAXN][23][2],f[MAXN][23][2];
void solve1(int x){
double minnum=1.0f/0.0f;
int minid=0;
fu(i,1,n,1,1){
int GA=0,GB=0,nowat=i;
fd(k,KMAX,0,1,1){
if(f[nowat][k][0]&&GA+GB+ga[nowat][k][0]+gb[nowat][k][0]<=x){
GA+=ga[nowat][k][0];
GB+=gb[nowat][k][0];
nowat=f[nowat][k][0];
}
}
if((double)(GA)/(double)(GB)<minnum||(double)(GA)/(double)(GB)==minnum&&h[i]>h[minid]){
minid=i;
minnum=(double)(GA)/(double)(GB);
}
}
printf("%d\n",minid);
}
void solve2(int s,int x){
int GA=0,GB=0,nowat=s;
fd(k,KMAX,0,1,1){
if(f[nowat][k][0]&&GA+GB+ga[nowat][k][0]+gb[nowat][k][0]<=x){
GA+=ga[nowat][k][0];
GB+=gb[nowat][k][0];
nowat=f[nowat][k][0];
}
}
printf("%d %d\n",GA,GB);
}
signed main(){
freopen("tour.in","r",stdin);
freopen("tour.out","w",stdout);
n=read();KMAX=(int)(log2(n))+1;
fu(i,1,n,1,1)h[i]=read(),c.push_back(node{i,h[i]});
sort(c.begin(),c.end());
int NNN=n;
fu(i,1,n,1,1){
if(NNN==1)continue;
int ind=lower_bound(c.begin(),c.end(),(node){i,h[i]})-c.begin();
if(NNN==2){
f[i][0][1]=c[1-ind].id;gb[i][0][1]=aabs(c[ind].h-c[1-ind].h);
c.erase(c.begin()+ind);NNN--;
continue;
}
if(ind>0&&ind<NNN-1){
if(c[ind+1].h-c[ind].h<c[ind].h-c[ind-1].h){
f[i][0][1]=c[ind+1].id;gb[i][0][1]=c[ind+1].h-c[ind].h;
if(ind==NNN-2)f[i][0][0]=c[ind-1].id,ga[i][0][0]=c[ind].h-c[ind-1].h;
else{
if(c[ind+2].h-c[ind].h<c[ind].h-c[ind-1].h)f[i][0][0]=c[ind+2].id,ga[i][0][0]=c[ind+2].h-c[ind].h;
else f[i][0][0]=c[ind-1].id,ga[i][0][0]=c[ind].h-c[ind-1].h;
}
}else if(c[ind+1].h-c[ind].h==c[ind].h-c[ind-1].h){
if(c[ind+1].h<c[ind-1].h)f[i][0][1]=c[ind+1].id,f[i][0][0]=c[ind-1].id,
gb[i][0][1]=c[ind+1].h-c[ind].h,ga[i][0][0]=c[ind].h-c[ind-1].h;
else f[i][0][1]=c[ind-1].id,f[i][0][0]=c[ind+1].id,
gb[i][0][1]=c[ind].h-c[ind-1].h,ga[i][0][0]=c[ind+1].h-c[ind].h;
}else{
f[i][0][1]=c[ind-1].id;gb[i][0][1]=c[ind].h-c[ind-1].h;
if(ind==1)f[i][0][0]=c[ind+1].id,ga[i][0][0]=c[ind+1].h-c[ind].h;
else{
if(c[ind].h-c[ind-2].h<c[ind+1].h-c[ind].h)f[i][0][0]=c[ind-2].id,ga[i][0][0]=c[ind].h-c[ind-2].h;
else f[i][0][0]=c[ind+1].id,ga[i][0][0]=c[ind+1].h-c[ind].h;
}
}
}
else if(ind==0){
f[i][0][1]=c[ind+1].id;gb[i][0][1]=c[ind+1].h-c[ind].h;
f[i][0][0]=c[ind+2].id;ga[i][0][0]=c[ind+2].h-c[ind].h;
}else{
f[i][0][1]=c[ind-1].id;gb[i][0][1]=c[ind].h-c[ind-1].h;
f[i][0][0]=c[ind-2].id;ga[i][0][0]=c[ind].h-c[ind-2].h;
}
c.erase(c.begin()+ind);NNN--;
}
fu(k,1,KMAX,1,1){
fu(i,1,n,1,1){
if(k==1){
f[i][k][0]=f[f[i][0][0]][0][1];
f[i][k][1]=f[f[i][0][1]][0][0];
}
else f[i][k][0]=f[f[i][k-1][0]][k-1][0],
f[i][k][1]=f[f[i][k-1][1]][k-1][1];
}
}
fu(k,1,KMAX,1,1){
fu(i,1,n,1,1){
if(k==1){
ga[i][k][0]=ga[i][0][0];ga[i][k][1]=ga[f[i][0][1]][0][0];
gb[i][k][1]=gb[i][0][1];gb[i][k][0]=gb[f[i][0][0]][0][1];
}
else ga[i][k][0]=ga[i][k-1][0]+ga[f[i][k-1][0]][k-1][0],
ga[i][k][1]=ga[i][k-1][1]+ga[f[i][k-1][1]][k-1][1],
gb[i][k][0]=gb[i][k-1][0]+gb[f[i][k-1][0]][k-1][0],
gb[i][k][1]=gb[i][k-1][1]+gb[f[i][k-1][1]][k-1][1];
}
}
solve1(read());
m=read();
fu(i,1,m,1,1){int x=read(),y=read();solve2(x,y);}
}