首页 > TAG信息列表 > TJOI2015

TJOI2015 概率论

首先很容易得到\(n\)个点的二叉树个数为\(Catalan(n)\)也就是卡特兰数,设为\(f(n)\)。 它的生成函数\(F\)为\(\sum_{i\geq 0} f(i)x^i\)。 根据递推式\(f(i)=\sum_{j=0}^{i-1} f(j)f(i-1-j)\)。 得到生成函数的方程: \[F=F^2x+1\\ F^2x-F+1=0 \]得到两根: \[F_1=\frac{1+\sqrt{1-4x}

[TJOI2015] 概率论

[TJOI2015] 概率论 我们设 \(f[n]\) 表示有 \(n\) 个节点的不同形态的二叉树的数量, \(g[n]\) 表示有 \(n\) 个节点的不同形态的二叉树的叶子节点的总和. 显然, \(f\) 是卡特兰数. 接下来让我们看一个结论: \(g[i] = f[i - 1] * n\) 为什么呢? 考虑一个有 \(n\) 个节点 \(k\)

【题解】[TJOI2015]弦论

[TJOI2015]弦论 感觉啥都不会就来补自己的弱项了…… \(\text{Solution:}\) 第 \(k\) 小的子串,这东西长得很平衡树。 回忆一下,我们在平衡树上找第 \(k\) 大的做法:记录左右孩子的 \(siz,\) 与 \(k\) 比较大小,不断二分。 那么,同样地,在这题里面,考虑如何类似地在 SAM 上面做这件事情。

P3977 [TJOI2015]棋盘

题目 P3977 [TJOI2015]棋盘 分析 以为是个神题,其实是出题人题目描述有毒。 状态压缩+矩阵乘法优化dp。 每一个棋子是处在中间一行的。。 于是就很容易了,直接状态压缩,然后矩阵乘法维护转移即可。 代码 #include <bits/stdc++.h> using namespace std; template <typename T> inli

[TJOI2015]组合数学

[TJOI2015]组合数学 洛谷题目链接 这道题的码量不大,代码没什么难度,但是思维难度会比较大。 注意,有T组数据,每次都需要初始化,并且需要开long long 解释 我们有一个神奇的定理叫做Dilworth定理。 即:最长反链=最小链覆盖=最大独立集。 这道题其实就是求最小链覆盖。 最小链覆盖:用最

P3973 [TJOI2015]线性代数

题意描述: 洛谷 给你一个 \(n\times n\) 的矩阵 \(B\) 和一个 \(1\times n\) 的矩阵 \(C\) , 让你求一个 \(1\times n\) 的 \(01\) 矩阵 \(A\), 使得: \(D = (A\times B - C)\times A^T\) 的值最大,输出这个最大值。 注: \(A^T\) 即 \(A\) 的转置,也就是将 \(A\) 的行和列交换后得到的矩

P3973 [TJOI2015]线性代数 最小割

题意: 戳这里 分析: \[D=\sum_{j=1}^nA_{1,j}\times (\sum_{i=1}^nA_{1,i}B_{i,j}-C_{1,j}) \]我们观察式子可以发现 \(B_{i,j}\) 会被选当且仅当 \(A_{1,i},A_{1,j}\) 都为 1,\(-C_{1,j}\) 会被选当且仅当 \(A_{1,j}\) 为 1 也就是说 \(B_{i,j}\) 和 \(-C_{1,i},-C_{1,j}\) 必须同时

[TJOI2015] 概率论 - 组合数学

Description 求 \(n \le 10^9\) 个节点的二叉树的叶子节点数期望。 Solution 设 \(f_i\) 表示 \(i\) 阶二叉树本质不同个数,\(g_i\) 表示所有本质不同 \(i\) 阶二叉树的树叶个数的和,则有 \[f_i = \sum_{j=0}^{i-1} f_jf_{i-j-1}, \quad g_i=2\sum_{j=0}^{i-1} f_j g_{i-j-1} \]显然

[TJOI2015]弦论

题目         点这里看题目。 分析         补习知识:         既然可以求出原串中不同的子串的个数,那么我们同样可以求出含重复子串的个数,同样是\(dp\):         \(g(u)\):从\(u\)节点出发含重复的子串的数量。         转移: \[g(u)=|end-p

Luogu P3978 [TJOI2015]概率论

Link 设\(f_n\)表示\(n\)个点的不同构的二叉树个数,\(g_n\)表示\(n\)个点的不同构的二叉树的叶节点数之和。 可以得到\(g_n=nf_{n-1}\)。 证:每棵\(n-1\)个点的二叉树有\(n\)个位置可以挂上一个叶节点进而得到\(n\)个点的二叉树。 我们知道\(f_n=C_n=\frac{2n\choose n}{n+1}\),

[TJOI2015]弦论

一、题目 点此看题 二、解法 考虑后缀自动机,我们先把图建出来,然后算两个东西,第一个是每个节点所代表的串的出现次数valvalval,第二个是经过该点向所有chchch方向走得到的valvalval和,我们可以把所有节点按长度桶排,因为总是长度大的连向长度小的,扫一遍即可处理出这两个值,当t=0t

[TJOI2015]弦论 - 后缀自动机

下了狠心开始做SAM的题目了…… (中间因为傻逼26分写错被卡,进来的时候记得把自己的 cnt 减掉) // TJOI2015 XIAN LUN #include <bits/stdc++.h> using namespace std; const int Maxn = 2000005; struct Suffix_Automata { int maxlen[Maxn], trans[Maxn][26], link[Maxn], Siz

[洛谷P3974] TJOI2015 组合数学

问题描述 为了提高智商,ZJY开始学习组合数学。某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝。每次从左上角出发,只能往右或下走。问至少要走几次才可能把财宝全捡完。 但是她还不知足,想到了这个问题的一个变形:假设每个格子中有好多块财宝,而每一次经过一个格子至

P3975 [TJOI2015]弦论

题目描述 为了提高智商,ZJY开始学习弦论。这一天,她在《 String theory》中看到了这样一道问题:对于一个给定的长度为n的字符串,求出它的第k小子串是什么。你能帮帮她吗? 输入格式 第一行是一个仅由小写英文字母构成的字符串s 第二行为两个整数t和k,t为0则表示不同位置的相同子串

P3975 [TJOI2015]弦论

题意 第一问有一个经典做法:学习笔记 对于第二问,其实就是对于一个状态的所有串,第一问看成一个,第二问看成多个。 code: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=5*1e5+10; int n,type,m,tot,last,cnt; int head[maxn<<1],in[maxn<<1],s

P3975 [TJOI2015]弦论

P3975 [TJOI2015]弦论 在原串所有子串中求字典序第k大的子串 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e6+5; 4 char s[maxn]; 5 int a[maxn], c[maxn], size[maxn], sum[maxn], k, t; 6 struct SuffixAutoMaton { 7 int last, cnt; 8 i

[BZOJ3997][TJOI2015]组合数学

传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3997 Sol 根据dilworth定理偏序集的最小链划分=最长反链对于这题来说,把图建出来可以发现图是一个DAG 题目等价于求最小路径覆盖如果直接用网络流求的话T飞……发现是个偏序问题,所以DAG上的最小路径覆盖=最长反链即现在要

【BZOJ4001】【Luogu P3978】 [TJOI2015]概率论

题目描述: Description: Input 输入一个正整数N,代表有根树的结点数 Output 输出这棵树期望的叶子节点数。要求误差小于1e-9 Sample Input 1 Sample Output 1.000000000 HINT 1<=N<=10^9 洛谷链接 BZOJ链接 思路: 一眼数学期望(毕竟题目里都已经说了),那期望是什么呢??? 在概率论和统计学

【BZOJ4000】[TJOI2015]棋盘(矩阵快速幂,动态规划)

【BZOJ4000】[TJOI2015]棋盘(矩阵快速幂,动态规划) 题面 BZOJ 洛谷 题解 发现所有的东西都是从\(0\)开始编号的,所以状压只需要压一行就行了。 然后就可以随意矩乘了。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define uint unsigned int inline

【BZOJ3996】[TJOI2015]线性代数(最小割)

【BZOJ3996】[TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j}A_iA_j-\sum_{i=1}^n A_iC_i\] 发现\(A\)是\(01\)矩阵,再结合数据范围一脸一个最大权闭合子图的形式。 然后这里有两种做法, 第一种是无脑版本

bzoj 3998: [TJOI2015]弦论【SA+二分||SAM】

SA的话t==0直接预处理出每个后缀的不同串贡献二分即可,然后t==1就按字典序枚举后缀,然后跳右端点计算和当前后缀的前缀相同的子串个数,直到第k个 不过bzoj上会T #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=10000005; int n,o,sa[N],rk[

P3974 [TJOI2015]组合数学

题目描述 为了提高智商,ZJY开始学习组合数学。某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝。每次从左上角出发,只能往右或下走。问至少要走几次才可能把财宝全捡完。 但是她还不知足,想到了这个问题的一个变形:假设每个格子中有好多块财宝,而每一次经过一个格子至

「TJOI2015」旅游 解题报告

「TJOI2015」旅游 LCT沙比题 考虑我们其实是在维护一条链的\(\max\limits_{i<j} v_j-v_i\) 每次直接拿左右子树更新一下就可以了 写的时候把两个方向都维护一下,方便翻转 Code: #include <cstdio> #include <cctype> #include <algorithm> template <class T> void read(T &x) {

「TJOI2015」组合数学 解题报告

「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行第\(i\)列可以流给下面那个格子的次数,然后如果当前这个格子不够用,从右往左把所有的还有次数的\(re

「TJOI2015」线性代数 解题报告

「TJOI2015」线性代数 和牛客某题很像 在和里面有\(B_{i,j}\)要求是\(A_i,A_j\)都为\(1\),和里面减去\(C_i\)要求\(A_i\)为\(1\),然后先把贡献也就是\(B_{i,j}\)加上,然后建图跑最小割,建图方法和牛客那题一样 另外1e6条边为什么也可以跑过去啊,还很快.. Code: #include <cstdio> #incl