09 2020 档案
摘要:题意:有一组数,分别用长度从$[1,n]\(的区间去取子数组,要求取到的所有子数组中必须有共同的数,如果满足条件数组共同的数中最小的数,否则输出\)-1$. 题解:我们先从后面确定每两个相同数之间的距离,然后维护每个$i$位置上的数到后面所有相同数的最大距离,然后我们就可以dp来搞了,我从$1$开始
阅读全文
摘要:题意:给你一组数$a$和一个数$T$,将这组数分为两组$c$和$d$,定义$f(x)$为数组$x$中任意两个不同元素的和为$T$的个数,问为了使$min(f(c)+f(d))$,应该怎样对$a$分组. 题解:我们可以分成三种情况,假如一组数中所有元素都$< \frac{2}\(,或者\)>\frac
阅读全文
摘要:题意:给你$n$个区间,从这$n$区间中选$k$个区间出来,要求这$k$个区间都要相交.问共有多少种情况. 题解:如果$k$个区间都要相交,最左边的区间和最右边的区间必须要相交,即$min(r[1],...,r[k])>=max(l[1],...,l[k])$.我们先按左边界对所有区间进行排序,然后
阅读全文
摘要:题意:给你一组数$a$,构造一个它的子序列$b$,然后再求$b_1-b2+b3-b4...$,问构造后的结果最大是多少. 题解:线性DP.我们用$dp1[i]$来表示在$i$位置,并且此时子序列的长度是奇数的情况,而$dp2$则是偶数情况,对于每个$a_i$,$dp[i]$都可以选它或者不选,拿$d
阅读全文
摘要:题意:给你一组数,求有多少对$(i,j)$,使得$a_$&$a_\ge a_\ xor\ a_$. 题解:对于任意两个数的二进制来说,他们的最高位要么相同要么不相同,如果相同,那么肯定是满足题目条件的,因为异或是不进位的加法,所以我们只要找到所有最高位相同的数的个数,用桶存下来,然后再对他们求个和就
阅读全文
摘要:题意:有一长度为$n$的一组数,每次可以交换两个数的位置,问能否在$\frac{n*(n-1)}{2}-1$次操作内使得数组非递减. 题解:不难发现,只有当整个数组严格递减的时候,操作次数是$\frac{n*(n-1)}{2}$,所以我们可以直接遍历判断有无$a[i]<=a[i+1]$即可. 代码:
阅读全文
摘要:题意:有$n$个点,$n-1$条边,每个点的类型是$0$或$1$,现在让你选一个点,然后所有与该点类型不同的点直接消失,问选哪些点之后,该点所在的联通块最大. 题解: 因为选完之后两个类型不同的点之间的边会消失,所以我们可以直接维护一个并查集,每个集合中存的是相同类型的点的连通数量,维护最大值即可.
阅读全文
摘要:题意:给你两个正整数$x$和$y$,求两个正整数$a$,\(b\),使得$a+b=x$,$a$&$b$=\(y\),如果$a$,\(b\),输出$a\ xor \ b$,否则输出$-1$. 题解:根据位运算的基本性质,我们知道$a\ xor \ b$可以表示不进位的加法,而($a$&$b$)<<1可
阅读全文
摘要:题意:一个台阶由一些单元格组成,如果一个高度为$n$的台阶中有$n$个不相邻的正方形(如图中的样例),就称这个台阶是"好台阶",现给你$x$个单元格,问最多能组成多少个"好台阶"? 题解:题目数据范围最多给了$10^{18}$,而样例中的$10^{18}$最多有$30$个好台阶,而前几个"好台阶"的
阅读全文
摘要:Link Cut Centroids Fishing Prince loves trees, and he especially loves trees with only one centroid. The tree is a connected graph without cycles. A v
阅读全文
摘要:题意:有一长度为$n$的序列,求其中任意五个元素乘积的最大值. 题解:先排序,然后乘积能是正数就搞正数,模拟一下就好了. 代码: int t; ll n; ll a[N]; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
阅读全文
摘要:题意:给你一长度为$n$的序列,将其分为两个集合,求两个集合中未出现的最小元素的最大值, 题解:用桶存一下每个元素的个数,两次枚举$[1,100]$,找出两个最小值即可. 代码: int t; int n; int a[N]; map<int,int> mp; int main() { ios::s
阅读全文
摘要:题意:$f(x,m)$表示$x\ mod\ m$,\(A_{1}=1\),而$A_{n+1}=f(A^{2},M)\(,求\)\sum^A_$. 题解:多算几个,会有一个循环节,直接模拟就好了. 代码: ll n,x,m; ll mp[N]; vector<ll> a; int main() { /
阅读全文
摘要:题意:给你一个数字$n$和$k$个区间,$S$表示所有区间的并的集合,你目前在$1$,每次可以从集合中选择一个数字向右移动,问有多少种方法从$1$走到$n$. 题解:我们从1开始遍历,$dp[i]$表示走到目前走到$i$的方案数,再去遍历每一个集合,用$dp[i]\(更新所有\)[i+l[j],i+
阅读全文
摘要:题意:你和基友两人从左往右轮流打怪兽,强怪用$1$表示,垃圾用$0$表示,但基友比较弱,打不过强怪,碰到强怪需要用一次魔法,而你很强,无论什么怪都能乱杀,基友先打,每人每次至少杀一个怪兽,最多杀两个怪兽,问最少需要用多少次魔法能将怪兽全部打完. 题解:由于在打怪的过程中,每个状态都与之前息息相关,所
阅读全文
摘要:题意:给你一串长度为$n$的序列,有的位置被锁上了,你可以对没锁的位置上的元素任意排序,使得最后一个$\le0$的前缀和的位置最小,求重新排序后的序列. 题解:贪心,将所有能动的位置从大到小排个序就行了. 代码: struct misaka{ int a; int loc; }e[N]; int t
阅读全文
摘要:题意:刚开始你有一个木棍,造一个火炬需要一个木根和一个煤块,现在你可以用一个木棍换取$x$个木棍,或者$y$根木棍换一个煤块,消耗一次操作,问最少需要操作多少次才能造出$k$把火炬. 题解:初始你有一个木棍,造出$k$把火炬需要$k$个木棍和$k$个煤块,而一个煤块需要$y$个木棍,所以需要木棍$k
阅读全文
摘要:题意:有一个长度为$n$的序列,可以操作$3$次,每次选取一段区间,然后区间的元素加减区间长度的倍数,$3$次操作后使得序列所有元素为$0$,问具体操作情况. 题解:假如我们能选择一整段区间$[1,n]$,使其所有元素都是$n$的倍数就好了,但是有的元素不是$n$的倍数,所以不能这样搞,但是我们可以
阅读全文
摘要:题意:有一个长度为$n$的序列,你每次可以对序列重新排序,然后花费$1$使某个元素加减$1$,多次操作后使得新序列满足$a_=c^i$,$c$是某个正整数,求最小花费. 题解:先排序,我们可以直接枚举$c$,然后模拟维护一个最小值就好了. 代码: int n; int a[N]; int main(
阅读全文
摘要:题意:有一个长度为$n$的隐藏序列,你最多可以询问$2n$次,每次可以询问$i$和$j$位置上$p[i]\ mod\ p[j]\(的结果,询问的格式是\)?\ x\ y$,如果已经确定序列了,先输出$!$,然后输出序列. 题解:首先要知道一个结论,\(p[i]\ mod \ p[j]=cnt1\),
阅读全文
摘要:题意:有一个长度为$n$的序列,你需要对其重新排序,构造一个新数组$c$,$c_=gcd(a_{1},...,a)$并且使得$c$的字典序最小. 题解:直接跑$n$次,每次找一个目前最大的$gcd$出来,并标记位置模拟一下就好了. 代码: int t; int n; int a[N],b[N]; i
阅读全文
摘要:题意:有一个长度为偶数只含$0$和$1$的序列,你可以移除最多$\frac{2}$个位置的元素,使得操作后奇数位置的元素和等于偶数位置的元素和,求新序列. 题解:统计$0$和$1$的个数,如果$0$的个数大于$\frac{2}$,那么直接输出$n/2$个$0$,否则输出所有$1$(个数必须为偶).
阅读全文
摘要:题意:给你一个由$0,1,?\(组成的字符串,你可以将\)?$任意改成$0$或$1$,问你操作后能否使得该字符串的任意长度为$k$的区间中的$0$和$1的个数相等. 题解:我们首先看前$k$个字符,那么对于区间$[2,k+1]$,如果要满足条件,$s_{k+1}=s_{1}$一定要成立,由此我们可以
阅读全文
摘要:题意:有一个长度为$n$并且所有元素和为$0$的序列,你可以使$a_-1$并且$a_+1$,如果$i<j$,那么这步操作就是免费的,否则需要花费一次操作,问最少操作多少次使得所有元素为$0$. 题解:首先优先考虑不用花费的情况,如果$a_>0$,\(a_{j}<0\),且$i<j$,那么我们可以免费
阅读全文
摘要:题意:有$n$枚硬币,每枚硬币抛完后向上的概率为$p[i]$,现在求抛完后向上的硬币个数大于向下的概率. 题解:我们用二维的$dp[i][j]$来表示状态,$i$表示当前抛的是第$i$个硬币,$j$表示的是前$i$个硬币中向上的个数,那么状态可以表示为,如果$j=0$,那么$dp[i][j]=dp[
阅读全文
摘要:题意:给你一个正整数$n$,每次可以对$n$加一,问最少操作多少次是的$n$的所有位数之和不大于$s$. 题解:$n$的某个位置上的数进位,意味这后面的位置都可以被更新为$0$,所以我们从高位往低位记录一个$sum$,然后根据情况判断即可. 代码: int t; int s; ll n; char
阅读全文
摘要:题意:给你两个数字$x$和$y$,让你构造一个长度为$n$的序列,要求包含$x$和$y$,并且排序后相邻两项的差值相等. 题解:有排序后相邻两项的差值相等可知,构造的序列排序后一定是一个等差数列,而题目给的$x$和$y$的范围很小,所以我们可以从$[1,50]$来枚举公差$d$,这个$d$必须要能整
阅读全文
摘要:题意:给你$a$和$b$两个数,每次操作可以是任意一个数$-1$,最多操作$n$,并且$a\ge x$,\(b\ge y\),求操作后$a*b$的最小值. 题解:观察样例并且在纸上推一推发现,我们要让$a$和$b$中,小的那个尽可能的小,然后模拟一下就好了. 代码: int t; ll a,b,x,
阅读全文
摘要:题意:给你一个字符串$s$,原字符串为$w$,如果$i>x$且$w_=1$,那么$s_=1$,如果$i+x\le n$且$w_{i+x}=1$,那么$s_=1$,否则$s_=0$.求$w$的一种可能的情况. 题解:对于$s$中的$0$,我们知道,它左右两边距离$x$的地方一定都是$0$,所以我们先假
阅读全文
摘要:题意:你和你的随从去偷剑和战斧,你可以最多可以拿$p$重的东西,随从可以拿$f$重的东西,总共有$cnt_$把剑,$cnt_$把战斧,每把剑重$s$,战斧重$w$,问你和随从最多能拿的剑和战斧的总和是多少? 题解:首先,肯定谁轻就先拿谁,我们就令剑是轻的,然后算一下我自己最多能拿多少剑,从$0$开始
阅读全文
摘要:题意:给你一个长度为$2*n-1$的字符串$s$,让你构造一个长度为$n$的字符串,使得构造的字符串中有相同位置的字符等于$s[1..n],s[2..n+1],...,s[n,2n-1]$中的位置上的字符. 题解:不难发现,$s$中的奇数位字符就是我们要的答案. 代码: int t; int n;
阅读全文
摘要:题意:给出一个长度为$n$的序列$a$,根据$a$构造一个序列$b$,要求: 1.\(b_{1}=0\) 2.对于$i,j(i\le i,j \le n)$,若$a_=a_$,则$b_=b_$ 3.对于$i\in [1,n-1]$,有$b_{i+1}=b_$或$b_{i+1}=b_+1$
阅读全文
摘要:题意:给你一个长度为$3*n$的字符串,要求修改最少的次数,使得字符串中$0,1,2$的个数相同,并且在最少次数的情况下使字典序最小. 题解:贪心,$0$一定放在前面,$1$和$2$放后面,首先统计$0,1,2$的个数,因为题目要求字典序最小,所以我们先从左边开始遍历,如果$2$的个数大于$n/3$
阅读全文
摘要:题意:有$n$扇门,你每次可以攻击某个门,使其hp减少$x$($\le 0$后就不可修复了),之后警察会修复某个门,使其hp增加$y$,问你最多可以破坏多少扇门? 题解:首先如果$x>y$,那么我肯定全部都能破坏,否则,统计$hp\le x$的门的个数,谁先碰门谁先赢,而我是先手,所以能破坏的门的个
阅读全文
摘要:题意:给你$n$个数字,用$k$种颜色给他们涂色,要求每个数字都要涂,每种颜色都要用,相同的数字不能涂一样的颜色. 题解:用结构体读入每个数字和它的位置,然后用桶记录每个数字出现的次数,判断是否合法,然后对数字进行排序,从$[1,k]$不断循环的去涂颜色,这样的好处是一定能保证相同数字涂的颜色不同,
阅读全文
摘要:题意:有一个$n$X$m$的图,"#"表示障碍物,"."表示道路,只能向右或向下走,问从左上角走到右下角的方案数. 题解:这题可以用bfs来搞,但dp更简单点吧~~.首先,只有当向右和向下都能走时,方案数才会增加,我们用dp表示从起点走到某个单位的方案数,这个单位只能从左边或上边走过来,所以它的方案
阅读全文
摘要:题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int in[N]; int dp[N]; int main() { //ios::sync_with_stdio(f
阅读全文
摘要:题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; int dp[10000][10000]; int main() { //ios::sync_with
阅读全文
摘要:题意:有$n$个物品,第$i$个物品价值$v_$,体积为$w_$,你有容量为$W$的背包,求能放物品的最大价值. 题解:经典01背包,但是物品的最大体积给到了$10^9$,dp数组下标会造成越界,因此我们不能用dp下标来存物品的体积,但是我们发现,物品的价值范围很小,所以我们反着想,枚举所有可能的总
阅读全文
摘要:题意:给你$n$个数,首先判断它们是否全都__两两互质__.然后再判断它们是否全都互质. 题解:判断所有数互质很简单,直接枚举跑个gcd就行,关键是第一个条件我们要怎么去判断,其实我们可以对所有数进行质因数分解,然后判断它们有无共同的质因子,如果有,那么就说明一定至少有一对数它们不是互质的,这样的话
阅读全文
摘要:题意:有$n$个人,给你$m$对朋友关系,朋友的朋友也是朋友,现在你想要将他们拆散放到不同的集合中,且每个集合中的人没有任何一对朋友关系,问最少需要多少集合. 题解:首先用并查集将朋友关系维护到集合中,然后贪心,其实我们所需要的集合数就是之前并查集维护的集合中的最大元素个数. 代码: int n,m
阅读全文