![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
NOIP
Zolrk
这个作者很懒,什么都没留下…
展开
-
对于确认并查集最终集合个数的解法
·确定每个点的关系之后,有几个祖先就有几个家族for(int i=1; i<=n; i++){ if(father[i]==i) ans++; }原创 2017-07-13 11:45:55 · 525 阅读 · 0 评论 -
Codevs1010 过河卒 【简单DP】【细心】
这题需要注意的点是 第一种初始化表格边界的方式是: f[1][1] = 1;循环内部是这样写的 if(i - 1 > 0) f[i][j] += f[i-1][j]; if(j - 1 > 0) f[i][j] += f[i][j-1]; 第二种是“`c++ for(int i=0; i<=n; i++){ if(!b原创 2017-07-17 11:28:54 · 395 阅读 · 0 评论 -
能量项链 NOIP2006 Codevs1154
#include <cstdio>#include <algorithm>#include <cstring>int n,e,a[300],f[210][210],ans;inline void read(int &x) { x = 0; char c = getchar(); while(c < '0' || c > '9') c = getchar();原创 2017-07-21 09:27:29 · 396 阅读 · 0 评论 -
STL自定义函数
还是不太懂原理,但是sort的自定义比较函数大概是明白了 我认为吧void com(int a, int b){return a > b;}sort默认是升学的,从小到大排序 这个函数使sort把a > b看做 a < b 根据sort的默认排序规则a会排在b前面 这时候就是一个降序数组原创 2017-07-17 10:52:23 · 407 阅读 · 0 评论 -
石子归并 【区间DP】 Codevs1048
关于区间DP,推荐先看看最优矩阵链乘 用a[n]表示从1到n的全部石子重量 用f(i,j)表示从i到j合并所需的最小代价 从状态的角度来思考,考虑最后一次归并后的状态是如何转移的原创 2017-07-19 13:05:02 · 306 阅读 · 0 评论 -
封锁阳光大学【二分图染色】洛谷P1330
从题目中可以看出,能够完全封锁的图一定是一个二分图 只要占领一个点集(U或V)就可以封锁全部的道路 最少的河蟹数量就是较少的那个点集 上图中最少需要4只河蟹(V集合) 用dfs染色法判断是否为二分图,再用两个变量来记录不同颜色的点数 二分图中,若染源点为1,则源点的子节点染色为2,源点的,子节点的子节点染色为1 如果遇到了子节点和父节点颜色相同的情况,则无法构成二分图 因为如果颜色原创 2017-07-22 09:01:23 · 385 阅读 · 0 评论 -
乌龟棋 【多维DP】 Codevs1068
设dp[i1][i2][i3][i4] 是使用了i1张1,i2张2,i3张3,i4张4后能得到的最大分数 需要注意dp[0][0][0][0]要设置为第一个格子的分数,不然会错 下面的代码中因为i1 i2 i3 i4一开始都是0 所以x+=t可以初始化dp[0][0][0][0]为第一个格子的分数#include <cstdio>#include <algorithm>int n, m, m原创 2017-07-23 09:04:13 · 372 阅读 · 0 评论 -
石子归并2
环的处理方法 输入是4 4 5 9 那么我们把数组开成两倍大,在数组中存储 4 4 5 9 4 4 5 这样就可以构建一个环原创 2017-07-24 10:46:17 · 355 阅读 · 0 评论 -
离散化
原来一直不懂的东西呢… 后来发现也没什么,只要是专心去学习是可以搞明白的 百度百科的解释非常全面 离散化是将无限空间中有限的个体映射到有限的空间中去 具体来说就是,你需要一堆数据的相对大小,而不是绝对大小,就可以用离散化,把数据范围很大,但是数据数量很少的几个数放到一个小数组里,并且是一种映射关系形象点,就是一个范围很大很大的数组里只有几个数,那剩下那些没有写入数据的内存不都浪费掉了吗...原创 2017-08-02 21:05:19 · 437 阅读 · 0 评论 -
树状数组
不理解就背吧,反正树状数组的代码整洁又优美void update(int k,int num) { while(k<=n) { tree[k]+=num; k += k&(-k); } } int getsum(int k) { int sum=0; while(k) { sum+=原创 2017-08-02 20:45:19 · 233 阅读 · 0 评论 -
埃氏筛法
需要注意的是1既不是质数也不是合数 思想很简单,就是一个质数p的任意整数倍肯定都是合数,然后把这些合数筛掉留下来的就是质数,时间复杂度也不是很高#include <cstdio>#include <cmath>#include <iostream>using namespace std;const int maxn = 10000010;int m;int n;bool prime[原创 2017-08-22 21:29:16 · 333 阅读 · 0 评论 -
Noip2015 子串 【动态规划】
这道题思维量是可以的=。= 学习了dalao们的状态设计,觉得自己还是差很多啊! 先说一个没有滚动数组的版本 对于A串的一个字符,只有选和不选两种可能,选是一种方案,不选也是一种方案设f(i,j,k)f(i,j,k) 为A串的前 i 项在分离出 第k个子串时成功匹配到B串的前 j 项时 选择 A串第i项的方案数还需要加上A串第i项不选择的方案 设s(i,j,k)s(i,j,k) 为A串的原创 2017-08-19 22:43:13 · 479 阅读 · 1 评论 -
Noip2015 运输计划 【二分答案】【差分】【LCA】
代码写的难看=。=#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define max(a, b) (a) > (b) ? (a) : (b)inline void read(int &x) { x = 0; char c = getchar(); while(c<原创 2017-08-15 09:57:02 · 360 阅读 · 0 评论 -
Poj3662 Usaco2008JanSilver Telephone Lines
题目大意 给定N个点P条边的无向图,官方提供k条免费边。求如何去掉免费边,使剩下的边之中最大的边权最小,输出最大的边权这题…最大的最小,很容易想到二分…而且这些边一定构成了最短路。原创 2017-09-10 21:49:06 · 402 阅读 · 0 评论 -
Noip2015 斗地主【搜索】【贪心】
从题目中可以看出花色无用,并且出牌顺序无关紧要、 那么一个贪心的想法是少出单牌,多出顺子由于先出其他的牌会影响到出顺子,所以先去枚举各种出顺子的姿势,然后在每一次出某种顺子的状态下再去出其他的炸弹啊三带一什么的 用四个变量a1 a2 a3 a4 表示组合出 单牌,对牌,三带一/二,炸弹 的数量 回溯时记得把状态清掉(就是把那些本次出的牌再加回来),这样就不会影响到其他状态 代码…等待填坑原创 2017-09-05 15:57:13 · 348 阅读 · 0 评论 -
金明的预算方案【动态规划】
有依赖的01背包问题方便起见,我们把状态只定义在主件上(对输入进行特殊处理)每个主件有0,1,2个附件每次购买时,有**五种选择**1.不买2.只买主件3.买主件和一号附件4.买主件和二号附件5.买主件和全部附件原创 2017-07-11 12:43:44 · 1182 阅读 · 0 评论 -
Dijkstra模板
注意几点1.看清楚是有向还是无向图 2.dis初始值设为0x3f3f3f3f可能会不够 还是设为0x7fffffff吧#include &lt;cstdio&gt;#include &lt;queue&gt;#include &lt;cstring&gt;#include &lt;algorithm&gt;const int MAXN = 100000 + 1原创 2017-09-23 09:26:02 · 260 阅读 · 0 评论 -
Noip2016 愤怒的小鸟 【状压DP】
考虑到n的最多只有18个,可以用二进制来表示状态:f(s)表示消灭s集合的小猪所需要的最小小鸟数量,用0为第i个只猪没有被消灭,1为第i只小猪被消灭了,就像010001010101这样的,最后求的就是111111111111111这样状态的值状态转移方程为 f(S|P[i])=min(f(S|P[i]),f(S)+1)f(S|P[i])=min(f(S|P[i]),f(S)+1)通过枚举原创 2017-09-23 08:11:45 · 325 阅读 · 0 评论 -
POJ3669 Meteor Shower 流星雨【预处理】【广搜】
这个题有个坑点…就是流星虽然只能炸到300 X 300的区域,但是Bessie可以走到第一象限的任何地方,所以MAXSIZE 开大点吧…#include #include #include #include #include #include #define DEBUG(x) std::cerrconst int MAXM = 50000 + 1;const int MAX原创 2017-09-24 21:49:56 · 287 阅读 · 0 评论 -
Codeforces 1A 【模拟】
拿张纸YY一下就看出来了 ans=⌈n/a⌉∗⌈m/a⌉ans=\lceil n/a\rceil*\lceil m/a \rceil 注意要开longlong#include <cstdio>#include <iostream>#include <cmath>int main() { long long n,m,a; std::cin >> n >> m >> a;原创 2017-09-25 08:53:07 · 270 阅读 · 0 评论 -
Noip2016 组合数问题
虽然说通过组合数递推公式可以看出来C(i,j)=C(i−1,j−1)+C(i−1,j)C(i,j)=C(i-1,j-1)+C(i-1,j) 就是杨辉三角公式,但是还是有一个很关键的差别…就是当j=1时这个公式不太管用…比如说C13C_3^1 表示从三个东西里面选一个,有三种选法,这个就需要提前处理了… 只统计每一列满足要求的数的和,求第n行第m列时只要把第n行的前m列加起来就行了#include原创 2017-09-09 09:48:27 · 248 阅读 · 0 评论 -
不完全浅析Tarjan求强连通分量(SCC)
定义dfn[]为每个点的时间戳(搜索次序),low[]为每个点的所能追溯到的,最低dfn的祖先的dfn,也就是最浅祖先 证明我真的不会,只能自己YY,不确保说的每句话都是正确的,如果我的分析有错误请一定要指出来!!! 先走dfs。一个有SCC的图一定有环,所以当搜索到一个已经到过的点时,我们就找到了一个环,此时这个环上所有的点一定都强联通(就好比地球是圆的,所以一直沿某个方向是可以回到起点的),原创 2017-09-25 20:13:26 · 403 阅读 · 1 评论 -
NOIP2014 联合权值 - 图论
两个问题都需要按照每个节点的相邻点来思考解法。 把符合题目要求的,可产生联合权值的有序点对,称为联合点。第一问 每个节点的子节点(相邻点)之间,彼此组成联合点,具体看图。 可以比较每个节点的相邻点的权值,得到最大子节点和次大子节点。 他们的联合权值就是这个节点所能发现的最大联合权值。 然后更新答案ans=max(ans,max1∗max2)ans=max(ans,ma...原创 2017-07-13 17:02:17 · 606 阅读 · 0 评论 -
POJ 2762【强联通缩点】【拓扑排序】Going from u to v or from v to u?
题目大意是,判断一个有向图中所有的任意两点x,y,是否满足,从x可以走到y 或者 从y可以走到x很显然,同一个SCC中的所有点一定满足这个条件,当同一个SCC中的所有点要么同时选要么同时不选的时候,就可以缩点了。缩点的方法就是给每个点加一个强联通分量编号(染色),然后tarjan结束后考察每一条边,若某条边的两头不是同一个颜色,就加一条新边。缩点后的图一定是一个DAG(有向无环图),在这张新图上可以原创 2017-09-25 20:34:58 · 343 阅读 · 0 评论 -
CodeForces 816A Karen and Morning
CodeForces很良心,每个点都给数据,我已经不知道交了多少次了Orz 这题就是看错误点,慢慢加特判,一个一个加,最后总会A的(笑#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <string>using namespace std;const int maxn =原创 2017-09-26 20:56:09 · 283 阅读 · 0 评论 -
Poj3250 Usaco2006Nov银组 Bad Hair Day
问题是求一个数往右边看,在遇到大于等于他本身的之前,有多少个比他小的数转化问题为一个数能被多少个数看到,那么这些的和就是答案用单调栈去处理,把栈里的比当前处理的数要小于等于的全弹掉,剩下的那些就是严格比这个数大的,也就是可以看到这个数的 ans要开long long #include <iostream> #include <cstdio> #include <stack> using n原创 2017-09-10 17:53:15 · 217 阅读 · 0 评论 -
Poj3661 Usaco2008JanSilver Running
题目大意 奶牛们想要变成更强的运动员,所以Bessie开始了一项N分钟的训练,在每分钟,她可以选择跑步或者休息1整分钟 Bessie所能奔跑的极限距离,取决于她的“疲劳值”,一个一开始是0的值。当她选择在第i分钟奔跑时,她将会跑DiD_i 米,并且她的疲劳值将会增加1,但是这个值不能超过M。如果她选择休息,她的疲劳值将会每分钟减少1点。她直到疲劳值减少到0的时候才能再次开始奔跑。 N分钟的锻炼原创 2017-09-10 19:32:02 · 281 阅读 · 0 评论 -
Codeforces 853A Planning 【贪心】
题目大意 由于不可抗力什么的所有航班都要推迟k分钟,啊但是每架飞机都已经计划好原来的起飞计划了Orz(输入顺序就是原起飞计划),于是Helen就需要搞一个新的起飞计划。 飞机C每推迟一分钟(相对于原计划)就会花费C_i块钱,并且新的计划中,不允许某架飞机的起飞时间比原计划还要早,而且而且不允许同一分钟内起飞两架飞机 现在求一个最优方案使得花费最少,并且打出这个方案来。原创 2017-09-26 21:34:02 · 318 阅读 · 0 评论 -
Codeforces 274B 【树形DP】
题目大意 给定一棵树,以及树上每个点的权值,每次操作可以将一棵(必须)含有节点1必须包含的子树上所有的点全部加1或减1,求最少几次操作可以将树上全部节点权值变为0原创 2017-09-27 20:49:38 · 685 阅读 · 0 评论 -
Poj3660 Cow Contest 【传递闭包】
Rank这种东西…根据定义来说就是个体在整体中的排名,那么一定需要知道这个个体和整体的关系才能知道Rank。 比如说,只有知道其他所有人的成绩,才能知道自己的排名是多少 那么问题转化为求有多少个能够 确定和其他所有点的关系 的点 传递闭包跟Floyed基本相同…就是把松弛操作改成了传递关系 需要注意的是,有关系指的是打败和被打败,要有两个判断if(a[i][k] && a[k][j]) a[原创 2017-09-20 21:31:27 · 267 阅读 · 0 评论 -
POJ3666 Making the Grade & Codeforces 713C
题目大意 给定一个序列,可以变化其中的数字,总代价为|A1 - B1| + |A2 - B2| + … + |AN - BN| 求最少的代价,使这个序列变为单调不严格上升或下降序列#include <cstdio>#include <iostream>#include <algorithm>#define Abs(a) ((a)>0?(a):-(a)) using namespac原创 2017-09-28 16:53:21 · 298 阅读 · 0 评论 -
POJ3279 Fliptile 【暴力】
这是一个带状压的暴力Orz 对于每个点,有效的反转次数不会超过2,所以只要求出每个点的反转次数,加上其本身的0/1,再对2取模,就是这个点现在的颜色问题来了,如何求某个点的反转次数呢?可以逆向思维,先把每个点的反转次数存在数组fli中,某个点的反转次数等于其本身反转次数以及上下左右四个点的反转次数之和(能对这个点有影响的只能是其上下左右的点),再加上其本身的颜色编号(0/1)把全部区域变...原创 2017-09-27 16:19:40 · 304 阅读 · 0 评论 -
Codeforces 778A String Game
题目大意给定一个基础字符串和一个匹配字符串,以及一个**删除索引**求按照删除索引的顺序,最多删几个字母,使得剩下的字符串中依然包含那个匹配字符串。注意,一个字符被删除后,其他字母的位置不会改变原创 2017-09-29 15:34:36 · 502 阅读 · 0 评论 -
Codeforces 664A Gerald and Giant Chess
#include <algorithm>#include <iostream>#include <cstdio>#include <cstring>#include <string>std::string a, b;int main() { std::cin >> a >> b; if(a == b) std::cout << a; else std::cout原创 2017-10-17 20:50:14 · 382 阅读 · 0 评论 -
Noip 2012 同余方程
#include <algorithm>#include <iostream>#include <cstdio>using namespace std;const int MAXN = 100010;int a, b, ans;int x,y;int ex_gcd(int a, int b, int &x, int &y) { if(b == 0) { x =原创 2017-10-18 10:48:39 · 276 阅读 · 0 评论 -
快速幂
核心思想是二进制转十进制 11的二进制表示为1011 ∵11=23∗1+22∗0+21∗1+20∗1∵11=2^3*1+2^2*0+2^1*1+2^0*1 ∴a11=a23∗a21∗a20∴a^{11}=a^{2^3}*a^{2^1}*a^{2^0} 运用位运算,就可以方便地快速幂 代码是对某一个数取模,洛谷上有相应的模板题#include <cstdio>#include <ios原创 2017-08-20 21:42:22 · 215 阅读 · 0 评论 -
SCOI2005 骑士精神 - IDA*
棋盘太大,状态数太多,无法像八数码那样用哈希+BFS去做,但是用DFS也会T掉,这个时候可以考虑IDA*,即 迭代加深搜索 + A*剪枝。这题的h(n)就是当前与目标棋盘不同的棋子数量。在一颗含有答案的子树中,我们至多需要再走h(n)步,就可以找到答案因此,当当前步数+h(n) > 最大可走步数时,就可以剪枝于是现在要求最大可走步数,这里就体现了迭代加深,每次加大最大可走步数(直到15步),在强制认原创 2017-10-10 15:58:06 · 327 阅读 · 0 评论 -
Tyvj 1072 LCIS - DP
这个题需要把LIS和LCS合二为一首先设f(i,j)表示从A1~Ai 和 B1~Bj 两段区间中,以Bj结尾的LCIS最大长度注意,这里相当于固定住了“Bj是什么”这个问题,并且状态和转移是对于每一个固定的Bj才有意义的再具体一点,因为关于A1~Ai的循环是套在B1~Bj外面的,所以在进行B1~Bj的循环时,可以将Ai看作一个常量,这个时候对答案有影响的参数就只有i,j和Bj,状态就可以设计出来。原创 2017-10-09 20:32:40 · 302 阅读 · 0 评论 -
Codeforces 776B
题目大意: 给定数n,表示有n个物品,每个物品i的价值为i+1 现在要染色,要求是:当a是b的质因数时,a,b颜色不同 求一种颜色总数不同的染色方案这个。。。所有质数都可以染成同一个颜色,同样所有合数也可以都染成同一个颜色,然后答案就出来了,除了1以外的整数要么质数要么合数啊。。。 然而还是要特判n==1和n==2的#include <cstdio>#include <iostream>原创 2017-10-03 23:07:17 · 307 阅读 · 0 评论 -
Noip 2016 蚯蚓 - 队列
AC需要O(M)O(M)算法 我们先想一个O(MlogN)O(MlogN)的算法,然后想办法优化掉logN需要做的就是不断地找最长蚯蚓,然后切一切,再给这次没有被切的蚯蚓加上一个长度q自然可以想到堆来动态维护最大值,然后需要考虑每次切割后蚯蚓的增长该怎么操作。不能去每切一次就扫一边数组,需要找到一种差分的方法,把区间操作改为端点操作。重点是差分,我们发现,如果一个蚯蚓被切,其他蚯蚓增长p,可以用一原创 2017-10-10 21:21:05 · 501 阅读 · 0 评论