Codeforces Round #548題解
阿新 • • 發佈:2020-12-24
A題
列舉每一位,如果是偶數就加上i
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; int main(){ ios::sync_with_stdio(false); int n; cin>>n; string s; cin>>s; int ans=0; s=" "+s; for(int i=1;i<(intView Code)s.size();i++){ int x=s[i]-'0'; if(x%2==0){ ans+=i; } } cout<<ans<<endl; return 0; }
B題
這題一定要注意一個細節,之後選的數不能小於前面選的數
也就是你前面選的都會被後面制約
因此只能從後往前考慮。顯然最後全拿,之後就是a[i]和x-1取min,其中x是當前數後面的約束
#include<bits/stdc++.h> using namespace std; typedefView Codelong long ll; typedef pair<int,int> pll; const int N=2e5+10; int n; int a[N]; int main(){ ios::sync_with_stdio(false); cin>>n; int i; int x=1e9+1; for(i=1;i<=n;i++) cin>>a[i]; ll ans=0; for(i=n;i>=1;i--){ x=min(a[i],x-1); if(x<=0) break; ans+=x; } cout<<ans<<endl; return 0; }
C題
正難則反還是好用,正著很難想,但是反著看,答案不就是全部個數-沒有經過黑邊個數,那麼就是連通塊劃分,每個連通塊裡面隨便選
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e5+10; const int mod=1e9+7; int h[N],ne[N],e[N],w[N],idx; int st[N]; int cnt; ll ans; ll qmi(ll a,ll b){ ll res=1; while(b){ if(b&1){ res=res*a%mod; } a=a*a%mod; b>>=1; } return res; } void add(int a,int b,int c){ e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++; } void dfs(int u,int fa){ st[u]=1; cnt++; for(int i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(st[j]) continue; if(w[i]==1) continue; dfs(j,u); } } int main(){ ios::sync_with_stdio(false); memset(h,-1,sizeof h); int n,k; cin>>n>>k; int i; for(i=1;i<n;i++){ int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,c); } ans=qmi(n,k); for(i=1;i<=n;i++){ if(!st[i]){ cnt=0; dfs(i,-1); ans=(ans-qmi(cnt,k)+mod)%mod; } } cout<<ans<<endl; return 0; }View Code
D題
神tm莫比烏斯反演,我說怎麼想不出來,鴿了,不會數論演算法