加赛2

加赛2

组题人: @LYinMX

T1 P146. AA 0pts

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

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

T2 P147. AB 0pts

  • 观察到 nm106 ,即状态数不会超过 106

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

  • 需要特判当 n=1 时输出 m0 ,当 m=1 时顺序输出 0n1

    点击查看代码
    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 个可走的位置,故当 i=1nwimod2=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 没有判单位球,构造 xjxi 极大即可。
  • 正解是模拟退火,或者乱搞过去。

总结

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

后记

  • 貌似成线性规划、高维空间场了。
  • T4
    • 赛时的 Special Judge 没有判单位球,我过了之后让 @LYinMX 换了。
    • 赛后讲题时 @LYinMX 称我们应该有比他更好的乱搞做法所以就不讲了。
posted @   hzoi_Shadow  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
扩大
缩小
点击右上角即可分享
微信分享提示