Codeforces Round #588 (Div. 2)补题


题目

A - Dawid and Bags of Candies

#include<bits/stdc++.h>
#define de(x) cout<<#x <<" = "<<x<<endl;
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
ll vis[1000];
int main(){
    ll a[4];
    ll sum=0;
    scanf("%lld%lld%lld%lld",&a[0],&a[1],&a[2],&a[3]);
    for(ll i=0;i<4;i++){
        sum+=a[i];
    }
    bool flag=false;
for(ll i=0;i<4;i++)
    if(a[i]*2==sum)
    flag=true;
for(ll i=0;i<4;i++){
    for(ll j=i+1;j<4;j++)
        if((a[i]+a[j])*2==sum)
        flag=true;
}
if(flag)
    printf("YES\n");
else
    printf("NO\n");
}

B - Ania and Minimizing

#include<bits/stdc++.h>
#define de(x) cout<<#x <<" = "<<x<<endl;
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
char s[1000005];
ll n,k;
int main(){
    scanf("%lld%lld",&n,&k);
    getchar();
    scanf("%s",s);
    if(n==1&&k>0){
        printf("0\n");
        return 0;
        }
        if(s[0]!='1'&&k>0){
            s[0]='1';
            k--;
        }
        for(ll i=1;i<n;i++){
        if(s[i]!='0'&&k>0){
            s[i]='0';
            k--;
        }
        if(k==0)
            break;
        }
        printf("%s\n",s);
        return 0;
}

C - Anadi and Domino

#include<bits/stdc++.h>
using namespace std;
int link[10][10];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        link[u][v]=link[v][u]=1;
    }
    int ans=0;
    if(n<=6)cout<<m<<endl;
    else{
        for(int i=1;i<=7;i++){
            for(int j=i+1;j<=7;j++){
                int cur=m;
                for(int k=1;k<=7;k++){
                    if(link[i][k]&&link[k][j])cur--;
                }
                ans=max(cur,ans);
            }
        }
        cout<<ans<<endl;
    }
}

D - Marcin and Training Camp

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=7e3+10;
unordered_map<ll,ll>mp;
ll a[maxn];
ll b[maxn];
bool vis[maxn];
int main(){
    ll n;
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        mp[a[i]]++;
    }
    for(ll i=1;i<=n;i++){
        scanf("%lld",&b[i]);
    }
    ll ans=0;
    for(auto it:mp){
        if(it.second>1){
            for(ll i=1;i<=n;i++){
                if(!vis[i]&&(a[i]|it.first)==it.first){
                    vis[i]=true;
                    ans+=b[i];
                }
            }
        }
    }
    cout<<ans<<endl;
}

E - Kamil and Making a Stream

用map从上向下合并

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
const ll mod=1e9+7;
ll head[maxn];
struct Edge{
    ll v,next;
}e[maxn<<1];
ll cnt=0;
void add(ll u,ll v){
    e[cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt++;
}
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll a[maxn];
unordered_map<ll,ll>mp[maxn];
ll ans=0;
void dfs(ll u,ll f){
    if(~f){
        for(auto it:mp[f]){
            mp[u][gcd(it.first,a[u])]+=it.second;
        }
    }
    mp[u][a[u]]++;
    for(auto it:mp[u]){
        ans=(ans+it.first*it.second%mod)%mod;
    }
    for(ll i=head[u];~i;i=e[i].next){
        if(e[i].v==f)continue;
        dfs(e[i].v,u);
    }
}
int main(){
    memset(head,-1,sizeof(head));
    ll n;
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    for(ll i=1;i<n;i++){
        ll u,v;
        scanf("%lld%lld",&u,&v);
        add(u,v);
        add(v,u);
    }
    dfs(1,-1);
    cout<<ans<<endl;
}

F - Konrad and Company Evaluation

维护入度和出度乘积的和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
ll out[maxn];
ll in[maxn];
vector<ll>g[maxn];
ll cnt;
void add(ll u,ll v){
    g[u].push_back(v);
    in[u]++;
    out[v]++;
}
int main(){
    ll n,m;
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=m;i++){
        ll u,v;
        scanf("%lld%lld",&u,&v);
        if(v<u)swap(u,v);
        add(u,v);
    }
    ll ans=0;
    ll q;
    scanf("%lld",&q);
    for(ll i=1;i<=n;i++){
        ans+=in[i]*out[i];
    }
    printf("%lld\n",ans);
    while(q--){
        ll u;
        scanf("%lld",&u);
        ans-=in[u]*out[u];
        for(ll i=0;i<g[u].size();i++){
            ll v=g[u][i];
            ans-=in[v]*out[v];
            in[u]--;
            out[v]--;
            add(v,u);
            ans+=in[v]*out[v];
        }
        g[u].clear();
        printf("%lld\n",ans);
    }
}
发布了43 篇原创文章 · 获赞 6 · 访问量 1639

猜你喜欢

转载自blog.csdn.net/qq_44290978/article/details/104084295