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;
}


浙公网安备 33010602011771号