签到题
1007题 Even Tree Split
题目大意
给定具有偶数个节点的树,删边使每个连通部分都有偶数个节点。
输出删边方法模998244353。
考察内容
dfs
分析
除了根节点,只要有子树大小为偶数的节点即可提供一种删边方案。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int mod=998244353;
vector<int>g[N];
int sz[N],cnt;
int qpow(int x,int p){
int res=1;
for(;p;p>>=1){
if(p&1)res=(long long)res*x%mod;
x=(long long)x*x%mod;
}//用long long防止爆int
return res;
}
void dfs(int u,int f){
sz[u]=1;
for(auto v:g[u]){
if(v==f)continue;
dfs(v,u);
sz[u]+=sz[v];
}
if(sz[u]%2==0)cnt++;
}
void solve(){
cnt=0;
int n;
cin>>n;
for(int i=1;i<=n;i++){
g[i].clear();
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
dfs(1,0);
cout<<qpow(2,cnt-1)-1<<endl;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)solve();
}
1003题 Wavy Tree
题目大意
给定长度为n的序列b。
每次操作可以使其中一个元素+1/-1。
求使b呈“波浪状”所需最小操作数
考察内容
贪心
分析
直接上官方题解:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N],b[N];
void solve(){
int n;
long long f1=0,f2=0;//分别代表奇数位为大数及偶数位为大数的答案
cin>>n;
for(int i=1;i<=n;i++)cin>>b[i],a[i]=b[i];//a[i]为对应f1的数组,b[i]为对应f2的数组
for(int i=2;i<=n;i++){
if(i%2){
if(a[i]<=a[i-1])f1+=a[i-1]-a[i]+1,a[i]+=a[i-1]-a[i]+1;
if(b[i]>=b[i-1])f2+=b[i]-b[i-1]+1,b[i]-=b[i]-b[i-1]+1;
}
else{
if(a[i]>=a[i-1])f1+=a[i]-a[i-1]+1,a[i]-=a[i]-a[i-1]+1;
if(b[i]<=b[i-1])f2+=b[i-1]-b[i]+1,b[i]+=b[i-1]-b[i]+1;
}
}
cout<<min(f1,f2)<<endl;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)solve();
}
基本题
1009题 Painting Game
题目大意
有一个纸条,被分成n个格子,不能相邻涂黑,Bob想尽可能多涂黑,Alice希望少涂黑,问最多涂黑几格。
考察内容
dp
分析
这个题我还是要放官方题解:
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,ans=0;
string s;
cin>>n>>s;
ans+=n/7*3;
n%=7;
if(s=="Alice"){
if(n>=6)ans+=3;
else if(n>=4)ans+=2;
else if(n)ans++;
}
else{
if(n>=5)ans+=3;
else if(n>=3)ans+=2;
else if(n)ans++;
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)solve();
}