牛客周赛 Round 49

牛客周赛 Round 49

\(A\) 牛客 NC275421 嘤嘤不想做计几喵 \(AC\)

  • 顺序结构。

    点击查看代码
    int main()
    {
        ll a,b;
        cin>>a>>b;
        cout<<a-b-b*10<<endl;
        return 0;
    }
    

\(B\) 牛客 NC275501 嘤嘤不想打怪兽喵 \(AC\)

  • 递归求解。

    点击查看代码
    ll ask(ll x)
    {
        return (x==1)?1:2*ask(x/2)+1;
    }
    int main()
    {
        ll h,i;
        cin>>h;
        cout<<ask(h)<<endl;
        return 0;
    }
    

\(C\) 牛客 NC275503 嘤嘤不想买东西喵 \(AC\)

  • \(a_{i}\)\(x\) 后等价于 luogu P1115 最大子段和

    点击查看代码
    ll a[100010];
    int main()
    {
        ll n,x,sum=0,ans=0,i;
        cin>>n>>x;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
            a[i]-=x;
            sum=max(a[i],sum+a[i]);
            ans=max(ans,sum);
        }
        cout<<ans<<endl;
        return 0;
    }
    

\(D\) 牛客 NC275631 嘤嘤不想求异或喵 \(AC\)

  • 把式子拆成前缀异或的形式,有 \(\bigoplus\limits_{i=l}^{r}i=(\bigoplus\limits_{i=1}^{r}i)\bigoplus(\bigoplus\limits_{i=1}^{l-1}i)\) 。以下只讨论 \(\bigoplus\limits_{i=1}^{r}i\) 的解法。

  • \((2k) \bigoplus (2k+1)=1\) ,把 \(\bigoplus\limits_{i=1}^{r}i\) 拆成 \(1 \bigoplus (\bigoplus\limits_{i=2}^{r}i)=1 \bigoplus \begin{cases} \bigoplus\limits_{i=1}^{\frac{r-1}{2}}1 & (r-1) \bmod 2=0 \\ r \bigoplus (\bigoplus\limits_{i=1}^{\left\lfloor\frac{r-1}{2}\right\rfloor}1) & (r-1) \bmod 2=1 \end{cases}\) ,即 \(\bigoplus\limits_{i=1}^{r}i=\begin{cases} r & r \bmod 4=0 \\ 1 & r \bmod 4=1 \\ r+1 & r \bmod 4=2 \\ 0 & r \bmod 4=3 \end{cases}\)

  • 特判边界。

    点击查看代码
    ll ask(ll x)
    {
        if(x%4==0)
        {
            return x;
        }
        if(x%4==1)
        {
            return 1;
        }
        if(x%4==2)
        {
            return x+1;
        }
        if(x%4==3)
        {
            return 0;
        }
        return 114514;
    }
    int main()
    {
        ll t,l,r,i,j;
        cin>>t;
        for(i=1;i<=t;i++)
        {
            cin>>l>>r;
            cout<<(ask(r)^ask(l-1))<<endl;
        }
        return 0;
    }
    

\(E\) 牛客 NC275518 嘤嘤不想解方程喵 \(AC\)

  • 等价于求 \(a_{1}b_{2}x^{2}+(b_{1}b_{2}+a_{2})x+(b_{2}c_{1}+c_{2})=0\) 的解的数量。

  • 大力分讨。

    • 非方程
      • 无解
      • 无数组解
    • 一元一次方程
      • 一组解
    • 二元一次方程
      • 两组解
      • 一组解
      • 无解
  • 懒得用高精。人生苦短,我用 Python 。

    点击查看代码
    t=int(input())
    for i in range(t):
        a1,b1,c1,a2,b2,c2=[int(x) for x in input().split()]
        a=a1*b2
        b=b1*b2+a2
        c=b2*c1+c2
        if a==0:
            if b==0:
                if c==0:
                    print("INF")
                else:
                    print(0)
            else:
                print(1)
        else:
            if b*b>4*a*c:
                print(2)
            if b*b==4*a*c:
                print(1)
            if b*b<4*a*c:
                print(0)
    

\(F\) 牛客 NC275523 嘤嘤不想找最小喵

  • 对于 \(i \in [1,n-2k]\) ,有 \(i+2k \in [2k+1,n],i+k \in [k+1,n]\) ,三段一位位判断不如哈希起来后一起判断。

  • 选个好点的模数和进制。

    点击查看代码
    const ull base=133311111;
    ull s[500010],a[500010],jc[500010];
    void sx_hash(ull s[],ull a[],ull len)
    {
        for(ull i=0;i<=len;i++)
        {
            a[i]=(i==0)?0:a[i-1]*base+s[i];
        }
    }
    ull ask_hash(ull a[],ull l,ull r)
    {
        return a[r]-a[l-1]*jc[r-l+1];
    }
    int main()
    {
        ull n,i,k;
        cin>>n;
        for(i=0;i<=n;i++)
        {
            jc[i]=(i==0)?1:jc[i-1]*base;
        }
        for(i=1;i<=n;i++)
        {
            cin>>s[i];
        }
        sx_hash(s,a,n);
        for(k=1;k<=n;k++)
        {
            if(ask_hash(a,1,n-2*k)+ask_hash(a,2*k+1,n)==2*ask_hash(a,k+1,n-k))
            {
                cout<<k<<endl;
                break;
            }
        }
        return 0;
    }
    

总结

  • long long
  • \(E\)
    • 记得判断方程的存在性。
    • 速通 Python 要提上日程了。
  • \(F\)
    • 进制要大于值域。
posted @ 2024-07-01 06:24  hzoi_Shadow  阅读(65)  评论(0编辑  收藏  举报
扩大
缩小