Codeforces Round #732 (Div. 2)部分题解(A-D)

A. AquaMoon and Two Arrays

题意:水

代码:

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>t;
    while(t--)
    {
        cin>>n;
        ll sum0=0,sum1=0,sum=0;
        rep(i,1,n)
        {
            cin>>a[i];
            sum0+=a[i];
        }
        rep(i,1,n)
        {
            cin>>b[i];
            sum1+=b[i];
        }
        rep(i,1,n)sum+=abs(a[i]-b[i]);
        if(sum0!=sum1)cout<<-1<<endl;
        else
        {
            cout<<sum/2<<endl;
            rep(i,1,n)
            {
                if(a[i]!=b[i])
                {
                    while(a[i]!=b[i])
                    {
                        rep(j,i+1,n)
                        {
                            if(a[i]>b[i]&&a[j]<b[j])
                            {
                                ll kk=min((a[i]-b[i]),(b[j]-a[j]));
                                rep(k,1,kk)cout<<i<<" "<<j<<endl;
                                a[i]-=kk;
                                a[j]+=kk;
                            }
                            else if(a[i]<b[i]&&a[j]>b[j])
                            {
                                ll kk=min((b[i]-a[i]),(a[j]-b[j]));
                                rep(k,1,kk)cout<<j<<" "<<i<<endl;
                                a[i]+=kk;
                                a[j]-=kk;
                            }
                        }
                    }
                }
            }
        }
    }
}
View Code

B. AquaMoon and Stolen String

题意:给定2*n-1个长为m的字符串,其中后n-1中的某一个和前n个中某一个字符串在互相交换部分字符后各形成了前n个和后n-1个字符串中的另两个字符串,找出没有参与交换的那个字符串。

思路:每参与交换的一组字符串对于每一位的字符有前两者减去后两者为0。

代码:

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>t;
    while(t--)
    {
        string s;
        vector<ll>s1[100010],s2[100010];
        cin>>n>>m;
        rep(i,0,n-1)
        {
            cin>>s;
            ll len=s.size()-1;
            rep(j,0,len)
            {
                s1[i].pb(s[j]-'a');
            }
        }
        rep(i,0,n-2)
        {
            cin>>s;
            rep(j,0,s.size()-1)
            {
                s2[i].pb(s[j]-'a');
            }
        }
        rep(i,0,m-1)
        {
            ll ans=0;
            rep(j,0,n-1)ans+=s1[j][i];
            rep(j,0,n-2)ans-=s2[j][i];
            cout<<(char)('a'+ans);
        }
        cout<<endl;
    }
}
View Code
C. AquaMoon and Strange Sort
 
题意:给定长为n的数列,定义每个数的方向朝右,每次可以任选两个数交换,交换后两个数方向也变化,原来向右则变为向左,反之亦然,原数列是否能在任意次的交换后在保证所有数都朝右的前提下形成升序。
 
思路(bushi):考虑交换过后需要偶次,定义奇数项经排序后的位次,玄学AC了……,欢迎巨佬证明或hack。
 
代码:
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    ll t;
    cin>>t;
    while(t--)
    {
        vector<ll>a,c;
        ll n;
        cin>>n;
        rep(i,0,n-1)
        {
            ll x;
            cin>>x;
            a.pb(x);
            if(i%2==0)c.pb(x);
        }
        sort(a.begin(),a.end());
        sort(c.begin(),c.end());
        bool flag=true;
        rep(i,0,n-1)
        {
            if(i%2==0)
            {
                if(a[i]!=c[i/2])
                {
                    flag=0;
                    break;
                }
            }
        }
        if(flag)yes;
        else no;
    }
}
View Code

D. AquaMoon and Chess

题意:长为n的序列只由0或1组成,每个1在相邻位置存在1的情况下可以朝着相邻存在1的方向移动两个位置(如果那个位置为1),求在任意次操作下可能有的情况数。

思路:考虑n个1(n>=2)在一起的情况,存在n/2组可以向外任意移动的组合,而孤立的1和0无法移动,转化为小球入盒问题。

代码:

ll NI(ll k,ll mod)
{
    ll p=mod-2,sum=1;
    while(p)
    {
        if(p&1)sum=(sum*k)%mod;
        k=(k*k)%mod;
        p>>=1;
    }
    return sum;
}
ll cal(ll x,ll y)
{
    ll ans1=1,ans2=1;
    while(x)
    {
        ans1=(ans1*y)%mod2;
        ans2=(ans2*x)%mod2;
        x--;y++;
    }
    return (ans1*NI(ans2,mod2))%mod2;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>t;
    while(t--)
    {
        cin>>n;
        string s;
        cin>>s;
        s+='#';
        ll cnt0=0,cnt1=0;
        rep(i,0,s.size()-1)if(s[i]=='0')cnt0++;
        rep(i,0,s.size()-1)
        {
            if(s[i]=='1')
            {
                ll sum=0;
                while(s[i]=='1')
                {
                    sum++;
                    ++i;
                }
                cnt1+=sum/2;
            }
        }
        cout<<cal(cnt1,cnt0+1)<<endl;
    }
}
View Code

 

 
posted @ 2021-07-13 14:57  Geospiza  阅读(84)  评论(0)    收藏  举报