【十二省联考2019】希望【点边容斥】【换根dp】【长链剖分】【线性数据结构】【回退数据结构】【离线逆元】

题意:给一棵树,两个参数 k,Lk,Lk,L,需要选择 kkk 个连通块,使得这 kkk 个连通块存在一个公共点,且该公共点到 kkk 个连通块内的任意一点的距离不超过 LLL,求方案数 模 998244353998244353998244353。两种方案不同当且仅当连通块的集合不同。

n≤106,k≤10n\leq 10^6,k\leq 10n106,k10

已经写绝望了

对于一种连通块的集合,合法的钦定的点一定是一个连通块。所以可以通过 点数−边数=1点数-边数=1=1 来容斥。即考虑每个点的贡献,再减去对于每条边,两个端点都合法的方案。

然后考虑暴力 dp。

f(u,L)f(u,L)f(u,L) 为以 uuu 为根的子树内,包含 uuu,到的距离不超过 LLL 的连通块个数 +1+1+1(为了方便转移,也可理解为允许为空)。

g(u,L)g(u,L)g(u,L) 表示 uuu 往上走,即必须包含 uuu,且不能包含 uuu 子树内其他结点,到 uuu 的距离不超过 LLL 的连通块个数。(注意 +1+1+1,即不能为空。)

得到转移

f(u,L)=∏v∈son(u)f(v,L−1)+1f(u,L)=\prod_{v\in son(u)}f(v,L-1)+1f(u,L)=vson(u)f(v,L1)+1

边界 f(u,0)=1f(u,0)=1f(u,0)=1

g(u,L)=g(fau,L−1)∏v∈son(fau),v≠uf(v,L−2)+1g(u,L)=g(fa_u,L-1)\prod_{v\in son(fa_u),v\neq u}f(v,L-2)+1g(u,L)=g(fau,L1)vson(fau),v=uf(v,L2)+1

边界 f(u,0)=f(u,−1)=1f(u,0)=f(u,-1)=1f(u,0)=f(u,1)=1。后面这个 +1+1+1 表示 {u}\{u\}{u} 这个连通块。

最终答案为

∑u=1n(f(u,L)−1)kg(u,L)k−[u≠rt](f(u,L−1)−1)k(g(u,L)−1)k\sum_{u=1}^n(f(u,L)-1)^kg(u,L)^k-[u\neq rt](f(u,L-1)-1)^k(g(u,L)-1)^ku=1n(f(u,L)1)kg(u,L)k[u=rt](f(u,L1)1)k(g(u,L)1)k

发现状态和深度有关,考虑长链剖分。以下设 mxumx_umxu 表示 uuu 到子树内最远点经过的 点数,简称深度。


f(u,L)=∏v∈son(u)f(v,L−1)+1f(u,L)=\prod_{v\in son(u)}f(v,L-1)+1f(u,L)=vson(u)f(v,L1)+1

这个是经典的长链剖分的形式,直接继承长儿子的信息,短儿子暴力转移。

然后状态定义的是不超过,所以你维护的只是 DP 数组里 [0,mxu)[0,mx_u)[0,mxu) 的信息, [mxu,+∞)[mx_u,+\infin)[mxu,+) 也是有值的。如果暴力到长儿子的深度会让复杂度退化。

不过注意到 [mxu,+∞)[mx_u,+\infin)[mxu,+) 内的值都是 f(u,mxu−1)f(u,mx_u-1)f(u,mxu1),所以相当于是个后缀乘法。然后 DP 式子后面还有个 +1 ,相当于要维护以下操作:

  1. 单点修改,要求 O(1)O(1)O(1)
  2. 全局加,要求 O(1)O(1)O(1)
  3. [x,+∞)[x,+\infin)[x,+) 乘,要求 O(x)O(x)O(x)

这可以通过打全局标记来实现。具体来讲,我们对当前点 uuu 维护两个标记 mulu,plsumul_u,pls_umulu,plsu,表示存储的一个数 xxx 表示的真实值为 mulux+plsumul_u x+pls_umulux+plsu

2 操作直接改标记,3操作修改 mulumul_umulu 后把 [0,x)[0,x)[0,x) 乘上逆元,1 操作改完后倒着把存储的值算出来放进去,就可以做到 O(n)O(n)O(n)

你以为这就完了?奶义务!

乘上的这个数可能在模意义下000,是没有逆元的,并且不像一年后的某道莫反矩阵树缝合怪题,这个东西非常好构造,直接连长度分别为 2,2,⋯,2⏟23,6,16\begin{matrix} \underbrace{ 2,2,\cdots,2 } \\ 23\end{matrix},6,162,2,,223,6,16 的链就可以了。

所以我为什么没在 CSP 前看到这个东西

所以我们需要再开两个标记 limu,valulim_u,val_ulimu,valu,表示 [limu,+∞)[lim_u,+\infin)[limu,+) 这一段的存储的值valuval_uvalu。如果这个数是 000,相当于后缀赋值,把 limulim_ulimu 赋值为 xxxvaluval_uvalu 赋值为真实值为 000 时对应的存储值。

Q:为什么不能定义为"limulim_ulimu 及之后的数都是 000",还可以少开个标记?

A:因为这里只是暂时为 000,之后的全局加对这里是有影响的。

这样做到了 O(nlog⁡P)O(n\log P)O(nlogP)。注意到每次求逆元的都是 f(v,mxv−1)f(v,mx_v-1)f(v,mxv1) ,即不限制距离的方案数,所以可以先做一个简单的 DP 算出来,然后 O(n)O(n)O(n) 离线求逆元,注意要跳过为 000 的。维护 mulumul_umulu 标记的时候顺便维护一下它的逆元,就可以 O(n)O(n)O(n) 了。


g(u,L)=g(fau,L−1)∏v∈son(fau),v≠uf(v,L−2)+1g(u,L)=g(fa_u,L-1)\prod_{v\in son(fa_u),v\neq u}f(v,L-2)+1g(u,L)=g(fau,L1)vson(fau),v=uf(v,L2)+1

大家可能会觉得很奇怪,这个往上走的 DP 怎么能用长链剖分优化呢?

注意到我们答案需要的只有 g(u,L)g(u,L)g(u,L),所以对于一个叶子结点,它没有儿子需要它的其他信息,所以只需要维护 g(u,L)g(u,L)g(u,L) 这一个位置。类似的,对于点 uuu ,我们只需要维护 [L−mxu+1,L][L-mx_u+1,L][Lmxu+1,L] 中的值。

也就是说我们规定 g(u,…)g(u,\dots)g(u,)定义域只有 [max⁡(L−mxu+1,0),L][\max(L-mx_u+1,0),L][max(Lmxu+1,0),L],这样状态数就和深度正相关了。

把信息直接继承给长儿子,短儿子暴力转移,再乘上一个 f(u,L−1)−1f(v,L−2)\frac{f(u,L-1)-1}{f(v,L-2)}f(v,L2)f(u,L1)1

然后你又错了,因为 f(v,L−2)f(v,L-2)f(v,L2) 可能没有逆元。所以我们只能算前缀积和后缀积了。

前缀积在遍历的时候可以顺便维护。为了方便实现,可以把每个结点的轻儿子按深度从小到大排序,这样你只需要记 333 个标记。严格意义上需要桶排保证复杂度,不过直接 sort 也能过。之后假装这个排序是 O(n)O(n)O(n) 的。

然后开一个数组 preprepre ,用 preipre_iprei 记录 f(v,i)f(v,i)f(v,i) 的前缀积就可以了,配合后缀赋值标记就可以维护整个前缀积。

对于后缀积是不能跑一遍记下来的,因为开不下……

但我们在计算 fff 的时候做了一遍这东西,怎么能浪费了呢?

我们在计算 fff 的时候倒着做,即按轻儿子深度从大到小排序。对于 dpdpdp 值和 555 个标记的修改,把它修改的过程记录下来,对就是可撤销并查集的那个东西。

然后在算 ggg 的时候不断把修改撤销,这样 f(u,L−1)f(u,L-1)f(u,L1) 维护的就是后缀积。

这样只能算出轻儿子,重儿子因为撤回不了,所以需要再利用之前你算的前缀积单独搞一下。

因为还是有乘法和全局加操作,所以你还是得维护一堆标记。并且尽管定义域很有限,为了保证复杂度,你还是得维护后缀赋值标记。注意这个标记和前缀积的标记没有关系

需要注意的细节:

  1. 因为有边界情况,需要手动把 f(u,0)f(u,0)f(u,0) 改成 111。注意因为定义不同,fff 需要先改 000 再全局加,而 ggg 是全局加了再改 000。并且 ggg 还要判断 000 在不在定义域内。
  2. 边界情况 limulim_ulimu 需要维护准确值,或者用其他一些骚操作,不然之前的值会出问题。
  3. 因为定义域的问题,不能偷懒把前缀积挂在 g(u,L−1)g(u,L-1)g(u,L1) 上。
  4. 回退时的 f(u,L−1)f(u,L-1)f(u,L1) 实际上维护的是 f(v,L−2)f(v,L-2)f(v,L2) 的后缀积,在 L=1L=1L=1 的时候是未定义的,需要特判。

复杂度 O(nlog⁡k)O(n\log k)O(nlogk)

用尽各种毒瘤方法把一个不可做的计数题做到线性,最后却因为一个 101010 的快速幂无法把复杂度写成 O(n)O(n)O(n),真是悲壮……

代码中的迷惑部分都有注释。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <utility>
#include <list>
#include <algorithm>
#define MAXN 1000005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
const int MOD=998244353;
typedef long long ll;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD:x-y;}
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD,p>>=1;}return ans;
}
vector<int> T[MAXN],e[MAXN];//T 是所有相邻的点,e 是所有轻儿子
int fa[MAXN],son[MAXN],mx[MAXN],s[MAXN],sinv[MAXN],n,L,k;
void dfs(int u,int f)
{fa[u]=f,s[u]=1;for (int i=0;i<(int)T[u].size();i++)if (T[u][i]!=f){dfs(T[u][i],u);if (mx[T[u][i]]>mx[son[u]]) son[u]=T[u][i];s[u]=(ll)s[u]*s[T[u][i]]%MOD;}mx[u]=mx[son[u]]+1;s[u]=add(s[u],1);
}
int fac[MAXN],finv[MAXN]; 
inline bool cmp(const int& x,const int& y){return mx[x]>mx[y];}
inline void init()
{fac[0]=1;for (int i=1;i<=n;i++)if (s[i]) fac[i]=(ll)fac[i-1]*s[i]%MOD;else fac[i]=fac[i-1];finv[n]=qpow(fac[n],MOD-2);for (int i=n-1;i>=1;i--)if (s[i+1]) finv[i]=(ll)finv[i+1]*s[i+1]%MOD;//跳过 0,后同else finv[i]=finv[i+1];for (int i=1;i<=n;i++) if (s[i]) sinv[i]=(ll)finv[i]*fac[i-1]%MOD;for (int i=1;i<=n;i++) stable_sort(e[i].begin(),e[i].end(),cmp);//stable 是为了方便调试
}
void dfs(int u)
{if (son[u]) dfs(son[u]);for (int i=0;i<(int)T[u].size();i++)if (T[u][i]!=fa[u]&&T[u][i]!=son[u])e[u].push_back(T[u][i]),dfs(T[u][i]);
}
int F1[MAXN],F2[MAXN],G1[MAXN];
struct BackDS
{typedef pair<int*,int> pi;list<pi> his;inline void modify(int& x,int v){his.push_back(make_pair(&x,x)),x=v;}inline void undo(){while (!his.empty()) *his.back().first=his.back().second,his.pop_back();}
}q[MAXN];
namespace F
{int buf[MAXN],*cur=buf;int* dp[MAXN];inline int* newbuf(int x){int* p=cur;cur+=x;return p;}int mul[MAXN],inv[MAXN],pls[MAXN],lim[MAXN],val[MAXN];inline int calc(int u,int i)//计算真实值{if (i<lim[u]) return ((ll)mul[u]*dp[u][i]+pls[u])%MOD;else return ((ll)mul[u]*val[u]+pls[u])%MOD;}inline int clac(int u,int v){return (ll)dec(v,pls[u])*inv[u]%MOD;}//根据真实值的得到应该存储的值void dfs(int u){if (son[u]){dp[son[u]]=dp[u]+1;dfs(son[u]);mul[u]=mul[son[u]],inv[u]=inv[son[u]],pls[u]=pls[son[u]];lim[u]=lim[son[u]]+1,val[u]=val[son[u]];dp[u][0]=clac(u,1);		}else{mul[u]=inv[u]=lim[u]=1,pls[u]=F1[u]=F2[u]=2;return;}int las=0;for (int k=0;k<(int)e[u].size();k++){int v=las=e[u][k];dp[v]=newbuf(mx[v]),dfs(v);for (int i=1;i<=mx[v];i++){if (i==lim[u])  q[v].modify(dp[u][i],val[u]), q[v].modify(lim[u],lim[u]+1);q[v].modify(dp[u][i],clac(u,(ll)calc(u,i)*calc(v,i-1)%MOD));}if (s[v]){q[v].modify(mul[u],(ll)mul[u]*s[v]%MOD);q[v].modify(inv[u],(ll)inv[u]*sinv[v]%MOD);q[v].modify(pls[u],(ll)pls[u]*s[v]%MOD);for (int i=0;i<=mx[v];i++)  q[v].modify(dp[u][i],clac(u,(ll)calc(u,i)*sinv[v]%MOD));}else  q[v].modify(lim[u],mx[v]+1),q[v].modify(val[u],clac(u,0));}if (las) q[las].modify(pls[u],add(pls[u],1));//把全局加挂在最后一个轻儿子上,这样一来就会撤回else pls[u]=add(pls[u],1);//没有轻儿子的话反正都没有用,随便加F1[u]=calc(u,L),F2[u]=calc(u,L-1);}inline void solve(){dp[1]=newbuf(mx[1]),dfs(1);}
}
namespace G
{int buf[MAXN],pre[MAXN],*cur=buf;int* dp[MAXN];inline int* newbuf(int x){int* p=cur;cur+=x;return p;}int mul[MAXN],inv[MAXN],pls[MAXN],lim[MAXN],val[MAXN];inline int calc(int u,int i){if (i<lim[u]) return ((ll)mul[u]*dp[u][i]+pls[u])%MOD;return ((ll)mul[u]*val[u]+pls[u])%MOD;}inline int clac(int u,int v){return (ll)dec(v,pls[u])*inv[u]%MOD;}void dfs(int u){G1[u]=calc(u,L);pre[0]=1;int pos=1,cur=1,cinv=1;for (int k=(int)e[u].size()-1;k>=0;k--)//按深度从小到达枚举{int v=e[u][k];q[v].undo();dp[v]=newbuf(mx[v])-max(0,L-mx[v]+1);mul[v]=inv[v]=1,lim[v]=L+1;for (int i=max(0,L-mx[v]+1);i<=L;i++){int t=1;if (i) t=(ll)t*calc(u,i-1)%MOD;if (i>1){t=(ll)t*F::calc(u,i-1)%MOD;//见细节4if (i-2<pos) t=(ll)t*pre[i-2]%MOD;else t=(ll)t*cur%MOD;	}dp[v][i]=clac(v,t);}pls[v]=add(pls[v],1);if (L-mx[v]+1<=0) dp[v][0]=clac(v,1);//是否在定义域内for (int i=0;i<=mx[v];i++){if (i<pos) pre[i]=(ll)pre[i]*F::calc(v,i)%MOD;else pre[i]=(ll)cur*F::calc(v,i)%MOD;}pos=mx[v]+1;cur=(ll)cur*s[v]%MOD,cinv=(ll)cinv*sinv[v]%MOD;}int v=son[u];if (v){mul[v]=mul[u],inv[v]=inv[u],pls[v]=pls[u],lim[v]=lim[u]+1,val[v]=val[u];dp[v]=dp[u]-1;for (int i=max(2,L-mx[v]+1);i<=pos+1;i++){if (i==lim[v]) dp[v][lim[v]++]=val[v];dp[v][i]=clac(v,(ll)calc(v,i)*pre[i-2]%MOD);	} if (cur){mul[v]=(ll)mul[v]*cur%MOD;pls[v]=(ll)pls[v]*cur%MOD;inv[v]=(ll)inv[v]*cinv%MOD;for (int i=max(0,L-mx[v]+1);i<=pos+1;i++) dp[v][i]=clac(v,(ll)calc(v,i)*cinv%MOD);}else lim[v]=pos+1,val[v]=clac(v,0);pls[v]=add(pls[v],1);if (L-mx[v]+1<=0) dp[v][0]=clac(v,1);dfs(v);}for (int i=0;i<(int)e[u].size();i++) dfs(e[u][i]);//算完再递归,避免 pre 冲突}inline void solve(){dp[1]=newbuf(mx[1])-max(L-mx[1]+1,0),mul[1]=inv[1]=pls[1]=1,lim[1]=L+1,dfs(1);}
}
int main()
{n=read(),L=read(),k=read();if (!L) return printf("%d\n",n),0;for (int i=1;i<n;i++) {int u,v;u=read(),v=read();T[u].push_back(v),T[v].push_back(u);}dfs(1,0),dfs(1);init();F::solve(),	G::solve();int ans=0;for (int i=1;i<=n;i++){ans=add(ans,qpow((ll)dec(F1[i],1)*G1[i]%MOD,k));if (i>1) ans=dec(ans,qpow((ll)dec(F2[i],1)*dec(G1[i],1)%MOD,k));}cout<<ans;return 0;
}

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

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

相关文章

Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes kmp + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 通过完美子串的定义&#xff0c;我们不难发现满足条件的子串就是kmpkmpkmp中ne[n]ne[n]ne[n]不断向前跳得到的串&#xff0c;现在问题就是如何求这些前缀串在串中出现的次数了。 考虑一个前…

译 | 宣布ML.NET 1.2 及模型生成器更新(用于 .NET 的机器学习)

原文&#xff1a;Cesar De la Torre翻译&#xff1a;Edi Wang我们很高兴地宣布ML.NET 1.2 和模型生成器和 CLI 的更新。ML.NET是 .NET 开发人员的开源和跨平台机器学习框架。ML.NET还包括模型生成器(Visual Studio 的简单 UI 工具)和ML.NET CLI(命令行界面),以便使用自动机器学…

【十二省联考2019】皮配【分部dp】

题意&#xff1a;有 nnn 个学校隶属于 ccc 个城市&#xff0c;每个学校有 sis_isi​ 个人。把它们放入一个 222\times 222 的格子中&#xff0c;要求同一学校的必须放在同一个格子&#xff0c;同一城市的必须放在同一行&#xff0c;并给出两行两列分别最多能放的人数C0,C1,D0,D…

Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 之前做过类似的题&#xff0c;翻转一个字串相当于将任意两个不相交的串连在一起。再一看字符集≤20\le20≤20&#xff0c;那就是铁子集dpdpdp了。 定义f[i]f[i]f[i]表示状态为iii的串的长度…

一个超轻量级工作流引擎:Workflow-Core

近期工作上有一个工作流的开发需求&#xff0c;自己基于面向对象和职责链模式捣鼓了一套小框架&#xff0c;后来在github上发现一个轻量级的工作流引擎轮子&#xff1a;Workflow-Core&#xff0c;看完其wiki之后决定放弃之前自己造的轮子&#xff0c;使用这个开源项目来改造&am…

Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接考虑比较难想&#xff0c;这种公式题基本都是将部分答案看成一个整体&#xff0c;考虑xi,xi1x_i,x_{i1}xi​,xi1​的贡献的。 假设当前的xix,xi1y,x<yx_ix,x_{i1}y,x<yxi​x,xi1…

【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】

题意&#xff1a;长度为 nnn 的环染 mmm 种颜色&#xff0c;要求任意相邻 mmm 个元素不能包含全部的颜色。求方案数 模 109710^971097&#xff0c;循环同构。 n≤109,m≤7n\leq 10^9,m\leq7n≤109,m≤7 为啥我现在天天都在打表啊 先上 polya&#xff0c;对于移动 iii 位的置换…

ASP.NET Core 3.0中支持AI的生物识别安全

本文共两个部分&#xff0c;这是第一部分&#xff0c;其中介绍了 ASP.NET Core 3 中旨在将授权逻辑与基本的用户角色相分离的基于策略的授权模型。此部分提供了此授权进程的基于生物识别信息&#xff08;如人脸识别或语音识别&#xff09;的具体示例。在此示例中&#xff0c;检…

Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 有nnn个人&#xff0c;每个人都有一个能力值bib_ibi​以及他会的技能aia_iai​&#xff0c;当他会第xxx个技能的时候&#xff0c;aia_iai​的第xxx位是111。定义当xxx不会某个技能但是yyy会的时候&#xff0…

架构杂谈《五》

保证最终一致性的模式在大规模、高并发服务化系统中&#xff0c;一个功能被拆分成多个具有功能单一的子功能&#xff0c;一个流程会有多个系统的多个单一功能的服务组合实现&#xff0c;如果使用两阶段提交协议和三阶段提交协议&#xff0c;确实能解决系统间的一致性问题。其实…

【ROI 2019 Day2】课桌【贪心】【决策单调性】【分治】

题意&#xff1a;有 mmm 个班&#xff0c;每个班有 2n2n2n 个人&#xff0c;他们的身高给定。有 kkk 种双人桌&#xff0c;每张桌子有两个属性值 Li,RiL_i,R_iLi​,Ri​,一个身高为 hhh 的人坐第 iii 种桌子的不舒适度为 hhh 到区间 [Li,Ri][L_i,R_i][Li​,Ri​] 的最小距离。你…

Codeforces Round #588 (Div. 2) E. Kamil and Making a Stream 数学 + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一颗树&#xff0c;其中根是111&#xff0c;每个点有一个点权&#xff0c;求每个点到根的所有路径的gcdgcdgcd之和。 n≤1e5n\le1e5n≤1e5 思路&#xff1a; 一看到以为是个点分治&#xff0c;让后发现…

【NOIP模拟】彩色树【树形dp】【树链剖分性质】【复杂度分析】

题意&#xff1a;一棵初始时为空的树&#xff0c;依次加入 nnn 个叶结点&#xff0c;每次加入后询问 用若干不同颜色的路径将树边染色后 每个点到根经过的颜色数 的最大值 的最小值。 n≤106n\leq 10^6n≤106 首先发现这个路径没啥用&#xff0c;其实就是个剖分方案。 然后我…

在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)

背景平时开发大部人都是在提供了高效GUI的window下工作&#xff0c;但是真正部署环境普遍都是在Linux中&#xff0c;所以为了让开发环境和部署环境统一&#xff0c;我们需要在windows模拟LInux环境&#xff0c;以前我们可能通过虚拟机的方式实现&#xff0c;不过自从微软拥抱开…

NOIP2020 赛前总结

没有一眼秒的题都必须对拍&#xff0c;这里对拍包括疯狂造小数据人工检查。所以不会的话放心打暴力吧&#xff0c;反正写出来了也要对拍。码农题最后码。预估可能会失误&#xff0c;不要认为写一半就丢了很可惜&#xff0c;其他更可做的题没碰更可惜。想起了就把文件夹复制一遍…

.net持续集成cake篇之cake介绍及简单示例

cake介绍Cake 是.net平台下的一款自动化构建工具,可以完成对.net项目的编译,打包,运行单元测试,集成测试甚至发布项目等等.如果有些特征Cake没有实现,我们还可以很容易地通过扩展Cake来实现我们想要的功能.Cake有以下特点1) 使用c#语言编写,可以在Cake脚本里使用C#语言来实现我…

Educational Codeforces Round 73 (Rated for Div. 2) Make The Fence Great Again dp + 结论

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先证明一个结论&#xff1a;一个数最多被加两次。 首先假设a[i]a[i−1]a[i]a[i-1]a[i]a[i−1]或a[i]a[i1]a[i]a[i1]a[i]a[i1]&#xff0c;那么此时可以将a[i]a[i]1a[i]a[i]1a[i]a[i]1&am…

.NET Core 3.0 发布小尺寸 self-contained 单体可执行程序

.NET Core 提供的发布应用程序选项 self-contained 是共享应用程序的好方法&#xff0c;因为应用程序的发布目录包含所有组件、运行时和框架。您只需要告诉使用者应用程序的入口 exe 文件&#xff0c;就可以使程序运行起来&#xff0c;而不必担心目标计算机上是否存在.NET Core…

NOIP 2020 游记

Day -1 校内考试出阴间题&#xff0c;体验极差。 晚上写了发压位高精&#xff0c;一发 AC&#xff0c;感觉很飘&#xff08;flag&#xff09; Day 1 8:00 进考场 8:10 分发压缩包&#xff0c;随便点开看看&#xff0c;看题目名字感觉很友好。然后就在一个叫 ball 的文件夹…

Educational Codeforces Round 73 (Rated for Div. 2) E. Game With String 思维博弈 好题(2500)

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们将每一段...拿出来看成若干段&#xff0c;将其分成以下四种情况&#xff1a; (1)len<b(1)len<b(1)len<b (2)b≤len<a(2)b\le len<a(2)b≤len<a (3)a≤len<2∗b(3…