牛客练习赛97
链接:(1条未读通知) 牛客练习赛97_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
C.哦~唔西迪西小姐~
description
只走‘1’格子,消耗p的能量将‘0’转成‘1’,最多操作不超过m次。求最大的得分
solution
注意,翻转之后可以不走,p为负数,对贡献排序
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ int n,m;cin>>n>>m; vector<ll>a(n+2),b(n+2),p(n+2); for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++)cin>>b[i]; for(int i=1;i<=n;i++)cin>>p[i]; ll sum=0,res=0; vector<ll>ve; for(int i=1;i<=n;i++){ if(p[i]){ sum+=max(0ll,a[i]); ve.push_back(-max(0ll,a[i])-b[i]); } else { ve.push_back(max(0ll,a[i])-b[i]); } } sort(ve.begin(),ve.end(),greater<>()); for(int i=0;i<ve.size()&&i<m;i++)sum+=max(0ll,ve[i]); res=max(res,sum),sum=0; ve.clear(); for(int i=1;i<=n;i++){ if(!p[i]){ sum+=max(0ll,a[i]); ve.push_back(-max(0ll,a[i])-b[i]); } else { ve.push_back(max(0ll,a[i])-b[i]); } } sort(ve.begin(),ve.end(),greater<>()); for(int i=0;i<ve.size()&&i<m;i++)sum+=max(0ll,ve[i]); cout<<max(res,sum)<<endl; }
D.月之暗面
description
给出一棵 n 个点的树,有 x 种普通颜色,y 种特殊颜色
现在要给树上的每个节点染色,普通颜色染色没有限制,但两个相邻的节点不能染相同颜色的特殊颜色
求染色方案数,答案对 998244353取模。
solution
如果从子节点影响父节点(一般情况下),那么问题就变得很复杂。
我们可以考虑从父节点去影响子节点,分别两种情况,特殊颜色和普通情况。
到哪父节点再更新。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll mod = 998244353; const int N = 1e6+10; ll dp[N][5]; vector<int>g[N]; ll n,x,y; void dfs(int u,int f){ dp[u][0]=dp[u][1]=1ll; for(auto v:g[u]){ if(v!=f){ dfs(v,u); dp[u][0]=dp[u][0]*(dp[v][0]*x%mod+dp[v][1]*y%mod)%mod; dp[u][1]=dp[u][1]*(dp[v][0]*x%mod+dp[v][1]*(y-1)%mod)%mod; } } } int main(){ cin>>n>>x>>y; for(int i=1;i<n;i++){ int u,v; cin>>u>>v; g[u].push_back(v),g[v].push_back(u); } dfs(1,0); cout<<(dp[1][0]*x%mod+dp[1][1]*y%mod)%mod<<endl; }
2022-03-11 20:08:39

浙公网安备 33010602011771号