【刷题记录】排列dp

文章目录

  • [AtCoder-ABC209-f] Deforestation
  • [AtCoder-Educational DP Contest-T]Permutation
  • 「JOI Open 2016」摩天大楼
  • topcoder srm 489 div1 lev3 : AppleTrees
  • [CodeForces-626F] Group Projects
  • [TopCoder] Seatfriends
  • 小结

[AtCoder-ABC209-f] Deforestation

考虑相邻的两棵树,先砍 i−1i-1i1 再砍 iii,花费 hi−1+2∗hih_{i-1}+2*h_ihi1+2hi,先砍 iii 再砍 i−1i-1i1,花费 2∗hi−1+hi2*h_{i-1}+h_i2hi1+hi

也就是说,后砍的树贡献次数要多一次。贪心地有 越高的树越先砍。

f(i,j):f(i,j):f(i,j): 所有排列中在只考虑前 iii 个树的情况下, iii 树是第 jjj 个被砍掉的数量。

  • hi=hi−1h_i=h_{i-1}hi=hi1,无所谓先后。

    f(i,j)=∑k=1i−1f(i−1,k)f(i,j)=\sum_{k=1}^{i-1}f(i-1,k)f(i,j)=k=1i1f(i1,k)

  • hi>hi−1h_i>h_{i-1}hi>hi1

    f(i,j)=∑k=ji−1f(i−1,k)f(i,j)=\sum_{k=j}^{i-1}f(i-1,k)f(i,j)=k=ji1f(i1,k)

  • hi<hi−1h_i<h_{i-1}hi<hi1

    f(i,j)=∑k=1j−1f(i−1,k)f(i,j)=\sum_{k=1}^{j-1}f(i-1,k)f(i,j)=k=1j1f(i1,k)

前缀和优化即可。

注意:可能你会疑惑为什么求和上限不是 nnn。如果是 nnn 其实想一下就知道会算重,但又会疑惑为什么这样不会算重。下面给出两种解释(本质一样)。

  • 这个第 jjj 个被砍掉的含义是,假设已知最后 nnn 棵树的砍顺序,把 1∼i1\sim i1i 的树的砍树顺序单独拎出来组成长度为 iii 的顺序,从小到大排序后,iii 树在这个小排列中是第 jjj 个被砍的。
  • Oxide\text{Oxide}Oxide 解释:这是个相对过程,后面的树一旦插入 jjj,相当于把前面的树砍顺序在 jjj 及以后的都再往后移了一个。
#include <cstdio>
#define maxn 4005
#define int long long
#define mod 1000000007
int n;
int h[maxn];
int dp[maxn][maxn];signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &h[i] );h[0] = h[1], dp[0][0] = 1;for( int i = 1;i <= n;i ++ ) {for( int j = 1;j <= i;j ++ ) {if( h[i] == h[i - 1] )dp[i][j] = dp[i - 1][i - 1];else if( h[i] > h[i - 1] )dp[i][j] = ( dp[i - 1][i - 1] - dp[i - 1][j - 1] + mod ) % mod;elsedp[i][j] = dp[i - 1][j - 1];}for( int j = 1;j <= i;j ++ )dp[i][j] = ( dp[i][j] + dp[i][j - 1] ) % mod;}printf( "%lld\n", dp[n][n] );return 0;
}

[AtCoder-Educational DP Contest-T]Permutation

vjudge

这道题和上一道题目是同一个类型,dpdpdp 定义以及优化也是一样的。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
#define maxn 3005
int f[maxn][maxn];
char s[maxn];
int n;
/*
f(i,j):考虑到i位放j 前面都已经满足s的符号限制 的排列数量
s[i] = '<'   f(i+1,j) <- f(i,k) k<j
s[i] = '>'   f(i+1,j) <- f(i,k) k>j   
*/
signed main() {scanf( "%lld %s", &n, s + 1 );for( int i = 1;i <= n;i ++ ) f[1][i] = i;for( int i = 1;i < n;i ++ ) {for( int j = 1;j <= n;j ++ ) {if( s[i] == '<' )f[i + 1][j] = f[i][j - 1] % mod;elsef[i + 1][j] = ( f[i][i] - f[i][j - 1] + mod ) % mod;}for( int j = 1;j <= n;j ++ )( f[i + 1][j] += f[i + 1][j - 1] ) %= mod;	}printf( "%lld\n", f[n][n] );return 0;
}

「JOI Open 2016」摩天大楼

LOJ#2743

AAA 从小到大排序。考虑微元法。

答案排列相邻的一对 Ai,AjA_i,A_jAi,Aj,产生的贡献可以表示为 ∑k=ji−1Ak+1−Ak\sum_{k=j}^{i-1}A_{k+1}-A_kk=ji1Ak+1Ak

我们可以提前计算 Ak+1−AkA_{k+1}-A_{k}Ak+1Ak 对答案的贡献次数。

f(i,j,k,d):f(i,j,k,d):f(i,j,k,d): 放了前 iii 个数,产生了 jjj 个互相独立的连续段,总贡献为 kkk,排列的首尾(下面称为墙)被占了 ddd 个。

则可以算出当前 Ai+1−AiA_{i+1}-A_iAi+1Ai 的贡献,即为 (Ai+1−Ai)⋅(2∗j−d)(A_{i+1}-A_i)·(2*j-d)(Ai+1Ai)(2jd)

因为有 2∗j−d2*j-d2jd(墙只能延伸一个方向)个连续段的左右在后面某个时刻会放数,这部分一定会贡献微元。

t=k+(2∗j−d)(Ai+1−Ai)t=k+(2*j-d)(A_{i+1}-A_i)t=k+(2jd)(Ai+1Ai)

  • i+1i+1i+1 独立成一段。

    • 独立成一个中间段,非墙。

      如果一个墙都没有,那么有 j+1j+1j+1 个空,KaTeX parse error: Expected '}', got '_' at position 7: \text{_̲_X___X___}

      如果有一个墙,就少一个空,KaTeX parse error: Expected '}', got '_' at position 8: \text{X_̲__X___X___}

      所以合并可以写成以下形式:

      f(i+1,j+1,t,d)←f(i,j,k,d)∗(j+1−d)f(i+1,j+1,t,d)\leftarrow f(i,j,k,d)*(j+1-d)f(i+1,j+1,t,d)f(i,j,k,d)(j+1d)

    • 独立成一个墙段,如果前后两个墙均未有,则还要考虑是做首还是尾。

      f(i+1,j+1,t,d+1)←f(i,j,k,d)⋅(2−d)f(i+1,j+1,t,d+1)\leftarrow f(i,j,k,d)·(2-d)f(i+1,j+1,t,d+1)f(i,j,k,d)(2d)

  • i+1i+1i+1 做枢纽,合并某两个段。jjj 个段,有 j−1j-1j1 个空填入 i+1i+1i+1 然后连接起来。

    f(i+1,j−1,t,d)←f(i,j,k,d)⋅(j−1)f(i+1,j-1,t,d)\leftarrow f(i,j,k,d)·(j-1)f(i+1,j1,t,d)f(i,j,k,d)(j1)

  • i+1i+1i+1 从某个段的左/右延伸。

    • 普通延伸。

      f(i+1,j,t,d)←f(i,j,k,d)⋅(2∗j−d)f(i+1,j,t,d)\leftarrow f(i,j,k,d)·(2*j-d)f(i+1,j,t,d)f(i,j,k,d)(2jd)

    • 延伸到了墙。

      f(i+1,j,t,d+1)←f(i,j,k,d)⋅(2−l)f(i+1,j,t,d+1)\leftarrow f(i,j,k,d)·(2-l)f(i+1,j,t,d+1)f(i,j,k,d)(2l)

有些转移还有对 i,j,k,di,j,k,di,j,k,d 的限制,具体可见下面代码。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
int f[2][102][1002][3];
int a[105], n, L;signed main() {scanf( "%lld %lld", &n, &L );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );if( n == 1 ) return ! puts("1");sort( a + 1, a + n + 1 );f[0][0][0][0] = 1;for( int i = 0;i < n;i ++ ) {int o = i & 1;memset( f[o ^ 1], 0, sizeof( f[o ^ 1] ) );for( int j = 0;j <= i + 1;j ++ )for( int k = 0;k <= L;k ++ )for( int d = 0;d <= 2;d ++ ) {if( ! f[o][j][k][d] ) continue;int t = k + ( a[i + 1] - a[i] ) * ( j * 2 - d );if( t > L  ) continue;( f[o ^ 1][j + 1][t][d] += f[o][j][k][d] * ( j + 1 - d ) ) %= mod;if( d < 2 ) ( f[o ^ 1][j + 1][t][d + 1] += f[o][j][k][d] * ( 2 - d ) ) %= mod;( f[o ^ 1][j][t][d] += f[o][j][k][d] * ( 2 * j - d ) ) %= mod;if( j ) ( f[o ^ 1][j - 1][t][d] += f[o][j][k][d] * ( j - 1 ) ) %= mod;if( d < 2 and j ) ( f[o ^ 1][j][t][d + 1] += f[o][j][k][d] * ( 2 - d ) ) %= mod;}}int ans = 0;for( int i = 0;i <= L;i ++ ) ( ans += f[n & 1][1][i][2] ) %= mod;printf( "%lld\n", ans );return 0;
}

topcoder srm 489 div1 lev3 : AppleTrees

Vjudge-AppleTrees

topcoder这是什么煞笔提交方式(无能狂怒

如果我们确定了一个种树的顺序,那么相邻树的最小间距也随之确定。

DDD 减去这个最小间距,就可以看成一个插板问题了。

所以我们要求出对于每一个 LLL,满足条件 L=∑i=1n−1max⁡{r(Pi),r(Pi+1)}L=\sum_{i=1}^{n-1}\max\Big\{r(P_i),r(P_{i+1})\Big\}L=i=1n1max{r(Pi),r(Pi+1)} 的排列数量。

注意到 rrr 最大的 iii 左右种什么数不影响这两段间隙的最小长度,因为均由 rir_iri 决定。

所以我们将 rrr 从小到大排序,贡献由相邻两棵树之间后放入的树(rrr更大的树)决定。

f(i,j,k):f(i,j,k):f(i,j,k):iii 棵树,形成了 jjj 个不相交的排列,排列的代价总和为 kkk 的方案数。

  • i+1i+1i+1 独立成一个新排列。

    f(i+1,j+1,k)←f(i,j,k)f(i+1,j+1,k)\leftarrow f(i,j,k)f(i+1,j+1,k)f(i,j,k)

  • i+1i+1i+1 延伸某个排列。每个排列还有左右延伸之分。

    f(i+1,j,k+ri+1)←f(i,j,k)∗2∗jf(i+1,j,k+r_{i+1})\leftarrow f(i,j,k)*2*jf(i+1,j,k+ri+1)f(i,j,k)2j

  • i+1i+1i+1 合并两个排列。由于每个排列之间没有敲定顺序,所以是任选两个排列还要区分接法。

    f(i+1,j−1,k+2∗ri+1)←f(i,j,k)∗Aj2f(i+1,j-1,k+2*r_{i+1})\leftarrow f(i,j,k)*A_{j}^2f(i+1,j1,k+2ri+1)f(i,j,k)Aj2

#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
long long fac[100005], inv[100005];
long long f[50][50][1700];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = 1ll * ans * x % mod;x = 1ll * x * x % mod;y >>= 1;}return ans;
}void init( int n ) {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod;
}long long C( int n, int m ) {if( n < m ) return 0;else return fac[n] * inv[m] % mod * inv[n - m] % mod;
}class AppleTrees {public :int theCount( int D, vector < int > r ) {int n = r.size();init( D );sort( r.begin(), r.end() );f[0][0][0] = 1;for( int i = 0;i < n;i ++ )for( int j = 0;j <= n;j ++ )for( int k = 0;k <= 1600 and k <= D;k ++ ) {if( ! f[i][j][k] ) continue;( f[i + 1][j + 1][k] += f[i][j][k] ) %= mod;( f[i + 1][j][k + r[i]] += f[i][j][k] * (j << 1) % mod ) %= mod;if( j ) ( f[i + 1][j - 1][k + (r[i] << 1)] += f[i][j][k] * j * (j - 1) % mod ) %= mod;}int ans = 0;for( int i = 1;i <= min( 1600, D );i ++ )ans = ( 1ll * ans + f[n][1][i - 1] * C( D - i + n, n ) % mod ) % mod;return ans;}
};

[CodeForces-626F] Group Projects

CodeForces

与上面的摩天大楼类似。

对于每一组,我们只关心最大值和最小值。

将序列从小到大排序后,每组的最大值减去最小值的差值相当于是一段排序后数组的差分和。

f(i,j,k):f(i,j,k):f(i,j,k):iii 个数,当前分成了若干组,其中有 jjj 组还能继续放数,各组的极值之和为 kkk 的方案数。

当前差分值的贡献为 (ai+1−ai)∗j(a_{i+1}-a_i)*j(ai+1ai)j。记 t=(ai+1−ai)∗j+kt=(a_{i+1}-a_i)*j+kt=(ai+1ai)j+k

  • 单独成一组,且是组的起终点,不能继续放数:f(i+1,j,t)←f(i,j,k)f(i+1,j,t)\leftarrow f(i,j,k)f(i+1,j,t)f(i,j,k)
  • 新开一个组,且不关闭:f(i+1,j+1,t)←f(i,j,k)f(i+1,j+1,t)\leftarrow f(i,j,k)f(i+1,j+1,t)f(i,j,k)
  • 插入某个组,但不结束那个组,有 jjj 种方式:f(i+1,j,t)←f(i,j,k)∗jf(i+1,j,t)\leftarrow f(i,j,k)*jf(i+1,j,t)f(i,j,k)j
  • 插入某个组,且结束那个组,仍有 jjj 种方式:f(i+1,j,t)←f(i,j,k)∗jf(i+1,j,t)\leftarrow f(i,j,k)*jf(i+1,j,t)f(i,j,k)j

答案即为 ∑i=0Kf(n,0,i)\sum_{i=0}^K f(n,0,i)i=0Kf(n,0,i)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
int f[2][205][1005];
int a[205];
int N, K;signed main() {scanf( "%lld %lld", &N, &K );for( int i = 1;i <= N;i ++ ) scanf( "%lld", &a[i] );sort( a + 1, a + N + 1 );f[0][0][0] = 1;for( int i = 0;i < N;i ++ ) {int o = i & 1;memset( f[o ^ 1], 0, sizeof( f[o ^ 1] ) );for( int j = 0;j <= i + 1;j ++ )for( int k = 0;k <= K;k ++ ) {int d = k + ( a[i + 1] - a[i] ) * j;if( d > K ) continue;( f[o ^ 1][j][d] += f[o][j][k] ) %= mod;( f[o ^ 1][j + 1][d] += f[o][j][k] ) %= mod;( f[o ^ 1][j][d] += f[o][j][k] * j ) %= mod;if( j ) ( f[o ^ 1][j - 1][d] += f[o][j][k] * j ) %= mod;}}int ans = 0;for( int i = 0;i <= K;i ++ ) ( ans += f[N & 1][0][i] ) %= mod;printf( "%lld\n", ans );return 0;
}

[TopCoder] Seatfriends

Vjudge

与上面的AppleTrees类似。

如果把空位放入动态规划一起考虑,计数会变得很麻烦。所以只考虑有 kkk 个位置的情况。

因为是环排列,所以先固定第一个人的位置,有 nnn 种选择,f(1,1)=nf(1,1)=nf(1,1)=n

f(i,j):if(i,j):if(i,j):i 个人分成 jjj 组的方案数。注意保证转移过程全程合法。

  • 在任意两组内新增一个组:f(i+1,j+1)←f(i,j)∗jf(i+1,j+1)\leftarrow f(i,j)*jf(i+1,j+1)f(i,j)j。因为是个环,所以空应该有 jjj 个。
  • 新加一个在组的其中一边:f(i+1,j)←f(i,j)∗j∗2f(i+1,j)\leftarrow f(i,j)*j*2f(i+1,j)f(i,j)j2
  • 合并两个组,空仍然有 jjj 个:f(i+1,j−1)←f(i,j)∗jf(i+1,j-1)\leftarrow f(i,j)*jf(i+1,j1)f(i,j)j

注意,当 n=kn=kn=k 的时候,直接返回 f(k−1,1)f(k-1,1)f(k1,1)。因为最后一个人只能坐剩下来的那个空位。

最后考虑各组间插入空位的情况,对于 f(k,j)f(k,j)f(k,j) 而言,要将 n−kn-knk 个空位插入 jjj 个间隔中(每一个至少需要一个空位),显然为 (n−k−1j−1)\binom{n-k-1}{j-1}(j1nk1)

ans=∑j=1Gf(k,j)(n−k−1j−1)ans=\sum_{j=1}^Gf(k,j)\binom{n-k-1}{j-1}ans=j=1Gf(k,j)(j1nk1)

#include <bits/stdc++.h>
using namespace std;
#define maxn 2005
#define mod 1000000007
long long f[2005][2005];
long long fac[maxn], inv[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = 1ll * ans * x % mod;x = 1ll * x * x % mod;y >>= 1;}return ans;
}void init( int n ) {fac[0] = inv[0] = 1;for( int i = 1;i <= n;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[n] = qkpow( fac[n], mod - 2 );for( int i = n - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod;
} int C( int n, int m ) {if( n < m ) return 0;else if( ! n or ! m ) return 1;else return fac[n] * inv[m] % mod * inv[n - m] % mod;
}class Seatfriends {public :int countseatnumb( int n, int k, int g ) {int N = n, K = k, G = g;init( N );f[1][1] = N;for( int i = 1;i < K;i ++ )for( int j = 1;j <= G;j ++ ) {(f[i + 1][j + 1] += f[i][j] * j) %= mod;(f[i + 1][j] += f[i][j] * j * 2) %= mod;(f[i + 1][j - 1] += f[i][j] * j) %= mod;}if( N == K ) return f[K - 1][1];int ans = 0;for( int i = 1;i <= G;i ++ ) (ans += f[K][i] * C(N - K - 1, i - 1) % mod) %= mod;return ans;}
};

小结

  • 排列有空的计数,先把所有空位抽出来,最后组合数乘回去。转移过程中假设空存在,也就是分组的依据。
  • 所求为环排列,钦定一种选法,最后乘上环大小。
  • 插入一般理解为插空
  • 注意是否区分一个组的左右。
  • 注意是否考虑组之间存在顺序,如果存在顺序且转移没考虑,记得乘组数的阶乘。
  • 差分法/微分法技巧
  • 一般状态都定义为 f(i,j,...):if(i,j,...):if(i,j,...):i 个分成 jjj 组,然后可能还要附带一些信息。(是否抵到“墙”)
  • 无序转有序。
  • 状态转移一般都有:插入自成一组;加入某一组;合并某两组;墙组还是普通组。
  • 一般不需要什么多牛逼的优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)

创建ASP.NET Core Web应用程序如果您使用的是VS2017请看 VS2017创建ASP.NET Core Web程序(三)在这个视频中我们将讨论可用的不同项目模板及其功能预制的项目模板有什么不同&#xff0c;哪些是可以使用的&#xff0c;以及他们的作用。在Visual Studio 2019中创建新的ASP.NET Cor…

ASP.NET Core 沉思录 - 结构化日志

在 《ASP.NET Core 沉思录 - Logging 的两种介入方法》中我们介绍了 ASP.NET Core 中日志的基本设计结构。这一次我们来观察日志记录的格式&#xff0c;并进一步考虑如何在应用程序中根据不同的需求选择不同的日志记录形式。太长不读&#xff1a;直接飞到文章最后 :-DMicrosoft…

[CEOI2016] kangaroo(排列dp)

problem luogu-P5999 solution 每个点只能跳一次&#xff0c;显然跳出来形成的顺序是一个排列。不难联想到最近刷的排列 dpdpdp。 然后&#xff0c;我觉得难点在于怎么转化这个跳的规则&#xff0c;因为现在并不确定能否按排列 dpdpdp 一样分段做。 跳的顺序形成的排列必须…

D - Counting Stars HDU - 7059

D - Counting Stars HDU - 7059 题解: 长度为n的序列a&#xff0c;有三个操作&#xff1a; 对某个区间进行询问对于某个区间内的每个数ai&#xff0c;减去ai&(-ai)对于某个区间内的每个数ai&#xff0c;加上2k2^k2k,k满足2k<ai<2k12^k < a_{i} <2^{k1}2k<…

为什么我们要做单元测试?(二)

引子当我第一篇博客发布&#xff0c;并被张善友老师的公众号转载之后&#xff0c;在公众号文章和博客园的留言中&#xff0c;许多开发者纷纷表示&#xff0c;单元测试作为企业行为&#xff0c;与实施的技术栈不同&#xff0c;不是开发者个人行为&#xff0c;实施单元测试花费的…

[CF1368E] Ski Accidents(神仙结论构造)

problem CF1368E Ski Accidents solution 这个 47n\frac 47n74​n 的限制&#xff0c;提示这存在一个特定构造方案&#xff0c;由 777 我们联想到 124712471247。 暗示把顶点分为三类 A,B,CA,B,CA,B,C&#xff0c;满足 ∣C∣≤2∣B∣≤4∣A∣|C|\le 2|B|\le 4|A|∣C∣≤2∣…

P4159 [SCOI2009] 迷路

P4159 [SCOI2009] 迷路 题意&#xff1a; 该有向图有 n 个节点&#xff0c;节点从 1 至 nn 编号&#xff0c;windy 从节点 1 出发&#xff0c;他必须恰好在 t 时刻到达节点 n。 现在给出该有向图(带边权)&#xff0c;你能告诉 windy 总共有多少种不同的路径吗&#xff1f; …

程序员修神之路--提高网站的吞吐量

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;有个事你还得帮我呀呦西&#xff0c;YY妹子&#xff0c;最近天这么热了&#xff0c;你怎么还穿这么多&#xff1f;苦笑一下.....前几天写了几个接口&#xff0c;领导让提高一下接口吞吐量这是你技术提高的大好机会呀可吞…

P2151 [SDOI2009]HH去散步

P2151 [SDOI2009]HH去散步 题意&#xff1a; HH有个一成不变的习惯&#xff0c;喜欢饭后百步走。所谓百步走&#xff0c;就是散步&#xff0c;就是在一定的时间 内&#xff0c;走过一定的距离。 但是同时HH又是个喜欢变化的人&#xff0c;所以他不会立刻沿着刚刚走来的路走回…

Function Query(树状数组)

problem 给定一个长度为 nnn 的排列 aaa。有 qqq 个询问&#xff0c;每次询问一个区间 [l,r][l,r][l,r]。求这个区间的 kkk 值。 其中 k∑ilr∑ji1rf(ai,aj),f(x,y)k\sum_{il}^r\sum_{ji1}^rf(a_i,a_j),f(x,y)k∑ilr​∑ji1r​f(ai​,aj​),f(x,y) 为一个递归函数&#xff0c…

一份.NET 容器化的调查小结

小编在上个月在微信公众号“dotnet跨平台” 做了一个针对.NET 容器化的调查&#xff1a;.NET Core 容器化调查&#xff0c;参与人数702人&#xff0c;由于软件定义基础设施方兴未艾&#xff0c;编排和自动化领域kubernetes占据了主体地位&#xff0c;在平时的工作中和身边的同学…

P2148 [SDOI2009]ED

P2148 [SDOI2009]E&D 题意&#xff1a; 有2n堆石子&#xff0c;第2k-1堆和第2k堆是一组&#xff0c;现在两个人轮流操作&#xff0c;每次操作任选一组石子&#xff0c;然后将改组中的一堆石子移走&#xff0c;将另一堆式子分割成两堆&#xff0c;形成新的两堆石子&#x…

扒一扒.NET Core的环境配置提供程序

前言很久之前&#xff0c;在玩Docker的时候顺便扒了扒&#xff0c;最近&#xff0c;终于下定决心花了些时间整理并成文&#xff0c;希望能够给大家一些帮助。目录 .NET Core中的配置ASP.NET Core中的配置扒一扒环境变量提供程序为什么是“__”&#xff1f;“__”如何变成了“&…

[HNOI2016] 序列(线段树 + 莫队 + 倍增)

problem luogu-P3246 心路历程卡常历程问题存疑 一直在想莫队的做法。发现左右指针的移动对应一段左/右端点固定的子序列&#xff0c;然后可以一个数代表一段相同的贡献。 就开始求 lsti,nxtilst_i,nxt_ilsti​,nxti​ 了。 仔细想想需要找到 lstlsti<l≤lstilst_{lst_…

cf1523C. Compression and Expansion

cf1523C. Compression and Expansion 题意&#xff1a; 让你模拟出一个书的目录&#xff0c;对于每一行给你一个数字&#xff0c;表示这个目录的最后一个数&#xff0c; 题解&#xff1a; 我们用vector存当前的目录情况&#xff0c;读到下一行&#xff0c;在尽量少删上一行…

《从零开始学ASP.NET CORE MVC》:ASP.NET Core 中的 Main方法(5)

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core Web 项目文件ASP.NET Core 中的 Main方法一个开始专心写字的人在ASP.NET Core项目中&#xff0c;我们有一个名为Program.cs的文件。在这个文件中&#xff0c;我们有一个public static void Main&#…

[HNOI2016] 大数(莫队)

problem luogu-P3245 solution 将这个 nnn 位数从右往左的记录取模 ppp 的结果&#xff0c;即 f(i)(f(i−1)∗10si)%pf(i)(f(i-1)*10s_i)\% pf(i)(f(i−1)∗10si​)%p。 显然一个子串是 ppp 的倍数必然满足&#xff1a;f(r)−f(l−1)10r−l1≡0(modp)\frac{f(r)-f(l-1)}{10…

2021牛客暑期多校训练营9

2021牛客暑期多校训练营9 题号题目知识点AA Math ChallengeBBest SubgraphCCellsDDivide-and-conquer on TreeEEyjafjallaFFinancial Order ExecutionGGlass BallsHHappy NumberIIncentive ModelJJam

.NET中的状态机库Stateless

标题&#xff1a;.NET中的状态机库Stateless 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10674018.html[1]介绍什么是状态机和状态模式状态机是一种用来进行对象建模的工具&#xff0c;它是一个有向图形&#xff0c;由一组节点和一组相应的转…

[APIO2016] 划艇(dp + 组合数 + 前缀和优化)

problem luogu-P3643 solution 有个显然的暴力 dpdpdp。设 dp(i,j):dp(i,j):dp(i,j): 到了第 iii 个学校&#xff0c;其参加且派出 jjj 个划艇的方案数。 枚举上一个参加的学校以及派出的划艇&#xff0c;则有转移&#xff1a;dp(i,j)∑k<i,j<jdp(k,j′)dp(i,j)\sum_…