1,西安icpc E. Find Maximum
1,E. Find Maximum
思路:没什么思路;
对着打出来的表盯一个小时,发现了f(x)与x的三进制的关系;
从左到右依次是x,x的三进制表示,f(x),自己写的关系式,代码如下:
void san(int x)
{
int x1=x;
vector<int>xl;
while(x1)
{
xl.emplace_back(x1%3);
x1/=3;
}
sum=xl.size();
per2(i,xl.size()-1,0)cout<<xl[i],sum+=xl[i];
}
sum就是第四列的数,
所以可以看出,f(x)与三进制数的关系就是三进制序列长度加上每一位的数值;
接下来就是在l,r区间内构造合法的最优解;
分类如代码所示:
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define rep1(i,a,n) for( int i=(a);i<(n);++i)
#define rep2(i,a,n) for( int i=(a);i<=(n);++i)
#define per1(i,n,a) for( int i=(n);i>(a);i--)
#define per2(i,n,a) for( int i=(n);i>=(a);i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define memset(a,i,b) memset((a),(i),sizeof (b))
#define memcpy(a,i,b) memcpy((a),(i),sizeof (b))
#define endl "\n"
#define lowbit(m) ((-m)&(m))
#define dbug(y) cout<<(y)<<"\n"
#define dbug2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define dbug3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define dbug4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define tulun int e[N],ne[N],h[N],w[N],idx
#define add2(a,b) e[idx]=b,ne[idx]=h[a],h[a]=idx++
#define add3(a,b,c) w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++
#define T_solve() int T;cin>>T;while(T--)solve()
#define pi 3.14159265358979323846
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<long long,long long> PLL;
typedef double dob;
const int N=5e2+10,mod=1e6+3,base=131;
#define int LL
vector<int>xll,xlr;
int sizl,sizr;
int st_r()
{
int st=xlr[0]+sizr;
rep1(i,1,sizr)
{
st+=xlr[i];
}
return st;
}
int st_l()
{
int st=xll[0]+sizl;
rep1(i,1,sizl)
{
st+=xll[i];
}
return st;
}
int get_st_2x22()
{
int st_2x22=2+sizr;
int f=0;
rep1(i,1,sizr)
{
if(xlr[i]&&f==0)
{
st_2x22+=xlr[i]-1;
f=1;
continue;
}
if(f)st_2x22+=2;
}
return st_2x22;
}
int get_st_2x22P()
{
int st_2x22=2+sizr;
int f=0;
rep1(i,1,sizr)
{
if(xlr[i]&&f==0&&xlr[i]>xll[i])
{
st_2x22+=xlr[i]-1;
f=1;
continue;
}
else if(!f)st_2x22+=xlr[i];
if(f)st_2x22+=2;
}
return st_2x22;
}
int get_st_1x22()
{
int st_1x22=1+sizr;
int f=0;
rep1(i,1,sizr)
{
if(xlr[i]&&f==0)
{
st_1x22+=xlr[i]-1;
f=1;
continue;
}
if(f)st_1x22+=2;
}
return st_1x22;
}
int get_st_1x22P()
{
int st_1x22=1+sizr;
int f=0;
rep1(i,1,sizr)
{
if(xlr[i]&&f==0&&xlr[i]>xll[i])
{
st_1x22+=xlr[i]-1;
f=1;
continue;
}
else if(f==0)st_1x22+=xlr[i];
if(f)st_1x22+=2;
}
return st_1x22;
}
int get_st_122()
{
int st=1+sizr+(sizr-1)*2;
return st;
}
void solve()
{
int l,r;
cin>>l>>r;
xll.clear();
xlr.clear();
int l1=l,r1=r;
while(l1)
{
xll.emplace_back(l1%3);
l1/=3;
}
reverse(xll.begin(),xll.end());
while(r1)
{
xlr.emplace_back(r1%3);
r1/=3;
}
reverse(xlr.begin(),xlr.end());
sizl=xll.size();
sizr=xlr.size();
int str=st_r();
if(l==r)
{
dbug(str);
return;
}
if(sizl!=sizr)
{
int maxl=(sizr-1)*3;
if(xlr[0]==1)
{
int st_1x22=get_st_1x22();
dbug(max(max(str,maxl),st_1x22));
}
else
{
int st_122=get_st_122();
int st_2x22=get_st_2x22();
dbug(max(max(maxl,st_122),max(st_2x22,str)));
}
}
else
{
if(xll[0]==1&&xlr[0]==1)
{
int st_1x22=get_st_1x22P();
dbug(max(st_1x22,str));
}
else if(xll[0]==1&&xlr[0]==2)
{
int st_122=get_st_122();
int st_2x22=get_st_2x22();
dbug(max(st_122,max(st_2x22,str)));
}
else
{
int st_2x22=get_st_2x22P();
dbug(max(st_2x22,str));
}
}
}
signed main()
{
quick_cin();
T_solve();
return 0;
}