• 2021CCPC网络选拔赛


    小去世:我正在看着视频吃着饭,突然队群里来了句:“zwt大人起床了吗。”

    赛前直接被迫犯罪。

    先说一下总体体验:非常差。

    看了各方言论,感觉也不能把锅直接甩给HDOJ,东部枢纽罪不至此。但是写题半小时提交半小时查记录半小时体验实在实在是太差了。

    队里写完AFI三道签到题其实优势很大,可惜自己拉了跨。

    A - Cut The Wire

    签中签,可惜手慢20+分钟才核对完submit还被网站恶心()。奇数答案((n-1)/3 leq x leq n),偶数答案((n+1) leq x leq 2n),记得细节处理两端奇偶即可。

    #include<bits/stdc++.h>
    #define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    #define ll long long
    #define pb push_back
    using namespace std;
    const int maxn = 1e5+10;
    int main()
    {
        fast;
        int T;
        cin>>T;
        while(T--)
        {
            ll n;
            cin>>n;
            ll tmp1=(n-1)/3;
            tmp1++;
            ll sum1=(n-tmp1),sum2=(n-1);
            sum2=sum2/2;
            sum2++;
            if(tmp1%2+n%2==0) sum1=sum1/2;
            else sum1=sum1/2+1;
            //cout<<sum1<<' '<<sum2<<'
    ';
            cout<<sum1+sum2<<'
    ';
        }   
    }

    I - Command Sequence

    队友开的题,简单地说一下,利用map分别记录每个点经过的次数(x),每个点的次数所带来的贡献为(x*(x-1)/2)。

    F - Power Sum

    当时看到平方数就想到去要做差,这样可以稳定凑到一个4,随后就是凑得模4后的余数。(1=1),(2=1-4-9+16),(3=-1+4) ,这样就可以凑得我想要的任意一个数,且保证(k leq n+2)。

    #include<bits/stdc++.h>
    #define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    #define ll long long
    #define pb push_back
    using namespace std;
    const int maxn = 1e5+10;
    int main()
    {
        fast;
        int T;
        cin>>T;
        int cnt=0;
        while(T--)
        {
            cnt=0;
            int n;
            cin>>n;
            if(n%4==0) cout<<n<<'
    ';
            if(n%4==1) cout<<n<<'
    ',cout<<"1",n-=1;
            if(n%4==2) cout<<n+2<<'
    ',cout<<"0001",n-=2;
            if(n%4==3) cout<<n-1<<'
    ',cout<<"01",n-=3;
            for(int i=1;i<=n/4;i++)
            {
                cout<<"1001";
            }
            cout<<'
    ';
        }
    }

    G - Function

    我连参与都没参与,我是菜狗,队友真强。

    L - Remove

    一直WA,最后发现自己思路是错的。

    原本想的是,记最大质数为(x),以(x leq i leq 2*x-1)这个区间为例,对于每一个不是最大质数的每一个质数,找到(p[j]-2*x \% p[j])的最大值(余数为0视为余数为(p[j])),在这个最大值前的部分答案等于(x)时的答案,后面部分(+1),每次遇到最大质数的倍数无条件(+1)。

    小去世:昨天写完上面那个公式没仔细看,Latex写烂了。(其实是根本不会Latex)

    思路完全来自于官方题解,并且T了,遗憾离场,先放着吧。

    (i geq lcm(P))时无解,这个很显然,没有办法从最小公倍数往下走了。

    在有解的情况下,答案非递减,这个算两个也能发现。(而且上面的思路也很明显地发现是非递减的)

    对于任意一个(x),存在一个因子(p),则它的转移区间为([x+1,x+p-1]),那么我的最优选择是找到最大的因子。

    由于给的都是素数,所以写了个像埃筛的东西标记每个数的最大素因子。

    接下来是求助时间:

    #include<bits/stdc++.h>
    #define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    #define ll long long
    #define pb push_back
    using namespace std;
    const int maxn = 2e6+10;
    const int maxm = 1e5+10;
    ll a[maxn];
    ll p[maxm];
    ll f[maxn];
    ll maxx=0;
    ll Lcm;
    ll n,m;
    __int128 cur[maxn];
    const __int128 mod = pow(2,64);
    void init1()
    {
        cur[0]=1;
        for(int i=1;i<=2e6;i++)
        {
            cur[i]=cur[i-1]*23333%mod;
        }
    }
    void init2(ll x)
    {
        for(int i=1;i<=m;i++)
        {
            f[p[i]]=p[i];
        }
        for(int i=1;i<=m;i++)
        {
            for(int j=p[i];j<x;j+=p[i])
            {
                f[j]=max(f[j],p[i]);
            }
        }
    }
    void Print(__int128 x)
    {
        if (x < 0)
            cout<<'-', x = -x;
        if (x > 9)
            Print(x / 10);
        cout<<(char)(x%10+48);
    }
    void print(ll x)
    {
        __int128 ans=0;
        for(int i=1;i<=x;i++)
        {
            ans=(ans+a[i]*cur[x-i])%mod;
        }
        Print(ans);
        cout<<'
    ';
    }
    int main()
    {
        fast;
        init1();
        int T;
        cin>>T;
        while(T--)
        {
            Lcm=1;
            int flag=1;
            maxx=0;
            cin>>n>>m;
            for(int i=1;i<=n;i++)
            {
                f[i]=1;
                a[i]=1e9;
            }
            for(int i=1;i<=m;i++)
            {
                cin>>p[i];
                maxx=max(maxx,p[i]);
                if(flag)
                {
                    Lcm*=p[i];
                    if(Lcm>n)
                    {
                        Lcm=n+1;
                        flag=0;
                    }
                }
            }
            init2(Lcm);
            for(int i=1;i<maxx;i++)
            {
                a[i]=1;
            }
            for(int i=1;i<Lcm;i++)
            {
                if(f[i]==1) continue;
                for(int j=i+1;j<=min(Lcm-1,i+f[i]-1);j++)
                {
                    //cout<<i<<' '<<j<<'
    ';
                    a[j]=min(a[j],a[i]+1);
                }
            }
            for(int i=Lcm;i<=n;i++) a[i]=0;
            print(n);
            // for(int i=1;i<=n;i++)
            // {
            //     cout<<a[i]<<" ";
            // }
            // cout<<'
    ';
        }   
    }

    不知道有什么优化的点,咣咣咣给爹们磕头了。

  • 相关阅读:
    swfupdate flash上传工具
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服 务器。请验证实例名称是否正确并且 SQL Server 已配置为允
    多对多 一对一 一对多 主从 关联 字典
    JavaScript面向对象
    vue的transition过渡效果
    【译】Learn ES2015——箭头函数
    vue的选项
    JavaScript模块化
    vue-router
    vuex是啥
  • 原文地址:https://www.cnblogs.com/endlesskkk/p/15201222.html
Copyright © 2020-2023  润新知