![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 61
h_tour
这个作者很懒,什么都没留下…
展开
-
Burnside引理与Polya定理
基本概念 置换 形如: 其实和映射差不多,111映射为p1…p_1\dotsp1…。 循环置换 形如: 如果根据映射关系画一张图的话,循环置换的图应该是如下形式: 两者的关系: 任何一个置换都可拆成若干个循环置换的乘积。 置换群 从1−n1-n1−n所有的置换方式应该有n!n!n!种,包含其中若干种置换方式的群称为置换群。 BurnsideBurnsideBurnside引理 概念 每个置换的不动点个数的平均值就是不同的方案数。 不动点可以通过下面这个例子理解: 假设现在对于一个环的染色方案如下:原创 2021-03-29 15:28:12 · 270 阅读 · 0 评论 -
51nod 1257 背包问题 V3
题目链接 二分单位体积的价值,然后判断是否可行。 题意: 给我们n个物品的体积和价值,从中选k件物品,求单位体积的最大价值是多少? 题解: 二分单位体积的价值,然后将原有的物品进行转换排序,选取前k件,判断是否可行。 #include <bits/stdc++.h> using namespace std; const int MAXN = 5e4 + 10; int n, k; int allw, allp; struct Node { int w, p; double pw; }a[M原创 2021-02-24 14:58:38 · 69 阅读 · 0 评论 -
F. Equalize the Array
来源:Codeforces #702(div 3) https://codeforces.com/contest/1490/problem/F 题意: 给定一个长度为n的数组,问最少删除多少个数,使得新数组中每个数出现的次数相同。 题解: 记录每个数出现的次数,然后存入numnumnum中,按从大到小排序,那么每个次数需要保留的元素个数就是num[i]∗(i+1)num[i]*(i+1)num[i]∗(i+1),也就是,所有出现次数大于等于当前次数的元素个数 × 当前出现次数。将num里的每个元素枚举一遍,原创 2021-02-24 14:19:10 · 172 阅读 · 4 评论 -
Codeforces #704(div 2) A~D题解
A. Three swimmers 题目链接 题意: 给四个整数p,a,b,cp,a,b,cp,a,b,c。其中a,b,ca,b,ca,b,c分别表示三个游泳者到达泳池边的时间点,比如,第一个游泳者到达泳池边的时间就是0,a,2a,3a,…0,a,2a,3a,\dots0,a,2a,3a,…。p表示的是一个人来到泳池边的时间点,问这个人在泳池边要等多久才能见到第一个到达泳池边的游泳者。 题解: 直接找a,b,ca,b,ca,b,c的大于等于p的最小倍数即可。注意数据范围比较大,保守起见开了unsigned&原创 2021-02-24 10:39:45 · 198 阅读 · 2 评论 -
51nod 1287 加农炮
题目链接 二分。 题意: 给我们mmm个地面高度和nnn个炮弹高度,如果一个炮弹高度不大于当前的地面高度a[i]a[i]a[i],那么该炮弹就会停止,同时a[i−1]+1a[i - 1] + 1a[i−1]+1。如果当前的炮弹停在了第一个地面位置或者在最后一个地面位置都没停的话,视为无效炮弹。让我们输出最后每个地面位置的高度。 题解: 我们要把握一个性质,那就是,炮弹只会被第一个比它高的地面iii拦截下来,后面比a[i]a[i]a[i]矮的地面都不可能拦截到导弹,这样,我们可以在输入地面高度时维护一个非严格原创 2021-02-23 16:12:54 · 94 阅读 · 0 评论 -
51nod 第K大的数
题目链接 题意: 题目给了我们数组a和b,然后给了c数组中各个元素是由数组a和b相应元素相乘得到。让我们求出数组c中的第K大元素的值。 题解: 这道题目数组a和b的长度n是5e4,因此直接不能直接求出所有数组c元素的值。 这类求第K大的问题,有时可以使用二分的方法进行求解。 这道题目二分的思路就是,将数组a和数组b进行排序,首先二分这个第K大元素的值mid,然后在check函数当中,对数组a的每个元素二分找到与a[i]相乘大于mid的最小的b[j],那么显然b[j]之后的所有数组b的元素与a[i]相乘都会大原创 2021-02-22 20:40:45 · 81 阅读 · 0 评论 -
Codeforces #703(div 2) 部分题解
C. Guessing the Greatest C1简单版本链接 C2较难版本链接 这是一道交互题。二分。 题意: 给我们一个长度为n的一个排列,每次我们可以对一个区间进行询问,每次询问返回当前区间第二大的元素下标。让我们在有限次数内,找到这个排列的最大值的下标。 题解: 基本上交互题都是使用二分解决。这道题也不例外。我的做法就是,在第一次询问时,直接询问1 n1~n1 n这整个区间,找到第二大的元素下标,然后判断最大的元素在该元素的左侧还是右侧。判断的方法就是,比如目前第二大元素的下原创 2021-02-19 17:05:37 · 153 阅读 · 2 评论 -
Codeforces #690(div 3) 部分题解
Codeforces #690(div 3) 部分题解 D. Add to Neighbour and Remove 题目链接 大致题意: 给你长度为n的数组a,你能进行的操作就是将任意一个元素a[k],使其任意一个相邻元素a[k−1]a[k - 1]a[k−1]或a[k+1]a[k + 1]a[k+1]加上a[k]a[k]a[k],并 ...原创 2021-02-16 19:17:45 · 98 阅读 · 0 评论 -
区间DP——加分二叉树
区间DP——加分二叉树 原题链接 这道题目给了我们中序遍历,在这里我们需要用到一个结论: 一颗子树的中序遍历在给定的中序遍历中,一定是连续的一段。 因此,这里我们进行状态表示: dp[L,R]dp[L,R]dp[L,R]表示所有中序遍历是[L,R][L,R][L,R]这一段的二叉树的集合、 对于状态计算,由于一段中序遍历可能会对应多个不同的二叉树,因此,我们在这里比较容易区分的最后一个不同点就是每颗子树的根,也就是,我们按照根节点的不同对集合进行划分。 对于dp[L,R]dp[L,R]dp[L,R]这个集合原创 2021-02-15 16:45:41 · 88 阅读 · 0 评论 -
数论分块——余数之和
余数之和 题目链接 这道题目让我们求这样一个函数的值:F(n) = (n % 1) + (n % 2) + (n % 3) + … (n % n) 由于数据太大,直接暴力做会超时。因此,可以想办法将表达式进行转化: ∑i=1n(n%i)=∑i=1n(n−i∗⌊ni⌋)=n∗n−∑i=1ni∗⌊ni⌋\sum_{i=1}^n(n\%i)=\sum_{i=1}^n(n-i*\lfloor\frac ni\rfloor)=n*n-\sum_{i=1}^ni*\lfloor\frac ni\rfloor∑i=1n原创 2021-02-14 17:15:27 · 245 阅读 · 0 评论 -
CF#688 D. Checkpoints
CF #688D 原题链接 题意:构造一串长为n的01序列(n≤2000)(n\leq 2000)(n≤2000),有12\frac1221的概率成功通过第i个关卡,如果失败,立即返回到小于等于i的最大的1位置。 为何单独一个1,通过的期望次数是2呢? 我们假设穿过一个单独的1的期望是x 有12\frac1221的概率一次通过,也有12\frac1221的概率失败,那么还需要x的期望通过。 于是x=12∗1+12∗(x+1)x=\frac12*1+\frac12*(x+1)x=21∗1+21∗(x原创 2020-12-16 20:40:05 · 100 阅读 · 0 评论