[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑r最后的二进制形式为 1xxxxx 那么我们肯定想让第一个最高位的1保留. 因此我们选取的另外一个数字 一定是 0xxxxx的形式. 那么我们贪心地选取数字b=01111..1 然后看看这个数字b是否大于等于L 如果满足,显然它也是满足小于等于R的. 那么我们选取的a=100000..0 那么结果显然就是最大的了.为11111...11 但是 如果b<L 那么我们就显然不能满足最后的结果第一位是1了. 所以b的第一位也只能是…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 很显然只要维护B,R,G的数量就好了. 可以很容易想到一个dfs(int a,int b,int c) 然后如果a+b+c==1,那么让其中为1的对应的颜色标记为可以得到就好 变换就是a-1,b-1,c+1和a-1,c-1,b+1以及b--,c--,a++以及a-1,b,c和a,b-1,c和a,b,c-1 然后加一个记忆化搜索吧.. [代码] #include <bits/stdc++.h> #define LL long l…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[i][j][k]前i个位置,第i个位置放j这个颜色,然后形成了k个联通块的最小花费 分第i个位置有没有已经放颜色两种情况考虑. 如果有放的话.枚举前一个位置的颜色以及前i-1个位置形成的联通块的数目 如果没有放的话.枚举当前以及前一个的颜色以及前i-1个位置形成的联通块数目 有放不用加代价. 没有放的话加上放的代价就会. 最后在f[n][1..m][k]里面找最小值 [代码] #include <bits/stdc++.h>…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 给一个森林. 就是由很多棵树组成.. 然后会询问你其中一棵树的最长链. 初始状态的最长链可以用两遍dfs分别找最长路得到. 然后要求你支持合并. 且合并过后. 新的树的最长链尽可能短. 这个合并的过程可以用并查集来表示. 给并查集添加一个变量value 表示这个并查集形成的树的最长链. 两个树合并. 最优的方法就是分别取最长链上的中点. 这样得到的新的树的最长链才可能最短. 新的最长链的长度在value[x],value[y],…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 第i只动物如果饲养它的话. 代价是固定的就是(n-i+1)a[i] 所以相当于给你n个物品,每个物品的重量为(n-i+1)a[i],价值为1 背包容量为x 问你最大价值是多少. 但因为价值是单位价值. 所以直接重量小的优先选就好了. 不够了就停止. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i &l…
[链接] 我是链接,点我呀:) [题意] 让你确定一个最小的k 使得1..k这些比赛的结果能够推导出所有人之间的实力大小 [题解] 如果关系越多.那么就越能确定所有人之间的大小关系. (多一点也能唯一确定.不嫌多 那么就二分一下k. 做一个拓扑排序. 如果能做唯一的拓扑排序.那么就ok 否则返回false. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <=…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 给你一棵树. 让你统计其中子树T的数量. 这个子树T要满足最大值和最小值之差小于等于d 树形DP 可以枚举点root为子树的根. 统计以root为根的子树的个数. 根据每个儿子节点选或者不选. 如果选.则看看它是否满足以下条件: 权值小于等于根节点的权值. (等于根节点的时候,要求该节点的标号<根节点的标号,不然会重复计数) 然后假设当前是枚举的第i个儿子 那么cnt表示的是这个根节点和前i-1个节点能形成的满足子树(是一个联通…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每一位显然只要取1..60这些数字. 然后需要保证每个这些数字里面,每个数字所用到的质因子都它所唯一拥有的.别人不能用 因为如果别人用了的话.gcd就不为1了. 因此我们肯定需要记录这些数字的质因子使用情况. 如果第i个位置枚举的数字,它里面的某个质因子,之前用过了.那么这个数字就不能用. 否则还可以用. 只需取前16个质数就能够表示1..60这些数字了 (其实只要取到58就好了,所以59这个质数不用,因为选59和选1的代价是一…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现如果x是reallynumber那么x+1也会是reallynumber.... (个位数+1,各位数的和+1了但是整个数也+1了.而且如果发生了进位的话,各个数码的和只会更小.. 因此这个reallynumber肯定有一个下界的.. 二分得到这个下界就好. 然后用n-下界+1就是答案了. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然最多1000行的样子. 从上到小做dp 设f[i][j]为前i行,使用了j个红色方块的方案数. f[1][r] = 1;如果r>0且g>0则f[1][r-1]=1; 然后如果第i+1行不用红色的话.->就只能用绿色了.. 算算绿色够不够填i+1个.. 够得话 f[i+1][j] = f[i+1][j] + f[i][j]; 然后看看红色够不够填i+1个 够得话 还可以用红色填i+1行 也即 f[i+1][j-(i+1…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意这k个序列每个都是排列. 如果在每个序列中都满足y出现在x之后的话. 那么我们从x连一条有向边至y (有一个序列不满足就不连 (这就表明最后的序列中x可以紧接着y 最后显然会形成一个有向无环图. 在这个图上求最长链就好了. 可以在做拓扑排序的时候边做这个dp. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 原题意等价于:给你一个序列(实数的位置没用!)..你可以改变其中某些元素的位置(插入到某些位置中间. 然后让他变成有序的. (有序的话,相同的数字就连在一起了 那么求出原序列的一个最长上升子序列. 把除了这个子序列之外的数字再分别插入到这个最长上升序列中就可以变成升序了. 这样是执行插入次数最少的做法. 答案就是数组长度减去最长上升子序列的长度了. [代码] #include <bits/stdc++.h> #define L…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先用枚举回文串中点的方法. 得到这个字符串中出现的所有的回文. 得到他们的左端点以及右端点. 整理成一个pair<int,int>数组 然后排序. 对于每一个回文串. 查找起点比这个回文串的终点大的所有回文串的个数. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++)…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 首先. 这张图是无向无权图. 因此任意两点之间的最短路可以通过N^2的bfs轻易算出来. 即得到d[N+10][N+10] 考虑s[0]->t[0]的最短路以及s[1]->t[1]的最短路 如果d[s0][t0]>l0或d[s1][t1]>l1那么直接输出无解 假设他们俩的最短路之间没有重合的部分. 那么m-d[s0][t0]+d[s1][t1]就是答案.因为剩下两条最短路肯定最好的情况了. 删掉的肯定是最多的.…
[链接] 我是链接,点我呀:) [题意] 给你n个数字 让你删掉最小的数字 使得: 剩余的数字中 "最大的数字"小于等于"最小的数字*2" [题解] 把数据从小到大排序. 显然只有删掉最小的数字或者最大的数字才可能改变最大数字和最小数字的比例 那么我们枚举最后的结果产生的那一刻最小的数字是什么. 设为x 则在数组中找到最大的一个位置i且a[i]<=2*x 则我们只需要把比x小的数字删掉.比a[i]大的数字删掉就能造成这种局面了 即最大值和最小值满足题目的要求.…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二维费用背包. f[i][j][k] 前i个人,写了j行,bug不超过k的方案数. 可以把每个人看成是一个物品. 它可以无限拿.然后花费为 1行代码和a[i]个bug (拿几个第i个人就相当于v[i]等于几. 就变成一个二维的完全背包了 直接用二维费用背包的方案数求法求得就好 两维的写法比三维的写法简单..直接顺序更新就可以了 (顺序更新) [代码] #include <bits/stdc++.h> using namespa…
[小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 1.本人模拟赛直接打出T2目测全场唯一AC代码结果细节被O2直接卡掉 2.第16号台风在附近海区逗留3天成功画出一个D-og 3.卖文具的小卖店提前装修结束开业 4.考场上明知道能用生成树做的题目还要用二分做,结果全部T掉 5.去食堂路上开始下雨,到食堂之后雨停了.... 好不水了,说点正经的 最近…
NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01背包就好了 1503 猪和回文 http://www.51nod.com/Challenge/Problem.html#!#problemId=1503 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有n行,m列组成.我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m.处…
正睿国庆DAY2动态规划专题 排列-例题 1~n 的排列个数,每个数要么比旁边两个大,要么比旁边两个小 \(f[i][j]\) 填了前i个数,未填的数有\(j\)个比第\(i\)个小,是波峰 \(g[i][j]\)是波谷 \(f[i][j] -g[i+1][j']\) \(g[i][j]-f[i+1][j']\) 可以前缀和优化 n个数的排列中恰好有k个位置满足\(a_i<a_{i+1}\)的个数 可能是今天唯一自己想出来的题了23333 \(f[i][j]\) 前i个数的排列有j个小于号的排列…
经过两次测试,通过深刻的反思,我主要发现了以下易犯错误: 1.做题目时过于追求速度,导致好几处代码都出现手误打错的现象!而且,千万不要图快.图方便就复制粘贴,非常容易出错!(例如T3-party中直接复制之前的代码然后忘记把“<”改成“=”了,光这个错误就找了好久,╮(╯▽╰)╭) 2.学过的知识不能灵活运用. 在T3-party这道题中,其实用floyed就可以拿到70分了!但是却偏偏要尝试没有太大把握的Dijkstra算法,而且还忘记了队列是怎么定义的! T4-tree其实也不难,可是一看到…
前言:按照计划,昨天应该是完成树形DP7题和二分图.最大流基础专题,但是由于我智商实在拙计,一直在理解树形DP的思想,所以第二个专题只能顺延到今天了.但是昨天把树形DP弄了个5成懂我是很高兴的!下面我把这7题的解题思想和部分代码分享给大家. 题目一:皇宫看守问题描述:太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫.皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同.可…
ACM暑期集训总结报告 不知不觉,ACM暑期集训已经过去了一个月了(其实我还差几天才够一个月,因为最后几天要回家办助学贷款,所以没坚持到最后,当了个逃兵.....[汗])也到了结束的时候.在这一个月中, 有压力,有感触,也有喜悦.收获了很多,反思了很多. 知识方面,这一个月中, 主要是看了DP的内容,包括基础DP(主要是背包), 状压DP, 数位DP(掌握的不好), 树形DP.另外,每周有几场训练赛,通过训练赛的题目,既重温了已经有些模糊的一些知识点,学习到了新的知识点.最后,还参加了一场CCP…
A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/p/3762735.html D.摩天轮 E.生日礼物 http://www.cnblogs.com/whatbeg/p/3762737.html F.神秘绑架案 http://www.cnblogs.com/whatbeg/p/3762739.html G.冬马党 http://www.cnblo…
前言 最近,决定好好恶补一下我最不擅长的\(DP\). 动态规划的种类还是很多的,我就从 状压\(DP\) 开始讲起吧. 简介 状压\(DP\)应该是一个比较玄学的东西. 由于它的时间复杂度是指数级的(但也足以吊锤\(DFS\)),所以状压\(DP\)题的数据范围一般都巨小. 前置技能:位运算 要想学习状压\(DP\),最好先去学一学位运算及其简单变换操作,因为位运算在状压\(DP\)中起到了很重要的作用. 核心思想 状压\(DP\)的核心思想在于用一个变量\(state(0≤state<2^N…
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.31.33 共7个.由于这个数目很大,请你输出它对1000000007取模后的值. 输入格式 输入包含两个正整数,K和L. 输出格式 输出一个整数,表示答案对1000000007取模后的值. 样例输入 4 2 样例输出 7 数据规模与约定 对于30%的数据,KL <= 106: 对于50%的…
CodeForces 429B  Working out 预处理出从四个顶点到某个位置的最大权值,再枚举相遇点,相遇的时候只有两种情况,取最优解即可. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstd…
比赛链接 A-CSU - 1588 现在有n堆果子,第i堆有ai个果子.现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数.求合并所有果子的最小代价. Input 第一行包含一个整数T(T<=50),表示数据组数. 每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数. 第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数. Output 每组数据仅一行,表示最小合并代价. Sample Input 2 4 1 2 3 4 5 3 5 2 1…
题意与分析 很简单:求最长公共子序列. 注意子序列与子串的差别:一个不连续一个连续.一份比较好的参考资料见:https://segmentfault.com/a/1190000002641054 状态转移方程是这样的: 设dp[i][j]dp[i][j]为a串1~i.b串1~j中的最长的公共子序列,则 dp[i][j]={dp[i−1][j−1]+1,  max(dp[i−1][j],dp[i][j−1]),  a[i]=b[j],a[i]≠b[j]dp[i][j]={dp[i−1][j−1]+…
题意 给定一矩阵M" role="presentation">MM,Mij=ij" role="presentation">Mij=ijMij=ij,求第k大值. 分析 这个题不看题解我是想不到二分的,但是二分当然属于暴力,不爽不要玩;) 实际上,现在做题解的时候,意识到一个有意思的结论:第k大xxx往往都与二分思想有关.我们还会与分治思想再见的. 具体做法:二分第k大值p.求数组中p元素是第几大即可. 代码 #include <…
题目 分析 这个Rnd353真是神仙题层出不穷啊,大力脑筋急转弯- - 不过问题也在我思维江化上.思考任何一种算法都得有一个“锚点”,就是说最笨的方法怎么办.为什么要这么思考,因为这样思考最符合我们的思维规律.然后从这种最笨的方法中找问题.找漏洞.找关键的变量不变量,就能转化出更好的更快的算法. 这题就是这样.最笨的方法是什么?随便从哪个点出发,按照一个方向一个一个抹平差距.可以保证,n-1次一定完成.那么哪里可以改进?0区间.0区间的时候我们可以不移动:比如说 0 0 2 -2 0 0,那么只…