Codeforces Round 926 (Div. 2)

A.

升序排列再求和

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a.begin()+1,a.end());
    int sum=0;
    for(int i=2;i<=n;i++){
        sum+=a[i]-a[i-1];
    }
    cout<<sum<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

B.

样例已经给出了做法
2*n-2个方格是2的贡献,2个方格是1的贡献

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n,k;cin>>n>>k;
    if((2*n-2)*2>=k)cout<<(k+1)/2<<'\n';
    else cout<<(2*n-2+(k-(2*n-2)*2))<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

D.

任意两点的简单路径,要找两点的公共祖先
设两点a,b,若a、b各自到公共祖先的路径上的危险节点小等于1,那么这条简单路径一定合法
处理出所有节点作为公共祖先节点所能作出的贡献
dp[i][j],表示以i为公共祖先节点,在以i为根的子树中危险节点为j的方案数

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=3e5+10;
#define inf 0x3f3f3f3f

const int mod=998244353;
vector<int>e[N];
int n,dp[N][3];
void dfs(int now,int fa){
    for(auto it:e[now]){
        if(it==fa)continue;
        dfs(it,now);
        dp[now][0]=1;
        dp[now][1]=(dp[now][1]*(dp[it][0]+dp[it][1]))%mod;
        dp[now][2]=(dp[now][2]+dp[it][1]+dp[it][2])%mod;
    }
}
void solve() {
    cin>>n;
    for(int i=1;i<=n;i++){
        e[i].clear();dp[i][0]=dp[i][1]=1;dp[i][2]=0;
    }
    for(int i=1;i<n;i++){
        int u,v;cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs(1,-1);
    cout<<(dp[1][0]+dp[1][1]+dp[1][2])%mod<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

posted @ 2024-02-25 16:48  WW爆米花  阅读(8)  评论(0编辑  收藏  举报