CF1139

A Even Substrings

直接看每一位是不是偶数就行

#include<bits/stdc++.h>
using namespace std;
int n;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	int ans=0;
	for(int i=1;i<=n;i++){
		char a;
		cin>>a;
		if((int)(a-'0')%2==0) ans+=i; 
	}
	cout<<ans;
	return 0;
}

B Chocolates

考虑贪心使每一位最大,那么就是使每一位等于 \(min(a_i,a_{i+1}-1)\) ,然后直接将所有将所有大于零的部分加到一起就行了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+5;
int n,ans,a[maxn]; 
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=n-1;i;i--){
		a[i]=min(a[i],a[i+1]-1);
	}
	for(int i=1;i<=n;i++) if(a[i]>=0) ans+=a[i];
	cout<<ans;
	return 0;
}

C Edgy Trees

考虑把只含红边的联通块处理出来,然后就完事了

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
const int mod=1e9+7; 
const int maxn=1e5+5;
int fa[maxn];
int siz[maxn];
int ksm(int x,int k){
	int base=x,ans=1;
	while(k){
		if(k&1) ans=ans*base%mod;
		base=base*base%mod;
		k>>=1;
	}
	return ans;
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
	int ans=ksm(n,k);
	for(int i=1;i<=n-1;i++){
		int u,v,w;
		cin>>u>>v>>w;
		if(w==0){
			int ax=find(u);
			int bx=find(v);
			if(ax!=bx){
				fa[bx]=ax;
				siz[ax]+=siz[bx];
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(i==find(i)){
			ans-=ksm(siz[i],k);
			ans=(ans+mod)%mod;
		} 
	}
	cout<<ans;
	return 0;
}

E Maximize Mex

D题期望,不会跳了...
这题考虑二分图,左边为能力值,右边为club编号,每个club只选一个,删边操作不太好做,考虑改成加边操作,然后易发现倒着枚举答案单调递增,所以可以枚举答案

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1e4+5;
int head[maxn];
int to[maxn];
int nxt[maxn];
int vis[maxn];
int mch[maxn];
int paolu[maxn];
int ans[maxn];
int p[maxn];
int c[maxn];
int k[maxn];
int cnt;
inline int read ()
{
	int x = 0 , f = 1;
	char ch = cin.get();
	while ( !isdigit ( ch ) ) { if ( ch == '-' ) f = -1; ch = cin.get(); }
	while ( isdigit ( ch ) ) { x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ); ch = cin.get(); }
	return x * f;
}
void add(int x,int y){
	to[++cnt]=y;
	nxt[cnt]=head[x];
	head[x]=cnt;
}
bool dfs(int x){
	for(int i=head[x];i;i=nxt[i]){
		if(!vis[to[i]]){
			vis[to[i]]=1;
			if(mch[to[i]]==-1||dfs(mch[to[i]])){
				mch[to[i]]=x;
				return 1;
			}
		}
	}
	return 0;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	n=read();
	m=read();
	for(int i=0;i<=n;++i){
		mch[i]=-1;
	}
	for(int i=1;i<=n;++i){
		p[i]=read();
	}
	for(int i=1;i<=n;++i){
		c[i]=read();
	}
	int d;
	d=read();
	for(int i=1;i<=d;++i){
		k[i]=read();
		paolu[k[i]]=1;
	}
	for(int i=1;i<=n;++i){
		if(!paolu[i]){
			add(p[i],c[i]);
		}
	}
	int now=0;
	for(int j=d;j;--j){	
	for(int ii=1;ii<=n;++ii){
		vis[ii]=0;
	}
		while(dfs(now)){
			for(int jj=1;jj<=n;++jj){
				vis[jj]=0;
			}
			++now;
		}
		add(p[k[j]],c[k[j]]);
		ans[j]=now;
	}
	for(int i=1;i<=d;++i){
		cout<<ans[i]<<'\n';
	}
	return 0;
}

posted @ 2023-11-02 19:22  jt0007  阅读(240)  评论(0)    收藏  举报