22/11/28

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dull丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值