MLE求助
查看原帖
MLE求助
412902
laplace_oo楼主2022/10/13 11:55
#include <bits/stdc++.h>

namespace iio
{
	template<typename T=int>
	inline T read()
	{
		T s=1,i=0;
		char c=getchar();
		while(c<'0'||c>'9')
		{
			if(c=='-')
				s=-1;
			c=getchar();
		}
		while(c>='0'&&c<='9')
		{
			i=(i<<3)+(i<<1)+(c^48);
			c=getchar();
		}
		return s*i;
	}
	template<typename T=int>
	inline void write(T x)
	{
		if(x<0)
			x=-x,putchar('-');
		if(x>9)
			write(x/10);
		putchar(char(x%10)+'0');
	}
}

using namespace iio;
using namespace std;

typedef long long ll;

map<pair<ll,int>,ll> l, r, m;

ll fl(ll _n)
{
	if (l.count({_n,_n & 1}))
		return l[{_n,_n & 1}];
	if (_n == 1) return 1LL;
	ll middle = (1 + _n) >> 1;
	ll left = middle;
	ll right = _n - middle;
	return l[{_n,_n & 1}] = fl(left) + fl(right) + right - 1;
}

ll fr(ll _n)
{
	if (r.count({_n,_n & 1}))
		return r[{_n,_n & 1}];
	if (_n == 1) return 1LL;
	ll middle = (1 + _n) >> 1;
	ll left = middle;
	ll right = _n - middle;
	return r[{_n,_n & 1}] = fr(right) + fr(left) + left - 1;
}

ll f(ll _n)
{
	if (m.count({_n,_n & 1}))
		return m[{_n,_n & 1}];
	if (_n == 1) return 1LL;
	ll middle = (1 + _n) >> 1;
	ll left = middle;
	ll right = _n - middle;
	return m[{_n,_n & 1}] = f(left) + f(right) + fr(left) * (right) + fl(right) * left - 1;
}

signed main()
{
	int T;
	T = read();
	for (int i = 1; i <= T; ++i)
	{
		l.clear();
		r.clear();
		m.clear();
		ll n = read();
		write<ll>(f(n));
		putchar('\n');
	}

	return 0;
}
2022/10/13 11:55
加载中...