CF1981C求调
  • 板块学术版
  • 楼主LYXin
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/5/31 21:20
  • 上次更新2024/6/1 07:48:52
查看原帖
CF1981C求调
208059
LYXin楼主2024/5/31 21:20

RT,WA on #5

#include<cstdio>
#define ll long long
using namespace std;
const int N=2e5+5;
int t,n,cnt,wz[N],L[N];
ll a[N],m2[40];
bool F;
void Spec(){
	for(int i=wz[1]-1;i>=1;--i){
		a[i]=a[i+1]*2ll;
		if(a[i]>114514) a[i]=a[i+1]/2ll;
	}
	for(int i=wz[cnt]+1;i<=n;++i){
		a[i]=a[i-1]*2ll;
		if(a[i]>114514) a[i]=a[i-1]/2ll;
	}
}
int find(ll x){
	for(int i=0;i<=35;++i)
		if(x<m2[i]) return i;
}
ll num,num1,num2;
int lm,no,nwz,nr;
void Work1(int s){
	int cmin=0;
	num=a[wz[s]];
	nwz=wz[s];
	for(int i=L[s];i>L[s+1];--i){
		num/=2ll;++cmin;++nwz;
		a[nwz]=num;
	}
	if(cmin>(wz[s+1]-wz[s])){
		F=true;
		return ;
	}
	num1=num;num2=a[wz[s+1]];
	no=0;lm=0;
	while(num1!=0){
		++no;
		if((num1%2ll)!=(num2%2ll)) lm=no;
		num1/=2ll;num2/=2ll;
	}
	cmin+=lm*2;
	if(cmin>(wz[s+1]-wz[s])){
		F=true;
		return ;
	}
	num1=num;num2=a[wz[s+1]];
	for(int i=1;i<=lm;++i){
		++nwz;
		num1/=2ll;
		a[nwz]=num1;
	}
	nr=wz[s+1];
	for(int i=1;i<=lm;++i){
		num2/=2ll;
		--nr;
		a[nr]=num2;
	}
	if((nr-nwz)%2!=0){
		F=true;
		return ;
	}
	for(int i=nwz+1;i<nr;i+=2){
		a[i]=a[i-1]*2ll;
		a[i+1]=a[i-1];
		if(a[i-1]*2ll>114514){
			a[i]=a[i-1]/2ll;
			a[i+1]=a[i-1];
		}
	}
}
void Work2(int s){
	int cmin=0;
	num=a[wz[s+1]];
	nwz=wz[s+1];
	for(int i=L[s+1];i>L[s];--i){
		num/=2ll;++cmin;--nwz;
		a[nwz]=num;
	}
	if(cmin>(wz[s+1]-wz[s])){
		F=true;
		return ;
	}
	num1=num;num2=a[wz[s]];
	no=0;lm=0;
	while(num1!=0){
		++no;
		if((num1%2ll)!=(num2%2ll)) lm=no;
		num1/=2ll;num2/=2ll;
	}
	cmin+=lm*2;
	if(cmin>(wz[s+1]-wz[s])){
		F=true;
		return ;
	}
	num1=num;num2=a[wz[s]];
	for(int i=1;i<=lm;++i){
		--nwz;
		num1/=2ll;
		a[nwz]=num1;
	}
	nr=wz[s];
	for(int i=1;i<=lm;++i){
		num2/=2ll;
		++nr;
		a[nr]=num2;
	}
	if((nwz-nr)%2!=0){
		F=true;
		return ;
	}
	for(int i=nr+1;i<nwz;i+=2){
		a[i]=a[i-1]*2ll;
		a[i+1]=a[i-1];
		if(a[i-1]*2ll>114514){
			a[i]=a[i-1]/2ll;
			a[i+1]=a[i-1];
		}
	}
}
int main(){
	scanf("%d",&t);
	m2[0]=1;
	for(int i=1;i<=35;++i)
		m2[i]=m2[i-1]*2ll;
	while(t--){
		scanf("%d",&n);
		cnt=0;
		for(int i=1;i<=n;++i){
			scanf("%lld",&a[i]);
			if(a[i]!=-1){
				wz[++cnt]=i;
				L[cnt]=find(a[i]);
			}
		}
		if(cnt==0){
			for(int i=1;i<=n;++i){
				if(i%2==0) printf("1 ");
				else printf("2 ");
			}
			printf("\n");
			continue;
		}
		
		Spec();
		
		F=false;
		for(int i=1;i<cnt;++i){
			if(wz[i]+1==wz[i+1]){
				if((a[wz[i]]!=a[wz[i+1]]/2ll)&&(a[wz[i]]/2ll!=a[wz[i+1]])){
					F=true;
					break;
				}
				continue;
			}
				
			if(a[wz[i]]>=a[wz[i+1]]) Work1(i);
			else Work2(i);
			if(F) break;
		}
		
		if(F){
			printf("-1\n");
			continue;
		}
		for(int i=1;i<=n;++i)
			printf("%lld ",a[i]);
		printf("\n");
	}
	return 0;
}
2024/5/31 21:20
加载中...