加赛2

加赛2

组题人: @LYinMX

\(T1\) P146. AA \(0pts\)

  • 不会向量,贺的官方题解。

  • 貌似最后的矩阵除法需要把分母求逆然后乘起来(题目某些限制条件给定了)。

\(T2\) P147. AB \(0pts\)

  • 观察到 \(n^{m} \le 10^{6}\) ,即状态数不会超过 \(10^{6}\)

  • 将长度为 \(m\) 的序列看做在 \(n\) 进制下长度为 \(m\) 的数(允许有前导零)。把前 \(m-1\) 一位作为节点,枚举下一位所填的位置后取后 \(m-1\) 位连边,然后跑欧拉路径即可。

  • 需要特判当 \(n=1\) 时输出 \(m\)\(0\) ,当 \(m=1\) 时顺序输出 \(0 \sim n-1\)

    点击查看代码
    int f[1000010],vis[10000010],id[10000010],cnt=0;
    vector<pair<int,int> >e[1000010];
    stack<int>s;
    void dfs1(int pos,int sum,int n,int m)
    {
        if(pos==m-1)
        {
            cnt++;
            f[cnt]=sum;
        }
        else
        {
            for(int i=0;i<=n-1;i++)
            {
                dfs1(pos+1,sum*n+i,n,m);
            }
        }
    }
    void add(int u,int v,int id)
    {
        e[u].push_back(make_pair(v,id));
    }
    void dfs2(int x)
    {
        for(int i=id[x];i<e[x].size();i=max(i+1,id[x]))
        {
            if(vis[e[x][i].second]==0)
            {
                vis[e[x][i].second]=1;
                id[x]=i+1;
                dfs2(e[x][i].first);
            }
        }
        s.push(x);
    }
    int main()
    {
        int n,m,p,sum=0,x,i,j;
        cin>>n>>m;
        if(m==1)
        {
            cout<<n<<endl;
            for(i=0;i<=n-1;i++)
            {
                cout<<i<<" ";
            }
        }
        else
        {
            if(n==1)
            {
                cout<<m<<endl;
                for(i=1;i<=m;i++)
                {
                    cout<<0<<" ";
                }
            }
            else
            {
                dfs1(0,0,n,m);
                p=pow(n,m-2);
                for(i=1;i<=cnt;i++)
                {   
                    for(j=0;j<=n-1;j++)
                    {
                        sum++;
                        add(i,lower_bound(f+1,f+1+cnt,(f[i]%p)*n+j)-f,sum);
                    }
                }
                dfs2(1);
                cout<<s.size()-1<<endl;
                while(s.empty()==0)
                {
                    x=s.top();
                    s.pop();
                    if(s.empty()==0)
                    {
                        cout<<f[s.top()]-(f[x]%p)*n<<" ";
                    }
                }
            }
        }
        return 0;
    }
    

\(T3\) P148. AC \(100pts\)

  • 感性理解

    • 走过的空间走过的位置
    • 不知道在 \(n\) 维棋盘下的棋子移动方式。
  • 每次走会减少 \(1\) 个可走的位置,故当 \(\prod\limits_{i=1}^{n}w_{i} \bmod 2=0\) 时先手必胜,否则后手必胜。

    点击查看代码
    int main()
    {
        ll t,n,ans,w,i,j;
        cin>>t;
        for(j=1;j<=t;j++)
        {
            cin>>n;
            ans=1;
            for(i=1;i<=n;i++)
            {
                cin>>w;
                ans=ans*w%2;
            }
            if(ans%2==0)
            {
                cout<<"xian"<<endl;
            }
            else
            {
                cout<<"hou"<<endl;
            }
        }
        return 0;
    }
    
  • 官方题解称是多米诺骨牌覆盖,有一维是偶数则先手赢。

\(T4\) P149. AD \(0pts\)

  • 赛时的 Special Judge 没有判单位球,构造 \(x_{j}-x_{i}\) 极大即可。
  • 正解是模拟退火,或者乱搞过去。

总结

  • 科普场。
  • 高中文化课一点没学咋办。

后记

  • 貌似成线性规划、高维空间场了。
  • \(T4\)
    • 赛时的 Special Judge 没有判单位球,我过了只后让 @LYinMX 换了。
    • 赛后讲题时 @LYinMX 称我们应该有比他更好的乱搞做法所以就不讲了。
posted @ 2024-07-24 19:41  hzoi_Shadow  阅读(41)  评论(0编辑  收藏  举报
扩大
缩小