[10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件结束终止. 每一个测试用例的第一行包含整数n,m和k. 第二行包含n个整数,即s1,s2,-,sn. 输出 对于每一个测试用例,输出一个表示结果的整数. 样例输入 3 2 2 1 2 1 4 2 2 1 2 1 2 样例输出 2 4 提示 \(1 ≤ n ≤ 10^5:1 ≤ m ≤ min{n -…
给出1-n的序列插入一个bst: 给出T组询问,包含n,h分别代表点数为n,高度为h的树,求所有插入顺序的合法方案数,模1e9+7 样例输入 1 2  1 样例输出 2 #include<bits/stdc++.h> #define LL long long #define rep(i,x,y) for(register int i=x;i<=y;i++) using namespace std; inline int read(){ ,f=;char ch=getchar(); ;ch…
题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老皮也会尽量满足他的要求,帮他买一些新玩具. 一开始小皮有一个长度为\(N\)的玩具序列 , 小皮的玩具可以用\(a,b,c,...,z26\)个英文字母表示,小皮可能会有\(q\)种需求,每种需求可以用一个二元组\((x,y)\)表示代表在此时最喜欢\(x\)这种玩具,他希望老皮帮他买回\(y\)个…
没有原题... 囧.. [问题描述] 游戏规则是这样,有n(1<=n<=100)行格子,第一行由n个格子,第二行有n-1个格子,第三行由n-2个格子,……以此类推,第n行有1个格子.要求再这些格子上摆放棋子.摆放的时候要注意,每一个格子只能放一个棋子.同一行的格子摆放必须遵守从左至右的顺序,在一行内从左至右摆放时不能跳过某个格子来摆放.每一行放的棋子数不能超过上一行的棋子数. 输入文件(diagrams.in):仅1行,一个正整数n. 输出文件(diagrams.out):仅1行,方案总数.…
$code$ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ], l = , r = , ans = ; ][], P[], Q[]; bool check(int L) { memset(dp, , sizeof(dp)); memset(P, , sizeof(P)); memset(Q, , sizeof(Q)); ; i <= n; i++) f…
题目来源:by lzz \(Description\) 给定一张有向图,求对于哪些点,删除它和它的所有连边后,图没有环. \(n\leq 5\times10^5,m\leq 10^6\). \(Solution\) 题目等价于求所有环的交集. 首先两个特判:如果原图没有环,输出所有点:如果删掉原图的某个环后,仍存在环,输出\(0\).这也是不少分了. 先求出图中的某个环,环交当然在这个环上.我们只需要处理这个环. 把环拆成链,发现所有除它外的环只有两种情况: 对于第一种情况, 如果做过这个链的S…
$des$ $sol$ 维护每个点的子树中的信息以及非子树的信息 $code$ #include <bits/stdc++.h> using namespace std; #define gc getchar() inline int read() { ; char c = gc; ') c = gc; + c - ', c = gc; return x; } #define Rep(i, a, b) for(int i = a; i <= b; i ++) ; ], g[N][]; i…
还是可以想出来的题目 不过考场上没有想出来 要 引以为戒. 初看觉得有点不可做 10分给到了爆搜. 考虑第一个特殊情况 B排列为1~m. 容易发现A排列中前m个数字 他们之间不能产生交换 且 第k个数字要交换到后面的m+1~n这些数字的时候 k~m的数字都要进行交换才行. 那么直接枚举有多少个数字到后面了 组合数可以解决 考虑剩下的那些空位怎么办. 其实就是要求出 \(f_i\) 其表示满足题目条件的i个数的排列的个数. 考虑递推 容易发现\(f_0=1,f_1=1\) 对于\(f_i\)考虑第…
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOIP模拟赛)/拆地毯 题解:按最大生成树顺序加k条边即可 代码: +; ..maxn] of int64; fa,a,b:..maxn] of longint; i,j,n,m,k:longint; ans:int64; function find(x:longint):longint; begin…
线段树上\(DP\) 首先发现,每个数肯定是向自己的前驱或后继连边的. 则我们开一棵权值线段树,其中每一个节点记录一个\(f_{0/1,0/1}\),表示在这个区间左.右端点是否连过边的情况下,使这个区间符合条件的最小代价. 合并时考虑如果左儿子的右端点或右儿子的左端点中有一个没有连过边,就必须连边,否则就不连边. 然后我的写法比较蠢,不知道为什么当左右儿子中某个节点只有一个数时需要特判处理. 最后答案就是根节点的\(f_{1,1}\). 具体详见代码. 代码 #include<bits/std…