当前位置 : 主页 > 网页制作 > css >

Codeforces Round #548 (Div. 2)

来源:互联网 收集:自由互联 发布时间:2021-06-13
A. Even Substrings 题意:给你一串数字,问有多少区间满足以偶数结尾(水题) #include bits/stdc++.h using namespace std; const int maxn=1e5+ 10 ;typedef long long ll; int main(){ int n; cin n; string s; cin s; ll tot

A. Even Substrings

题意:给你一串数字,问有多少区间满足以偶数结尾(水题)

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef  long long ll;
 
int main(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    ll tot=0;
    ll ans=0;
    for(int i=0;i<n;i++){
        if((s[i]-0)%2==0){
            tot++;
            ans+=tot;
        }
        else tot++;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

B. Chocolates

题意:n种类型的巧克力,每种有ai个,问你最多能买多少块,要满足前一种不买或者前一种买的比当前的少;

从后面往前维护,遍历一遍就行了,自己当时做的时候一直从前面往后维护,一直T……;

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
typedef  long long ll;
ll a[maxn];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    ll res=a[n];
    ll ans=a[n];
    for(int i=n-1;i>=1;i--){
        res=max(0LL,min(a[i],res-1));
        ans+=res;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

C. Edgy Trees

题意:给你一颗树,问从某个节点走到某个节点至少经过一个黑边的有多少种;

自己:算出总的可能减去都没有经过黑边的种类,然而不会维护边的颜色。。。就卡了

看了学长的~用了两个vec,一个v来维护树,一个v用来维护边的颜色,~~

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int mod=1e9+7;
typedef  long long ll;
vector<int>g[maxn],id[maxn];
bool vis[maxn];
ll a[maxn],cnt;
void dfs(int u){
    vis[u]=true;
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        int w=id[u][i];
        if(vis[v]||w)continue;
        dfs(v);
        vis[v]=true;
        a[cnt]++;
    }
}
ll ksm(ll x,ll y){
    ll ans=1;
    while(y){
        if(y&1){
            ans=(ans*x)%mod;
        }
        x=x*x%mod;
        y/=2;
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    ll n,m;
    cin>>n>>m;
    for(int i=1;i<n;i++){
        int u,v,w;
        cin>>u>>v>>w;
        g[u].push_back(v);
        g[v].push_back(u);
        id[u].push_back(w);
        id[v].push_back(w);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            cnt++;
            dfs(i);
            vis[i]=true;
            if(a[cnt])a[cnt]++;
            else cnt--;
        }
    }
    ll ans=0,res,sum=0;
    for(int i=1;i<=cnt;i++){
        ans=(ans+ksm(a[i],m))%mod;
        sum+=a[i];
    }
    res=ksm(n,m)%mod;
    res=(res-ans-(n-sum)+mod)%mod;
    cout<<res<<endl;




    return 0;
}
View Code

D。待补

网友评论