Codeforces Round #665 (Div. 2) 题解

Codeforces Round #665 (Div. 2) 题解

A. Distance and Axis

  • \[ \begin{cases} x+y=n\\ x-y=k\\ \end{cases}\\ \Rightarrow \begin{cases} x=\tfrac{n+k}{2}\\ y=\tfrac{n-k}{2} \end{cases}\\ 且\begin{cases} x\geqq0\\ y\geqq0 \end{cases} \]

  • 由以上条件易得
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
int t,n,k;


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--){
        cin>>n>>k;
        if(n<k){
            cout<<k-n<<"\n";
        }else{
            cout<<(n+k)%2<<"\n";
        }
    }
    return 0;
}

B. Ternary Sequence

  • 贪心,尽可能的多让第一组的2和第二组的1凑对,且尽可能让第二组的2和第一组的0或2凑对
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
int t,a1,b1,c1,a2,b2,c2;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--){
        int tmp;
        cin>>a1>>b1>>c1;
        cin>>a2>>b2>>c2;
        int ans=0;
        ans+=(min(c1,b2)*2);
        tmp=min(c1,b2);
        c1-=tmp;
        b2-=tmp;
        tmp=min(c2,a1);
        c2-=tmp;
        a1-=tmp;
        if(!c2) cout<<ans<<"\n";
        else{
            if(c1){
                tmp=min(c1,c2);
                c1-=tmp;
                c2-=tmp;
                //cout<<c1<<" "<<c2<<"\n";
            }
            ans-=c2*2;
            cout<<ans<<"\n";
        }
    } 
    return 0;
}

C. Mere Array

  • 拷贝一个数组先排序, 然后把同一位置上数值不同的,也就是需要调换位置的找到,看他们能否被最小值整除,如果能就代表可以用最小值为媒介,将他们变为有序
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

const int N=1e5+10;
int t,n;
int a[N],b[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--){
        cin>>n;
        int mim=0x3f3f3f3f;
        for(int i=1;i<=n;++i){
            cin>>a[i];
            b[i]=a[i];
            mim=min(a[i],mim);
        }
        sort(b+1,b+1+n);
        int f=1;
        for(int i=1;i<=n;++i){
            f=f&((b[i]==a[i])||(a[i]%mim==0));
        }
        if(f)
            cout<<"YES\n";
        else
            cout<<"NO\n";
    }
    return 0;
}

D. Maximum Distributed Tree

  • 主要是计算路径的贡献公式很重要,怎么推的我再想想吧,我也不是很明白
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#pragma GCC optimize(2)
const ll mod=1e9+7;
int t,n,m;
int tot;
const int N=1e5+10;
int head[N];
ll rec[N],p[N],con[N];
//vector<ll>cnt;

struct Edge{
    int to,next;
}e[N*2];

void add(int u,int v)
{
    e[++tot].to=v;
    e[tot].next=head[u];
    head[u]=tot;
}

void dfs(int u,int fa)
{
    rec[u]=1ll;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(v==fa) continue;
        dfs(v,u);
        rec[u]+=rec[v];
        //cnt.push_back(rec[v]);
    }
    con[u-1]=rec[u]*(n*1ll-rec[u]);//路径贡献
}

void init()
{
    tot=0;
    memset(head,0,sizeof(int)*(n+1));
}


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>t;
    while(t--){
        cin>>n;
        init();
        for(int i=0;i<n-1;++i){
            int u,v;
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        cin>>m;
        for(int i=1;i<=m;++i) cin>>p[i];
        dfs(1,0);
        //sort(p+1,p+1+m);
        //sort(cnt.begin(),cnt.end());
        sort(con+1,con+n);
        if(m<n-1){
            while(m<n-1){
                p[++m]=1;
            }
            sort(p+1,p+n);
        }else{
            sort(p+1,p+1+m);
            while(m!=n-1){
                p[m-1]=((p[m]%mod)*(p[m-1]%mod)%mod);
                m--;
            }
        }
        //sort(p+1,p+1+m);
        ll ans=0;
        for(int i=1;i<=n-1;++i){
            ans+=((p[i]%mod)*(con[i]%mod))%mod;
        }
        cout<<ans%mod<<"\n";
    }
    return 0;
}
posted @ 2020-08-23 00:21  0xDkXy_DWM  阅读(202)  评论(0编辑  收藏  举报