oi题解
oi题解,涉及图论,数论,数据结构,动态规划,线段树,字符串等
超级无敌可爱的小番茄
这个作者很懒,什么都没留下…
展开
-
图论模板总结
图论模板总结为什么图论也有那么多代码??一.最小生成树1.最小生成树prim下面的写法是O(eloge)有O(n^2)的写法:双重循环枚举每个点typedef pair<int,int> pii;priority_queue <pii,vector<pii>,greater<pii> >q;void prim(){ memset...原创 2019-08-19 12:18:25 · 355 阅读 · 0 评论 -
图论总结
图论总结1.最小生成树:在稀疏图中用kruskal,在稠密图中用prim2.涉及排名先后时,可考虑topsort3.单源最短路问题数据范围一般为1e5,如果N是1000,甚至更小,可能就要枚举某些边了。最短路1.双关键字最短路。POJ 1724 ROADS题意:N个城市,编号1到N。城市间有R条单向道路。每条道路连接两个城市,有长度和过路费两个属性。Bob只有K块钱,他...原创 2019-08-19 12:26:53 · 526 阅读 · 0 评论 -
贪心,思维总结
贪心,思维总结套路:1.在具有多个要素的题中,考虑通过排序,让某些要素呈现单调性,使对其他要素的处理变得简单2.在对所有元素都要做处理时,可以从极端情况着手一.微扰法在考虑先后两个人的先后顺序时,可以考虑两种情况表示出来,作差比较排队接水n个人一起排队接水,第i个人需要b[i]的时间来接水。1 <= n <= 10000 <= b[i] <= 1000...原创 2019-08-19 12:17:42 · 1075 阅读 · 0 评论 -
树链剖分总结
树链剖分总结树链剖分:已知一棵包含N个结点的树,每个节点具有点权:操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和(操作3,4可以用...原创 2019-08-19 12:12:40 · 119 阅读 · 0 评论 -
数学模板总结
数学模板总结好吧。不得不说数论的公式是真的多。数论一.同余a≡b(mod c)a≡b(mod \ \ c)a≡b(mod c)成立的充要条件是(a−b)=k∗c(a-b)=k*c(a−b)=k∗c二.GCD && LCM$gcd(a,b)=gcd(b,a%b) $证明:唯一分解定理ab=lcm(a,b)∗gcd(a,...原创 2019-08-19 12:16:00 · 211 阅读 · 0 评论 -
树形dp总结
树形dp总结这是我自认写得最认真最详细的一篇总结套路:1.一般设的状态是dp[u],因为阶段是由深的到浅的。2.如果设出状态,但不好转移,可以考虑从底向上的top序或者dfs序来转移;3.如果这样设不出状态,就考虑可以反向计算对答案的贡献。4.一般是O(n)的,偶尔有带log的模型:1.树的直径题意:给定一棵树,每条树边附带边权,求每个点的在这棵树上能够去到的最远距离。考虑...原创 2019-08-19 12:14:39 · 557 阅读 · 0 评论 -
基础dp总结
基础dp总结总结POJ 1948 Triangular Pastures用给出的N个篱笆围成三角形,求三角形的最大面积可以是多少(答案乘以100后再取整数部分输出)。因为面积要最大,所以篱笆是肯定要用完的。所以用F[i][j][k]表示是否可以用前i个篱笆组成两条长度分别为j和k的边。那么另一边的长度自然就是sum-j-k。注意判断他们是否能围成三角形。状态转移方程为:F[i][j...原创 2019-08-19 12:11:57 · 354 阅读 · 0 评论 -
数学总结
数学总结素数,因子1.大区间素数POJ-2689 Prime Distance题意:题意:求给定区间内的质数距离最小的一对和质数距离最大的一对。(1 <= L,R <= 2.1E9, R-L <= 1e6)大区间的素数题都是这样做的。筛出不超过R\sqrt{R}R的所有质数p,然后再去枚举[L,R]区间内p的倍数,将其打上标记,最后区间内剩下的就都是素数了。这对...原创 2019-08-19 12:16:58 · 404 阅读 · 0 评论 -
poj 1724 roads 图论
poj 1724 题目大意:N个城市,编号1到N。城市间有R条单向道路。 每条道路连接两个城市,有长度和过路费两个属性。 Bob只有K块钱,他想从城市1走到城市N。求在钱够花的情况下的最短路。如果到不了N,输出-1思路:dijkstra以长度排序,每次松弛的时候判断钱用完没有,如果没有:松弛;如果用完了则不进行松弛。#include <iostream>#include...原创 2017-10-02 11:24:37 · 424 阅读 · 0 评论 -
poj 1062 昂贵的聘礼 dfs
poj 1062 题目大意:有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1。很多人用图论最短路做,但我认为这是典型的dfs思路:对于每一件物品,如果已经被搜过,就直接返回,否则,我们就去搜索TA的替代品。#include <iostream>#include <cstdio>#i原创 2017-10-02 11:31:53 · 208 阅读 · 0 评论 -
hdu 1556 差分
hdu 1556 差分 题目大意: N个气球排成一排,从左到右依次编号为1,2,3….N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽”牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?差分思想 怎样预处理出sum[i],我们新增数组s, 一开始s状态为 0 0 0原创 2017-10-03 10:37:54 · 317 阅读 · 0 评论 -
归并排序 & 逆序对
归并排序与逆序对联系紧密,使归并排序成为了必会的排序之一。void msort(int l,int r){ if(l == r) return; int mid = (l + r) >> 1; msort(l,mid);msort(mid + 1,r); int i = l, j = mid + 1, k = l; while(i <= mid && j <= r原创 2017-07-01 21:29:37 · 191 阅读 · 0 评论 -
codevs 2488 && codevs 2833 && 洛谷1137 拓扑排序模板
codevs 2488 && codevs 2833 && 洛谷1137 拓扑排序模板 1.让所有入度为0的点入队; 2.从队列中取出一个点,使所有与之相连的点入度减一。 重复1,2 直到队列为空。若此时所有点均入队,则图上没环,否则有环。codevs 2488#include <iostream>#include <cstdio>#include <cstring>#include <原创 2017-10-03 10:46:56 · 244 阅读 · 0 评论 -
洛谷1119 图论
题目大意:村庄受损道路完好。 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的。并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[i]天重建完成,并且在当天即可通车。若t[i]为0则说明地震未对此地区造成损坏,一开始就可以通车。之后有Q个询问(x, y, t),对于每个询问你要回答在第t天,从村庄x到村庄y的最短路径长度为多少。如果无法找到从x原创 2017-10-02 10:59:16 · 267 阅读 · 0 评论 -
状压dp总结
状压dp总结模型枚举子集1.O(3n)O(3^n)O(3n)对于每一位,有3种状态:在原集和子集中,在原集中不在子集中,在子集中不在原集中。for(int i=S;i>=1;i=(i-1)&S)2.O(2n)O(2^n)O(2n)考虑建立两层之间的转移,注意是从大的转移到小的,还是相反。这里是用大的更新小的。st=(1<<n)-1;for(ll i...原创 2019-08-23 21:35:58 · 509 阅读 · 0 评论 -
字符串算法:Hash算法,KMP算法,最小循环节、循环周期,Manacher马拉车算法
#字符串Ⅰ输入输出方式:1.char s[]scanf()printf()gets()2.Stringcincoutsstream(可用于非高精度输出x^y)Hash:1.工程中常见的hash算法:md5 sha1 sha2562.Rabin-Karp:求出每个前缀的hash,O(1)计算出一个子串的hash值Hash[i] = (hash[i - 1]*p+s[i])%mod取模方式:p为大质数,mod为超大质数。p 超过字符集大小,奇数 13131base和mod互质原创 2022-03-25 22:54:34 · 860 阅读 · 0 评论 -
codevs 1021 玛丽卡 图论:最短路
codevs 1021 题目大意:有N个城市,M条道路,每条道路需T分钟通过,其中有一条道路正在维修,无法通车,但不知道是哪一条,求从1号城市到n号城市的最长时间。 思路:先跑一遍最长路(记录下每条边:可通过fa[]),在依次删去最长路上的边,再跑最长路。#include <iostream>#include <cstdio>#include <cstring>#include <queu原创 2017-10-03 11:18:36 · 246 阅读 · 0 评论 -
Spfa vs dijkstra 模板
Spfa vs dijkstra Spfa:vis[]判断的是该点有无入队。void spfa(){ q.push(1); dis[1] = 0; vis[1] = 1; while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; f原创 2017-10-03 11:04:21 · 476 阅读 · 0 评论 -
线段树 or 树状数组求逆序对
poj 2299 线段树 || 树状数组求逆序对思路:建一个最大值为这些数中的最大值的线段树或树状数组,每读入一个数a[i],就更新线段树,再查找比a[i]小的数有多少个,如:k个,则i – k 就是第i个数的逆序数的个数,累加起来就是总的逆序对数。#include <iostream>#include <cstdio>#include <cstring>#include <algorithm原创 2017-10-03 11:56:55 · 185 阅读 · 0 评论 -
树状数组模板总结
树状数组模板总结开这篇文的目的是数据结构的代码太长,放在一篇里面就太冗杂了,所以就再开一篇记录各种模板。树状数组本质:动态维护前缀和。当然,也可以维护前缀最小,最大前缀和是最常用的,最值只适用于特定情况接口:lowbit()//lowbit(k)就是把k的二进制的高位1全部清空,只留下最低位的1和后面的0,比如10的二进制是1010,则lowbit(k) = lowbit(1010...原创 2019-08-19 12:15:27 · 380 阅读 · 0 评论 -
线段树模板总结
线段树模板总结线段树:实际操作:1.求区间最值和最值的个数2.求区间和2.求区间第k大(值域线段树)3.求实际区间长度(涉及区间合并)#include <iostream>#include <cstdio>#include <cstring>#define lson rt << 1,l,mid#define rson rt &...原创 2019-08-19 12:27:49 · 173 阅读 · 0 评论 -
洛谷1531 线段树模板:区间最值
洛谷1531 线段树模板:区间最值 在建树时采用二分思想#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 200000 + 5;int a[maxn],m,n,ta,tb;char tt;struct node{ int data,l,r;原创 2017-10-01 21:16:11 · 471 阅读 · 0 评论 -
我的题解(17年)
我的题解2017.9又重新开始学DSAA了,偶然翻到自己17年写的题解,五年过去了,现在的DSAA课还没当年做的题难,以此来对以往的oi生涯留个纪念吧1.洛谷1531线段树模板:区间最值2.洛谷 2068线段树模板:单点更新,区间求和3.codevs 4919线段树:区间更新,区间查询(余数)给你N个数,有两种操作1:给区间[a,b]内的所有数都增加X2:询问区间[a,b]能被7整除的个数第一问直接上模板,第二问用一个数组x[]来记录除7余数的个数:如x[1]表示区间内除7余1 的数原创 2022-03-25 22:48:33 · 2899 阅读 · 0 评论 -
codevs 1082 线段树:区间更新,区间求和
codevs 1082 线段树:区间更新,区间求和 重点在于lazy的使用 与单点查询不同的是在更新和查询时都需要pushdown(下放lazy)#include <iostream>#include <cstdio>#include <cstring>#define lson u << 1,l,mid#define rson u << 1 | 1,mid + 1,r#def原创 2017-10-01 21:54:33 · 259 阅读 · 0 评论 -
洛谷 2068 线段树模板:单点更新,区间求和
洛谷 2068 线段树模板:单点更新,区间求和#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 100000;int a[maxn],n,m,ta,tb;char tt;struct node{ int sum,l,r;}t[maxn原创 2017-10-01 21:21:45 · 276 阅读 · 0 评论 -
codevs 4919 线段树:区间更新,区间查询(余数)
codevs 4919 线段树:区间更新,区间查询(余数) 给你N个数,有两种操作 1:给区间[a,b]内的所有数都增加X 2:询问区间[a,b]能被7整除的个数 第一问直接上模板,第二问用一个数组x[]来记录除7余数的个数:如x[1]表示区间内除7余1 的数的个数,在进行区间更新如加5的时候将x的每一位向后移5 位 X[0] -> x[5] X[1] -> x[6]原创 2017-10-01 21:36:09 · 325 阅读 · 0 评论 -
hdu1166 树状数组模板:单点更新,区间求和(区间查询)
hdu1166 树状数组:单点更新,区间求和(区间查询) lowbit(k)就是把k的二进制的高位1全部清空,只留下最低位的1和后面的0 t = lowbot(k) 就是求出t = 2的x次方 ,并且 t <= k; 如:lowbit(5) = 4; lowbit(7) = 4;lowbit(2) = 2; Lowbit(k) = k &(-k);具体原理涉及补码. 对于一个数,原创 2017-10-01 22:41:08 · 226 阅读 · 0 评论 -
排列组合基本定理
排列组合A(n,m) = (n!)/(n - m)!C(n,m) = (n!)/((n - m)!* m!)基本定理:C(n,0)* C(n,1)*…*C(n,n) = 2 ^ nC(n,r) + C(n,r + 1) = C(n + 1,r + 1)C(n,0) = 1 C(n,i) = C(n,i - 1) * (n - i + 1) / iD(1) = 0;D(n) = (n - 1) * (D(n - 1) + D(n - 2)) 错排基本模型:Ⅰ隔板法x1 + x2 + …原创 2022-03-25 22:49:51 · 711 阅读 · 1 评论