卡95 WA#8
查看原帖
卡95 WA#8
218517
Mr_H2T楼主2021/7/7 15:14

rt,Data#8 第二类提问的

4766247662 216093745216093745

这一组数据出现了问题(第17827行), 答案输出:

1286946912869469 63137586313758

我是:

1280598212805982 63697396369739

其余完全正确,求解答。

#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);}
}

2021/7/7 15:14
加载中...