笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

文章目录

  • 笛卡尔树
    • 介绍
    • 例题
      • Largest Submatrix of All 1’s
    • 应用
      • 「POI2015」洗车 Myjnie
      • [AGC028B] Removing Blocks
      • SPOJ PERIODNI

笛卡尔树

介绍

笛卡尔树是一种数据结构,每个点由两个值,键值key和权值val,组成

  • 其键值满足二叉树性质

    • 即点的左子树内所有点的键值均小于点的键值,点的键值均小于点的右子树内所有点的键值

      所以笛卡尔树按照中序遍历就会得到原序列

      通常笛卡尔树的键值就是下标

  • 其权值满足堆的性质

    • 可以是大根堆,可以是小根堆

      以小根堆为例,点的权值是该点子树内所有点的权值最小值

      每个点代表一个连续区间的信息

如果某笛卡尔树,键值和权值互不相等,则建出来得笛卡尔树是唯一的

eg

笛卡尔树的构建时间复杂度是O(n)O(n)O(n)

按照键值是下标的原则,顺次加入点

则每次点都会走根的右边,路径是一条右链

但这只能维护笛卡尔树的二叉树性质,无法维护堆的性质

实际上,使用单调栈维护笛卡尔树的右链

找到第一个权值大于新点权值的点

发现用新点代替该点,并使得该点及其一下所有点都成为新点的左子树

恰好维护了笛卡尔树的性质

对应的单调栈操作就会把该点及后面的点全都弹栈

然后新点入栈

build

模板

void build() {stack < int > s;for( int i = 1;i <= n;i ++ ) {while( ! s.empty() and h[s.top()] >= h[i] )lson[i] = s.top(), s.pop();if( ! s.empty() ) rson[s.top()] = i;s.push( i );}while( ! s.empty() ) rt = s.top(), s.pop();
}

例题

笛卡尔树的应用最常见的就是与直方图的结合,求最长矩阵的面积

eg

Largest Submatrix of All 1’s

POJ3494

此题无非多了一个枚举直方图的底边在第几行,所以用来当模板题没有问题

题意:求全为1的矩阵最大面积

把每一列当成一个建筑

枚举直方图的底边后,计算出从第一行到底边的每一列的高度

只取从底边开始延伸的连续段,半路夭折的段不需要考虑,因为底边是枚举的,那些段一定被计算过了

然后就是模板的笛卡尔树建立

因为笛卡尔树的每个点代表一个连续区间的最小值,所以求存在矩阵的最大值

就考虑矩阵的高度是每个点的可能,那可延伸的高度就是这个点管辖的区间长度,也就等于子树个数(含自身)

一遍dfs就可以计算得出

#include <stack>
#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 2005
int n, m, rt, ans;
int h[maxn], s[maxn], lson[maxn], rson[maxn];
int a[maxn][maxn];void build() {stack < int > s;for( int i = 1;i <= n;i ++ ) {while( ! s.empty() and h[s.top()] >= h[i] )lson[i] = s.top(), s.pop();if( ! s.empty() ) rson[s.top()] = i;s.push( i );}while( ! s.empty() ) rt = s.top(), s.pop();
}int dfs( int x ) {if( ! x ) return 0;int siz = dfs( lson[x] ) + dfs( rson[x] ) + 1;ans = max( ans, siz * h[x] );return siz;
}int main() {while( ~ scanf( "%d %d", &m, &n ) ) {for( int i = 1;i <= m;i ++ )for( int j = 1;j <= n;j ++ )scanf( "%d", &a[i][j] );ans = 0;for( int i = 1;i <= m;i ++ ) {for( int j = 1;j <= n;j ++ ) {lson[j] = rson[j] = 0;if( a[i][j] ) h[j] ++;else h[j] = 0;}build();dfs( rt );}printf( "%d\n", ans );}return 0;
}

应用

然而,笛卡尔树很多应用其实都非常难

且直白地考察笛卡尔树的并不多

只能说很多题有用到类似笛卡尔树的思想罢了

其实代码通篇看不到真正的笛卡尔树建立使用

所以说,实际上很多题就算不会笛卡尔树的人可能也会做

硬要扯到笛卡尔树,我只能说可能略显牵强罢了

「POI2015」洗车 Myjnie

dpl,r,k:[l,r]dp_{l,r,k}:[l,r]dpl,r,k:[l,r]洗车店中最小花费为kkk的最大收益

枚举最小花费的位置xxx

hx,k:[l,r]h_{x,k}:[l,r]hx,k:[l,r]区间内含xxx点的花费上限≥k\ge kk的人数

dpl,r,k=max⁡{dpl,x−1,i≥k+dpx+1,r,j≥k+hx,k∗k}dp_{l,r,k}=\max\Big\{dp_{l,x-1,i\ge k}+dp_{x+1,r,j\ge k}+h_{x,k}*k\Big\}dpl,r,k=max{dpl,x1,ik+dpx+1,r,jk+hx,kk}

gl,r,k:max⁡{dpl,r,i≥k}g_{l,r,k}:\max\Big\{dp_{l,r,i\ge k}\Big\}gl,r,k:max{dpl,r,ik}

dpl,r,k=max⁡{gl,x−1,k+gx+1,r,k+hx,k∗k}dp_{l,r,k}=\max\Big\{g_{l,x-1,k}+g_{x+1,r,k}+h_{x,k}*k\Big\}dpl,r,k=max{gl,x1,k+gx+1,r,k+hx,kk}

kkk(每个人的承受能力cic_ici)离散化

时间复杂度O(n3m)O(n^3m)O(n3m)

输出方案,就在DPDPDP转移的时候顺便记录最大值选取的xxx即可

fi,j,kf_{i,j,k}fi,j,k :最小值xxx的位置

lsti,j,klst_{i,j,k}lsti,j,k :后缀ggg贡献i≥xi\ge xix中的收益最大值对应的iii

本题就是完全没有笛卡尔树的影子,只能说dpdpdp的设置和寻找区间最小值以及最后方案店消费设置为cic_ici用到了类似笛卡尔树的建立和询问

但如果没学过笛卡尔树,也很有可能想得到这个dp以及答案构造的贪心策略

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 52
#define maxm 4002
int n, m;
struct node { int l, r, c; }p[maxm];
int c[maxm], ans[maxn];
int h[maxn][maxm];
int f[maxn][maxn][maxm], g[maxn][maxn][maxm], lst[maxn][maxn][maxm];void dfs( int l, int r, int k ) {if( l > r ) return;int x = f[l][r][k = lst[l][r][k]];ans[x] = c[k];dfs( l, x - 1, k );dfs( x + 1, r, k );
}int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= m;i ++ ) {scanf( "%d %d %d", &p[i].l, &p[i].r, &p[i].c );c[i] = p[i].c;}sort( c + 1, c + m + 1 );int cnt = unique( c + 1, c + m + 1 ) - c - 1;for( int i = 1;i <= m;i ++ )p[i].c = lower_bound( c + 1, c + cnt + 1, p[i].c ) - c;for( int len = 1;len <= n;len ++ )for( int i = 1;i <= n;i ++ ) {int j = i + len - 1;if( j > n ) break;for( int x = i;x <= j;x ++ )for( int k = 1;k <= cnt;k ++ )h[x][k] = 0;for( int k = 1;k <= m;k ++ )if( i <= p[k].l and p[k].r <= j )for( int x = p[k].l;x <= p[k].r;x ++ )h[x][p[k].c] ++;for( int x = i;x <= j;x ++ )for( int k = cnt;k;k -- )h[x][k] += h[x][k + 1];for( int k = cnt;k;k -- ) {int Max = 0; for( int x = i;x <= j;x ++ )if( Max <= g[i][x - 1][k] + g[x + 1][j][k] + c[k] * h[x][k] ) {Max = g[i][x - 1][k] + g[x + 1][j][k] + c[k] * h[x][k];f[i][j][k] = x;}if( Max >= g[i][j][k + 1] ) g[i][j][k] = Max, lst[i][j][k] = k;else g[i][j][k] = g[i][j][k + 1], lst[i][j][k] = lst[i][j][k + 1];}}dfs( 1, n, 1 );printf( "%d\n", g[1][n][1] );for( int i = 1;i <= n;i ++ ) printf( "%d ", ans[i] );return 0;
}

[AGC028B] Removing Blocks

AGC028B

所有n!n!n!种删除方案的权值和

可以看成权值和的期望再乘以n!n!n!

每次删除一个位置,然后两边就断开分别搞(相互独立),类似笛卡尔树建树过程

把删除时间搞出来,删一个位置就是提ta当根,然后左右接在下面

则下标满足二叉树性质,删除时间又满足最小堆性质,这是一个标准的笛卡尔树

恰好一个位置的贡献次数就是其在笛卡尔树上的深度(树根深度为111

求出点的期望深度,再乘以其AiA_iAi,就是点的期望贡献,再所有点期望贡献求和就是权值和的期望(期望现性)

计算点的深度,等价于计算有多少点是该点的祖先

考虑两种情况

  • j<ij<ij<i

    • jjj要成为iii的祖先,就必须[j,i][j,i][j,i]区间内jjj是最小值

      不然笛卡尔树就会抽[j,i][j,i][j,i]中最小值kkk然后分成[j,k−1][k+1,i][j,k-1][k+1,i][j,k1][k+1,i]

    • 则又变成随机一个排列,[l,r][l,r][l,r]中最小值在lll处的概率

    • 随便选r−l+1r-l+1rl+1个数,Cnr−l+1C_{n}^{r-l+1}Cnrl+1

    • 然后剩下的数无所谓(n−(r−l+1))!\Big(n-(r-l+1)\Big)!(n(rl+1))!

    • lll处强制是r−l+1r-l+1rl+1个中最小值,那么剩下的r−lr-lrl个数顺序也无所谓(r−l)!(r-l)!(rl)!

    • 以上算的是所有排列的方案,最后除以n!n!n!就是概率了

    • Cnr−l+1(n−(r−l+1))!(r−l)!n!=n!(r−l+1)!(n−(r−l+1)!(n−(r−l+1))!(r−l)!n!=(r−l)!(r−l+1)!=1r−l+1\frac{C_n^{r-l+1}\Big(n-(r-l+1)\Big)!(r-l)!}{n!}=\frac{\frac{n!}{(r-l+1)!\Big(n-(r-l+1\Big)!}\Big(n-(r-l+1)\Big)!(r-l)!}{n!}=\frac{(r-l)!}{(r-l+1)!}=\frac{1}{r-l+1}n!Cnrl+1(n(rl+1))!(rl)!=n!(rl+1)!(n(rl+1)!n!(n(rl+1))!(rl)!=(rl+1)!(rl)!=rl+11

    • 也就是1i−j+1\frac{1}{i-j+1}ij+11

  • j>ij>ij>i 同理

    • jjj要成为iii的祖先,就必须[i,j][i,j][i,j]区间内jjj是最小值
    • 则又变成随机一个排列,[l,r][l,r][l,r]中最小值在rrr处的概率
    • 随便选r−l+1r-l+1rl+1个数,Cnr−l+1C_{n}^{r-l+1}Cnrl+1
    • 然后剩下的数无所谓(n−(r−l+1))!\Big(n-(r-l+1)\Big)!(n(rl+1))!
    • rrr处强制是r−l+1r-l+1rl+1个中最小值,那么剩下的r−lr-lrl个数顺序也无所谓(r−l)!(r-l)!(rl)!
    • 以上算的是所有排列的方案,最后除以n!n!n!就是概率了
    • Cnr−l+1(n−(r−l+1))!(r−l)!n!=n!(r−l+1)!(n−(r−l+1)!(n−(r−l+1))!(r−l)!n!=(r−l)!(r−l+1)!=1r−l+1\frac{C_n^{r-l+1}\Big(n-(r-l+1)\Big)!(r-l)!}{n!}=\frac{\frac{n!}{(r-l+1)!\Big(n-(r-l+1\Big)!}\Big(n-(r-l+1)\Big)!(r-l)!}{n!}=\frac{(r-l)!}{(r-l+1)!}=\frac{1}{r-l+1}n!Cnrl+1(n(rl+1))!(rl)!=n!(rl+1)!(n(rl+1)!n!(n(rl+1))!(rl)!=(rl+1)!(rl)!=rl+11
    • 也就是1j−i+1\frac{1}{j-i+1}ji+11

E(hi)=∑j=1i−11i−j+1+∑j=i+1n1j−i+1E(h_i)=\sum_{j=1}^{i-1}\frac{1}{i-j+1}+\sum_{j=i+1}^n\frac{1}{j-i+1}E(hi)=j=1i1ij+11+j=i+1nji+11

si=∑x=1i1xs_i=\sum_{x=1}^i\frac{1}{x}si=x=1ix1

E(hi)=si−12+sn−i+1−12=si+sn−i+1−1E(h_i)=s_i-\frac{1}{2}+s_{n-i+1}-\frac{1}{2}=s_i+s_{n-i+1}-1E(hi)=si21+sni+121=si+sni+11

ans=n!×∑i=1n(si+sn−i+1−1)⋅aians=n!\times \sum_{i=1}^n(s_i+s_{n-i+1}-1)·a_ians=n!×i=1n(si+sni+11)ai

#include <cstdio>
#define mod 1000000007
#define int long long
#define maxn 100005
int n;
int a[maxn], inv[maxn], s[maxn];signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &a[i] );inv[1] = 1;for( int i = 2;i <= n;i ++ )inv[i] = ( mod - mod / i * inv[mod % i] % mod ) % mod;for( int i = 1;i <= n;i ++ )s[i] = ( s[i - 1] + inv[i] ) % mod;int ans = 0;for( int i = 1;i <= n;i ++ )ans = ( ans + ( s[i] + s[n - i + 1] - 1 ) * a[i] % mod ) % mod;for( int i = 1;i <= n;i ++ ) ans = ans * i % mod;printf( "%lld\n", ( ans + mod ) % mod );return 0;
}

SPOJ PERIODNI

BZOJ2616

同样的直方图考虑笛卡尔树

以高度为权值,下标为键值,建立笛卡尔树

每个点表示区间内的最小值(最低高度)——实则代表了一个完整不缺的矩阵

则每个点的左右儿子肯定是相互独立的(中间有至少一列的空白)

dpi,j:idp_{i,j}:idpi,j:i子树内选了jjj辆车的方案数

则先卷一下点左右儿子一共选了xxx辆车的方案数,ti=∑j=0idplson,j∗dprson,i−jt_i=\sum_{j=0}^idp_{lson,j}*dp_{rson,i-j}ti=j=0idplson,jdprson,ij

在处理当前点表示的矩阵的转移,dpnow,i=∑j=0iti−j×j!×(Hj)×(W−(i−j)j)dp_{now,i}=\sum_{j=0}^it_{i-j}\times j!\times \binom{H}{j}\times \binom{W-(i-j)}{j}dpnow,i=j=0itij×j!×(jH)×(jW(ij))

  • 枚举nownownow点子树内安排了iii辆车
  • 枚举nownownow这一个矩阵内安排了jjj辆车,则左右儿子及其子树总共安排了i−ji-jij辆车
  • HHH表示nownownow点代表的矩阵的高度,WWW表示nownownow点代表的矩阵的宽度
  • jjj辆车所在行不能相等,相当于在HHH行中选jjj行的方案数,列同理
  • 保证了iii辆车的行不会冲突,还要解决列不会冲突
  • 左右儿子及其子树的列是与nownownow点矩阵的列联通的,所以真正可以选的列要减去儿孙使用的i−ji-jij

不用FFT\rm FFTFFT,直接卷就行

#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
#define mod 1000000007
#define int long long
#define maxn 505
#define maxm 1000005
int n, k, rt;
int h[maxn], fac[maxm], inv[maxm], lson[maxn], rson[maxn], t[maxn];
int dp[maxn][maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = 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 return fac[n] * inv[m] % mod * inv[n - m] % mod;
}void build() {stack < int > s;for( int i = 1;i <= n;i ++ ) {while( ! s.empty() and h[s.top()] > h[i] ) lson[i] = s.top(), s.pop();if( ! s.empty() ) rson[s.top()] = i;s.push( i );}while( ! s.empty() ) rt = s.top(), s.pop();
}int dfs( int now, int lst ) {int d = h[now] - lst, w = 1;if( lson[now] ) w += dfs( lson[now], h[now] );if( rson[now] ) w += dfs( rson[now], h[now] );memset( t, 0, sizeof( t ) );for( int i = 0;i <= w;i ++ )for( int j = 0;j <= i;j ++ )t[i] = ( t[i] + dp[lson[now]][j] * dp[rson[now]][i - j] ) % mod;for( int i = 0;i <= w;i ++ )for( int j = 0;j <= i;j ++ )dp[now][i] = ( dp[now][i] + t[i - j] * fac[j] % mod * C( d, j ) % mod * C( w - ( i - j ), j ) ) % mod;return w;
}signed main() {scanf( "%lld %lld", &n, &k );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &h[i] );init( maxm - 5 );build();dp[0][0] = 1;dfs( rt, 0 );printf( "%lld\n", dp[rt][k] );return 0;
}

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

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

相关文章

K - Triangle 计蒜客 - 42405

K - Triangle 计蒜客 - 42405 题意&#xff1a; 给你一个三角形的三点&#xff0c;再给你三角形边上一个点&#xff0c;让你求另一个点(也要在三角形上)&#xff0c;使得平分三角形的面积 题解: 计算几何 三角形的三边ab&#xff0c;ac&#xff0c;bc 如果点p在ab上&#x…

P2508-[HAOI2008]圆上的整点【数学】

正题 题目链接:https://www.luogu.com.cn/problem/P2508 题目大意 一个在(0,0)(0,0)(0,0)的圆心&#xff0c;半径为rrr&#xff0c;求圆有多少个整点。 1≤r≤21091\leq r\leq 2\times 10^91≤r≤2109 解题思路 设这个点为(x,y)(x,y)(x,y)&#xff0c;那么有x2y2r2x^2y^2r^2…

如何为ASP.NET Core设置客户端IP白名单验证

本篇博文中展示了如何在ASP.NET Core应用程序中设置IP白名单验证的3种方式。你可以使用一下3种方式&#xff1a;使用中间件检查每个请求的远程IP地址使用Action过滤器为指定的Controller或action方法添加针对远程IP地址的检查使用IPageFilter为Razor Pages应用添加针对远程IP地…

CodeForces - 140C New Year Snowmen

CodeForces - 140C New Year Snowmen 题意&#xff1a; 现在来做雪人&#xff0c;每个雪人由三个不同大小的雪球构成&#xff1a;一个大的&#xff0c;一个中等的&#xff0c;一个小的。现在有 n 个雪球半径分别为 r1, r2, …, rn. 为了做雪人&#xff0c;三个雪球的大小必须…

洛谷P4389:付公主的背包(多项式、生成函数)

对于一些生成函数累乘的题目&#xff0c;也许可以通过求 ln⁡\lnln 转化为累加问题从而完成简化。 解析 不难写出对于单个物品 kkk 的生成函数&#xff1a; ∑i1xVi11−xVK\sum_{i1}x^{Vi}\frac{1}{1-x^{V_K}}i1∑​xVi1−xVK​1​ 那么答案的生成函数就是所有物品的函数的卷积…

数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

因为非常板&#xff0c;所以主要是代码Tyvj 1728 普通平衡树Chef and Sets[HNOI2012]永无乡Play with Chain[NOI2005]维修数列题目很水&#xff0c;所以可能会出现代码部分细节出锅&#xff0c;但确实这些代码是能过得 还请多多包涵 Tyvj 1728 普通平衡树 luogu3369 #include…

让ASP.NET Core支持GraphQL之-GraphQL的实现原理

众所周知RESTful API是目前最流行的软件架构风格之一&#xff0c;它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。RESTful的优越性是毋庸置疑的&#xff0c;不过GraphQL也可以作为一种补充&am…

CodeForces 1514A Perfectly Imperfect Array

CodeForces 1514A Perfectly Imperfect Array 题意&#xff1a; 给你n个数&#xff0c;是否存在一个数不是平方数 题解&#xff1a; 先开方&#xff0c;转int&#xff0c;判断是否等于平方 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf(&quo…

另一个博客

在博客园搞了个博客&#xff0c;目前来说两边会同时更新的。 有些题目不放出来&#xff0c;都写在来博客园那边&#xff0c;虽然你们也不知道密码 链接:https://www.cnblogs.com/QuantAsk/

洛谷P4173:残缺的字符串(FFT、通配符匹配)

解析 通配符匹配的经典题。 设单词串为 AAA,文章串为 BBB。 把 AAA 翻转一下&#xff0c;判断问题就能转化为一个卷积的形式&#xff1a; F(p)&i0m−1match(Ai1,Bp−i)F(p)\&_{i0}^{m-1}match(A_{i1},B_{p-i})F(p)&i0m−1​match(Ai1​,Bp−i​) match(a,b)match(…

[2021-09-02 contest]CF1251C,可达性统计(bitset优化dp),Boomerang Tournament(状压dp),小蓝的好友(mrx)(treap平衡树)

文章目录CF1251C Minimize The Integeracwing164&#xff1a;可达性统计Facebook Hacker Cup 2016 Round 1 Boomerang Tournament[Zjoi2012]小蓝的好友(mrx)CF1251C Minimize The Integer ………………… 给你一个大整数aaa&#xff0c;它由nnn位数字&#xff0c;也可能有前导…

Entity Framework 的一些性能建议

点击上方蓝字关注“汪宇杰博客”这是一篇我在2012年写的老文章&#xff0c;至今适用&#xff08;没错&#xff0c;我说的就是适用于EF Core&#xff09;。因此使用微信重新推送&#xff0c;希望能帮到大家。自从我用了EF&#xff0c;每次都很关心是否有潜在的性能问题。所以每次…

AND 0, Sum Big CodeForces - 1514B

AND 0, Sum Big CodeForces - 1514B 题意&#xff1a; 构造一个含n个k位二进制数的序列&#xff0c;使得序列中所有数按位与的结果为0&#xff0c;且序列和最大&#xff0c;求构造方案数。 题解&#xff1a; 对于n个数的每一位&#xff0c;都至少有个0&#xff0c;这样可以…

CF438E:The Child and Binary Tree(生成函数)

解析&#xff1a; 设计 fif_ifi​ 表示权值为 iii 的方案数&#xff0c;f01f_01f0​1。 枚举根节点权值&#xff0c;可以写出转移&#xff1a; fn∑gk∑ififn−k−i∑ijknfifjgkf_n\sum g_k\sum_{i}f_if_{n-k-i}\sum_{ijkn}f_if_jg_kfn​∑gk​i∑​fi​fn−k−i​ijkn∑​fi​…

[2021-09-04 AtCoder Beginner Contest 217] 题解

文章目录A - Lexicographic OrderB - AtCoder QuizC - Inverse of PermutationD - Cutting WoodsE - Sorting QueriesF - Make PairG - Groups网址链接A - Lexicographic Order 签到题 #include <cstdio> #include <iostream> using namespace std; int main() {…

微软内部全面拥抱开源流程Inner Source

微软过去几年一直是 GitHub 平台上开源贡献者最多的公司。不仅如此&#xff0c;微软还将继续拥抱开源&#xff0c;内部有一项名为 Inner Source 的计划&#xff0c;将开源开发流程引入到公司内部。事实上&#xff0c;Inner Source 已经存在于微软内部多年&#xff0c;包括更多代…

洛谷P5110:块速递推(特征根方程、光速幂)

解析 去你的搬砖生成函数&#xff0c;特征根太香了。 一开始我是用生成函数解的&#xff0c;和特征根相比有亿点点搬砖… 但是这个东西原理似乎使用一些神奇的等比差分&#xff0c;有些玄学&#xff0c;生成函数较易理解。 背下来背下来&#xff01; 就以本题为情境讲一下特征…

Product 1 Modulo N CodeForces - 1514C

Product 1 Modulo N CodeForces - 1514C 题意&#xff1a; 在[1,n-1]中选x个数&#xff0c;使得乘积mod n 1&#xff0c;求x的最大值&#xff0c;并输出所选的数 题解&#xff1a; 我们设S为所选x个数的乘积 S%n 1说明gcd(S,n)1,即所选的x个数均与n互质&#xff0c;如果不…

k8s使用helm打包chart并上传到腾讯云TencentHub

本文只涉及Helm的Chart操作&#xff0c;不会对其他知识进行过多描述。至于安装这块&#xff0c;麻烦自行百度吧&#xff0c;一大堆呢。在容器化的时代&#xff0c;我们很多应用都可以部署在docker&#xff0c;很方便&#xff0c;而再进一步&#xff0c;我们还有工具可以对docke…

数据结构之基环树——骑士,Island,旅行加强版,Number of Simple Paths,Traffic Network in Numazu,Card Game

文章目录[ZJOI2008]骑士[IOI2008] Island[NOIP2018 提高组] 旅行 加强版CF1454E Number of Simple PathsTraffic Network in NumazuCard Game基环树的常见解法若干个基环树互相独立断环为链&#xff08;随便断一条&#xff09;环外树和环外树之间的树形DP环变链后整体可以用数据…