题意: 给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列.注意不是字典序大. 题解: 首先特判s比t短或一样长的情况. 当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列数量. 然后再去看s的和t一样长的子序列. 就是在找s和t的公共子序列,并且一旦某一位s比t大了,就不找了,直接用组合数求此种情况下后面的组合方式,一旦某一位s比t小了,也不找了,直接返回0. 组合数要预处理. #include<iostream> #include<cstring>…
subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩下了位数相同的情况,如何实现呢,我们考虑定义状态dp[i][j][0/1]分别表示s串前i个字符中长度为j的串前面的字符等于t串相应长度的前缀的数量,1则表示大于的数量 ,然后分三种情况转移即可. #include<bits/stdc++.h> #define ll long long using…
比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数优先级高,如果高位满足条件,那么低位只要用组合数求一下就行 #include<bits/stdc++.h> using namespace std; #define maxn 3005 #define ll long long #define mod 998244353 int n,m; char…
subsequence 1 只要处理长度等于t的. 转移方程没想出来QAQ $dp(i,j,0)$代表到$s[i]$为止有多少个前缀序列与$t[0\cdots j]$相同 所以有$dp(i,j,0)=dp(i-1,j,0)+s[i]==t[j]?dp(i-1,j-1,0):0;$ $dp(i,j,1)$代表到$s[i]$为止有多少个子序列大于$t[0\cdots j]$ 故有$dp(i,j,1)=dp(i-1,j,1)+(s[i]>t[j])*dp(i,j-1,0)+(j>0)*dp(i-1,…
H - subsequence 2 题意 要你使用前\(m\)个小写字母构造一个长度为\(n\)的字符串 有\(m*(m-1)/2\)个限制条件: \(c_{1} .c_{2}. len\):表示除去其他非\(c_{1}.c_{2}\)之外的字母剩下的串长度为\(len\) \(s\):除去其他非\(c_{1}.c_{2}\)之外的字母剩下的字符串,长度为\(len\) 需要我们根据这个限制条件构造出原串,如果不存在输出\(-1\) 思路 我们可以发现题目给了两个字母之间的相对位置.比如\(aa…
题意: 给你长度最长为1000的字符串,这个字符串中最多有10种字母,每次给你两种字母,输出这两种字母在字符串中的相对位置,问你这个字符串原本是什么样子,如果不存在则输出-1 题解: 把整个字符串看作集合,每一个字符看作一个集合中的元素,字符串的前后关系看作偏序关系,作出这个集合的哈斯图,在哈斯图上拓扑排序.如果在拓扑到某点时发现没有入度为0的点了,那就输出-1: #include<bits/stdc++.h> using namespace std; ]; ],st[]; ][],ans[]…
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最大值的位置,每次分治找就找这个最大值,然后看最大值在哪个序列是可行的 怎么看最大值所在的序列是否可行呢? 我们用一个前缀和维护区间和 \[ max<=\frac{1}{2}(sum[r]-sum[l])\\ 2*max-(sum[r]-sum[l])<=0\\ \] 这个最大值在这一段区间内都有可…
链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value that appears most often. Chiaki has n integers a1,a2,...,an. She woud like to delete exactly m of them such that: the rest integers have only one mode an…
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] probability to have an diamond of d[i] size. At the beginning , Kanade has a diamond of 0 size. She will open the boxes from 1-st to n-th. When she op…
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 There are n students going to travel. And hotel has two types room:double room and triple room. The price of a double…
链接:https://www.nowcoder.com/acm/contest/143/D来源:牛客网 题目描述 Kanade has an even number n and a permutation b of all of the even numbers in [1,n] Let a denote an array [1,3,5....n-1] , now you need to find a permutation of [1,n] satisfy both a and b are s…
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] probability to have an diamond of d[i] size. At the beginning , Kanade has a diamond of 0 size. She will open the boxes from 1-st to n-th. When she open a…
链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormitories ( Four students per dormitory). Students numbered from 1 to 4n. And in the first year, the i-th dormitory 's students are (x1[i],x2[i],x3[i],x4[…
题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿舍的人数). 最后跑一边费用流. #include <bits/stdc++.h> using namespace std; typedef long long ll; ; const int INF = 0x3f3f3f3f; int n, k; ], y[]; ][]; typedef pai…
理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称“ $d$ 是模 $p$ 的二次剩余” 当对任意 $X$,$X^2 \equiv d(mod \ p)$ 都不成立时,称“ $d$ 是模 $p$ 的二次非剩余” 矩阵的相似对角化 相似矩阵:对于矩阵 $A$ 和 $B$,若存在可逆矩阵 $P$,使得 $P^{-1}AP=B$,则称 $A$ 相似于 $…
题目链接:https://ac.nowcoder.com/acm/contest/884/G 题目大意:给定一个树\(A\),再给出\(t\)次询问,问\(A\)中有多少连通子图与树\(B_i\)同构.\(|A|\leq 2000,t\leq 10000, |B_i|\leq 12\) 题解:本题实际上是Codeforces 762F的加强版,关于这题的题解请戳这里 本题做法与之前这道题类似,也是预处理出树的最小表示法后进行树形DP,但是由于这里有多达一万次询问,所以考虑预处理枚举所有点数不超过…
题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有石堆的石子数均为\(0\)时获胜.问有多少个区间\([l,r]\)可以保证获胜(若区间内石子数总和为奇数则会选一堆石子数最小的石堆取走一个石头). 题解:显然,对其中的一个区间,如果区间内的最大值\(mx\)不超过其总和\(sum\)的一半,则能保证获胜.于是可以考虑每一个\(a_i\)作为最大值的…
题意:给你n个数,现在让你选择一个数目最大的集合,使得集合中任意两个数的二进制表示至少有两位不同,问这个集合最大是多大?并且输出具体方案.保证n个数互不相同. 思路:容易发现,如果两个数不能同时在集合中,这两个数的二进制表示一定只有一位不同(因为n个数互不相同,所以一定不会有两个数的二进制位一定相同).那么我们不妨把每个数和它只有一位不同的数连一条边,那么原问题就变成了在一张图上找最多的点,使得任意两点间都没有变直接相连,而这个问题就是最大独立集问题.而且,由于n个数互不相同,所以这张图一定没有…
https://www.nowcoder.com/acm/contest/143/I vc-dimension 题解:分三种情况,组合数学算一下,其中一种要用树状数组维护 技巧(来自UESTC):1.循环技巧i主j滑 2.树状数组:一个数列从左到右分别维护某个元素左边比它大num的与右边比他大的num时,从上往下扫, 对每个点的x坐标离散化累加1到X轴上,然后就会发现sum(p[i].x-1)就是左边比它大的,i-1-sum(p[i])就是右边比它大的. 注意y相同的点,需要一起更新(我已开始一…
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最大流,也就是最小割.那么割完之后会是2个连通块,且连通块内部是完全图. 因为是最小割,所以被割掉的边权和最小.即两个连通块内部的边权和最大.那么就会有一个连通块是孤立点,取s和t中到其余所有点距离小的作为孤立点. 问题变成了求每个点到其他所有点的距离. dfs第一次求每个点到他所有儿子节点的距离,d…
题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以每个数为首的递增子序列个数.若总的个数之和小于k则输出-1. 总的个数可能非常大而k<=1e18.所以要判下上界. 最后从1~n扫一遍.当前数大于上一个加入答案的数时,若以它为首的递增子序列个数小于k,则用k减去那个个数,否则将这个数加入答案并将k-1(即减去后面不再加数的情况). k = 0时跳出循环…
目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque> #include <queue> #include <stack> #include <cmath> #include <ctime> #include <bitset> #include <cstdio> #include &l…
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时有\(n\)堆石子,每堆石子的石子个数为\(a_i\),然后进行游戏. 游戏规则为你可以选择任意两堆石子,然后从这两堆中移除一个石子,最后石子个数变为\(0\)则获胜否则失败.由于总石子个数可能为奇数,此时不可能获胜,因此加了个规则为如果石子个数为奇数,那么可以事先移除一个石子. 问你有多少个区间能让玩游戏的人获胜. 思路 经过模型转换后题意变为有多少个区间,区间内石子个数之和大于等于石子最大数的两倍. 启发式分治,大体处理方法和这…
题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内外层循环都是 $\sqrt p$,题目查询 $m$ 次,$m \leq 1000$,$ p \leq 10^9$,这样总时间复杂度为 $O(m \sqrt p)$,勉强能接受.据说使用读入优化和手写哈希还是能过得,可见Cls的代码%%% 仔细想一下,由于BSGS分成两步,其中第一步是建立 $a$ 的…
思路: 十进制快速幂. #include <stdio.h>//sprintf #include <cstdlib>////malloc exit strcat itoa system("cls") #include <iostream>//pair #include <fstream> #include <bitset> //#include <map> https://ac.nowcoder.com/acm/c…
G-subsequence 1 题意 给你两个字符串\(s.t\),问\(s\)中有多少个子序列能大于\(t\). 思路 令\(len1\)为\(s\)的子序列的长度,\(lent\)为\(t\)的长度 \(len1 > lent\):枚举每一位,如果当前为不为\(0\)那么它后面的位置可以随意取,\(num = num + \binom{k}{len-1}.k\)是当前位到\(s\)的末尾剩下的位数 \(len1 = lent\):暴力\(n^3\)肯定超时,所以要用\(dp\)优化 \(dp…
B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看到这种题就会想到矩阵快速幂,但是这次的\(n\)太大了,所以要用十进制倍增来算,但是单单用十进制倍增来算应该还会\(TLE\),然后就要用二进制倍增来优化了. 我们要先求出矩阵快速幂的通项式 \[ \begin{pmatrix}x_{n+1} \\x_{n}\end{pmatrix}= \begin…
问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍历长度较短的一边,枚举它为一个端点,另一边二分算贡献即可. 复杂度大概\(nlog(n)^2\) #pragma comment(linker, "/STACK:102400000,102400000") #include<bits/stdc++.h> #define fi f…
generator 1 题目传送门 解题思路 矩阵快速幂.只是平时的矩阵快速幂是二进制的,这题要用十进制的快速幂. 代码如下 #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; inline int read(){ int res = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = g…
题意: 对于一个序列,把可以把连着三个相同的字母拿走,问最多拿走多少组. 题解: 直接模拟栈,三个栈顶元素相同则答案+1,并弹出栈 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, LL>P; ; ; const LL lINF = 0x3f3f3f3f3f3f3f3f; #define ls (rt<<1) #define rs (rt<<…