0%

思路讲解

递推公式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
auto dfs=[&](auto&& self,ll u,ll p)->void{
dp[u][0]=1; // 每一个人说真话这种情况一定是存在的
for(auto &v:g[u]){
if(v==p) continue;
self(self,v,u);
vector<ll> tmp(N+5);
ROF(i,sz[u],0){
FOR(j,0,sz[v]){
tmp[i+j]+=dp[u][i]*dp[v][j]%mod;
tmp[i+j]%=mod;
}
}
dp[u]=tmp;
sz[u]+=sz[v];
}
// dp[u][A[u]-1] 就是如果u说真话,dp[u][A[u]]的值
// 因为u说真话,那么情况已经定下来了,其余的就是dp[u][A[u]-1]
dp[u][A[u]]=A[u]?dp[u][A[u]-1]:0; // 对于任何节点来说,A[u]=0都是悖论
};

AC代码

https://codeforces.com/gym/105992/submission/328455295

心路历程(WA,TLE,MLE……)

思路讲解

gcd(a,b)=gcd(ab,b)gcd(a, b) = gcd(a-b, b)

gcd(a+bx,a)=gcd(a,b)gcd(a+bx,a)=gcd(a,b)

使用如下构造方法即可。

1
2
3
4
5
6
7
8
9
10
11
12
inline void solve(){
cin>>N;
init();
sieve(N+40*N);
ll p= *upper_bound(all(primes),N);
FOR(i,1,N){
FOR(j,1,N){
cout<<i*p+j<<" ";
}
cout<<"\n";
}
}

AC代码

https://codeforces.com/gym/105992/my

心路历程(WA,TLE,MLE……)

思路讲解

【树上背包【力扣周赛 451】】 https://www.bilibili.com/video/BV1o1jgzJE51/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37

这个视频讲树上背包问题讲的非常透彻,非常好。

这个第一个遍历边就不多说了,第二个循环倒过来是因为滚动数组优化,第三个必须正过来,你可以倒过来试一试,当数据中含有这个需要0元,但是价值不为0的物品时就会出错,这是因为倒过来遍历可能取了这个物品两次,正过来遍历的时候是空的,那么就不存在这个问题了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
      
auto dfs=[&](this auto &&self,int u,int p)->void{

for(auto v:g[u]){
if(v==p) continue;
self(v,u);
}
// memo是暂时不考虑当前节点u而定的
vector<array<int,3> > memo(budget+5,{0,0,0});

for(auto &v:g[u]){
for(int i=budget;i>=0;--i){
for(int j=0;j<=i;++j){ // 必须要正过来循环
memo[i][1]=max(memo[i][1],memo[i-j][1]+dp[1][v][j]);
memo[i][2]=max(memo[i][2],memo[i-j][2]+dp[2][v][j]);
}
}
}
for(int i=budget;i>=0;--i){
for(int j=1;j<=2;++j){
int cost=present[u-1]/j;
dp[j][u][i]=max(dp[j][u][i],memo[i][1]);
if(i>=cost){
dp[j][u][i]=max(dp[j][u][i],future[u-1]-cost+memo[i-cost][2]);
}
}
}
};

AC代码

心路历程(WA,TLE,MLE……)

思路讲解

AC代码

https://leetcode.cn/problems/kth-smallest-path-xor-sum/submissions/642233568/

心路历程(WA,TLE,MLE……)

思路讲解

AC代码

心路历程(WA,TLE,MLE……)