Codeforces Round #548 (Div. 2) (还缺3题~)

A. Even Substrings

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	string s;
	cin>>s;
	long long ans=0;
	for(int i=0;i<n;++i){
		if( ! ((s[i]-'0')&1) ) ans += i+1;//如果是偶数,则加上它的位置
	}
	printf("%lld\n",ans);
}

 B. Chocolates

#include<bits/stdc++.h>
using namespace std;
int a[200005];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;++i){
		scanf("%d",&a[i]);
	}
	long long ans=a[n-1];
	for(int i=n-2;i>=0;--i){
		if(a[i+1]-1>=a[i]) ans+=a[i];
		else a[i]=max(a[i+1]-1,0),ans+=a[i];
	}
	printf("%lld",ans);
}

C. Edgy Trees

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int MAXV=100005;
vector<int>adj[MAXV];
int n;//n为顶点数,MAXV为最大顶点数 
bool vis[MAXV];//如果顶点i已被访问,则vis[i]=true.初值为false

ll poww(ll a, ll b){
    ll ans = 1, base = a;
    while(b>0){
        if(b&1) ans*=base,ans%=MOD; 
        base*=base,base%=MOD;
        b>>=1; //b=b/2
    }
    return ans%MOD;
}

int main(){
	int k;
	scanf("%d%d",&n,&k);
	int u,v,color;
	ll cnt=0,num=0,sum=0;
	for(int i=0;i<n-1;++i){
		scanf("%d%d%d",&u,&v,&color);
		if(!color){
			adj[u].push_back(v);
			adj[v].push_back(u);

		}

	}
	//BFS数联通块 
	for(int i=0;i<n;++i){
		if(adj[i].size()){
			num=1;//该联通块有多少个点
			queue<int>q;
			if(!vis[i]){//注意 
				q.push(i);
				vis[i]=true;
			}
			while(!q.empty()){
				int top=q.front();
				q.pop();
				for(int j=0;j<adj[top].size();++j){
					if(!vis[adj[top][j]]){
						q.push(adj[top][j]);
						vis[adj[top][j]]=true;
						++num;
					}
				} 
			}
			if(num!=1){
				sum+=poww(num,k);//该联通块内点的数目的k次方 
				cnt+=num;
				sum%=MOD;
			}
		}
	}

	ll ans=(poww(n,k)-sum-(n-cnt)+MOD)%MOD;
        //答案=所有情况-红区-不在红区的点的数目(不在红区的点,每个点重复自己k遍,是1种不合法的走法)
	//注意+MOD再%MOD
	cout<<(ans+MOD)%MOD<<endl;
} 

猜你喜欢

转载自blog.csdn.net/weixin_42104573/article/details/88873115