D题怎么优化?

#include <bits/stdc++.h>
#define ll unsigned long long 
using namespace std;
const ll N=1e18;
ll ans=1;
map<ll,int> m;  //map让所有2的幂赋1
ll a[100];
int c=0;
void mi2(){//让所有2的幂赋1
	while (ans<=N){
		m[ans]=1;
		a[++c]=ans;
		ans*=2;
	}
}
ll cnt=0;
int main(){
	mi2();
	int T;
	scanf("%d",&T);
	while (T--){
		cnt=0;
		ll n;
		scanf("%lld",&n);
		cnt=0;
		ll N=n;
		if (m[n]==1){//2的幂直接出2*n-1
			printf("%lld\n",2*n-1);
			continue;
		}
		while (n>2){
			while (m[n]!=1){
				n=n/2; 
			}
			cnt+=n;
			n=n+1;
		}
		printf("%lld\n",2*(-cnt+(*upper_bound(a+1,a+c+1,N)))-1);
	}
	return 0;
}
这样写一直超时,但是我大概算了一下也才O(T*log(n))啊,为什么会超时
全部评论

相关推荐

弦五Strings:他之所以会举报你代课是因为在这种人眼里正常上课就是正义代课就是邪恶,典型二极管思维,处理方法就是私下沟通,你就说你自己家里经济困难或者家里父母生病什么之类的,需要去打工挣钱,用尽孝的正义对冲他认为的上课的正义,他可能就妥协了。
我的实习日记
点赞 评论 收藏
分享
点赞 评论 收藏
分享
昨天 18:37
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务