04 2024 档案
POI2012STU-Well
摘要:POI #Year2012 #二分 考虑二分答案,然后如果 ,那么一定要提前操作掉,先把这种情况搞掉 然后考虑枚举一个位置变成 ,在上面的操作后,可以保证 ,那么这时还需要操 作的区间 \([
POI2012ROZ-Fibonacci Representation
摘要:POI #Year2012 #数学 贪心的每次选择最接近的两个数, // Author: xiaruize const int N = 2e5 + 10; vector<int> vec; int n; void solve() { int
POI2012RAN-Rendezvous
摘要:POI #Year2012 #基环树 #lca 分类讨论 如果 不联通, 如果 在同一棵子树下,最优策略一定是 如果 不在同一棵子树下,最优策略是 中的一个 // Author: xi
POI2012PRE-Prefixuffix
摘要:POI #Year2012 #kmp 考虑相当于把原串分成 的串,使得 尽可能长 然后从后往前枚举后面的 长度,然后对于 的长度考虑 ,然后往下缩小直到合法 // Author: xiaruize con
POI2012FES-Festival
摘要:POI #Year2012 #Tarjan #最短路 强联通分量之间是不影响的,考虑对于一个强联通分量内,方案数等于这个强联通内的最短路 // Author: xiaruize const int N = 6e2 + 10; int n, m1, m2; vector<int> g[N]
POI2011ROZ-Difference
摘要:POI #Year2011 #枚举 #贪心 枚举最后差最大的两个字符,将原串中 ,其他标 原来的问题转化为强制包含 的最大字段和问题,维护每个位置前最近的 ,贪心取最大的 /
POI2011PRO-Programming Contest
摘要:POI #Year2011 #Dinic #网络流 #贪心 容易想到拆点的费用流做法,但是二分再拆点的时间复杂度是不可接受的 考虑因为每个的时间 是定值,所以不可能出现做题个数差超过 的情况 所以每一轮每个分配一个,用 在推进一次,知道满流 // Auth
POI2011MET-Meteors
摘要:POI #Year2011 #整体二分 整体二分板子,用树状数组维护即可 // Author: xiaruize const int N = 1e6 + 10; int n, m, t; vector<int> vec[N]; struct node { int l, r, x; } s[N]; p
POI2011LIZ-Lollipop
摘要:POI #Year2011 #构造 #妙妙题 假设能取到 ,那么 , 奇偶性相同, , 一定可以是 的一个子区间,处理奇数和偶数的最大值,离线,从大到小做 // Author: xiaruize const i
POI2011Lightning Conductor
摘要:POI #Year2011 #dp #决策单调性 令 满足四边形不等式 所以这个 具有决策单调性,分治维护 // Author: xiarui
POI2011KON-Conspiracy
摘要:POI #Year2011 #数学 考虑按照 排序,然后暴力加入,这样可以得到一个极大的子集 方案数分两种,一种为从团内去掉一个 的点,或者是将一个团外的 的点与一个团内的交换 // Author: xiaruize const
POI2011INS-Inspection
摘要:POI #树上问题 #贪心 考虑什么样的点合法,这个点需要尽可能的均匀的子树,手摸几个发现,当且仅当这个点是重心的时候是可行的 那么贪心的来说,我们希望最后一个不需要回来的路径长度尽可能的大,搜索就可以做到 特判当有一个子树的 为 时,最后的路径一定在
POI2011DYN-Dynamite
摘要:POI #Year2011 #二分 #树上dp 二分答案 对于每个点 表示到 ,表示最远的没有被覆盖的点的距离 , 表示最近的被选中的点的距离 转移按照题意,如果可以覆盖就覆盖,否则当留下来不合法就加点 //
POI2009SLO-Elephants
摘要:#POI #Year2009 #贪心 #数学 建图,对于每个环,有两种可行的方案, 是这个环内部操作,需要的代价为 , 为这个环中的最小值, 为这个环的长度 还可以用环外的一个点,需要的代价为 \(mn\times (cnt+1
POI2009LYZ-Ice Skates
摘要:POI #Year2009 #线段树 #Hall定理 考虑实际上是一个二分图匹配问题,那么这个二分图存在匹配当且仅对于 的任何子集右侧的度数和 左侧的 然后线段树维护左侧的区间最大和 // Author: xiaruize const int N = 2e5 + 10;
POI2009GAS-Fire Extinguishers
摘要:POI #Year2009 #贪心 贪心的把灭火器放到深度较小的点上,对于每个点,维护两个数组,记录距离当前点为 没有覆盖的点有 个,距离当前点 的灭火器有 个 然后在每个点上,合并长度为 或者 的路径,因为这些
POI2009BAJ-The_Walk_of_Bytie-boy
摘要:POI #Year2009 #dp #bfs 表示 的最小距离,考虑暴力的转移需要枚举两个,是 的 考虑将这个转移拆成 步,每次先枚举 处添加一个,再在 处
POI2010TEL-Teleportation
摘要:分层图 #贪心 #POI #Year2010 考虑将答案的图建成一个 层的图,其中 为第 层,第 层为已经与 相连的点 考虑将剩下的点与第 层相连,贪心选尽可能大的 // Author: xiaruize c
POI2010MOT-Monotonicity2
摘要:线段树 #dp #线段树优化dp #POI #Year2010 线段树维护 转移即可 // Author: xiaruize const int N = 1e6 + 10; struct segment_tree { #define ls p << 1 #define rs p <<
POI2010MOS-Bridges
摘要:POI #Year2010 #二分 #Dinic #欧拉回路 看到最小值,具有单调性,考虑二分 对于一个 如果一条边两个方向都不能走,那么必然不合法 如果只有一个方向可走,那么变为有向边 否则为无向边 考虑有向图欧拉回路存在的充要条件,需要这个图中每个点的 \(indeg=outde
POI2010CHO-Hamsters
摘要:POI #Year2010 #kmp #字符串 #dp #矩阵优化dp 用 处理两个串拼在一起最小增加的代价,然后 表示选择 个最后是 的最小长度 转移枚举拼接的串 这个明显可以矩阵优化 // Author: xiaruize con
POI2010MOS-Bridges
摘要:POI #Year2010 #二分 #Dinic #欧拉回路 看到最小值,具有单调性,考虑二分 对于一个 如果一条边两个方向都不能走,那么必然不合法 如果只有一个方向可走,那么变为有向边 否则为无向边 考虑有向图欧拉回路存在的充要条件,需要这个图中每个点的 \(indeg=outde
POI2005KOS-Dicing
摘要:网络流 #二分 #POI #Year2005 考虑二分答案,用 来 具体来说,就是对每一个人限制流量,然后检查能不能把所有场全部流满 #include <bits/stdc++.h> using namespace std; #define int long
POI2006MET-Subway
摘要:POI #Year2006 #妙妙题 #贪心 考虑从下往上按照拓扑序分层,对于每一层,这一层最多可以选择 个 考虑这个上界是否可以达到,这是一定可以的,通过将在下面结束的路径向上,可以做到每个点都被经过 所以直接统计 // Author: xiaruize #ifnd
POI2006EST-Aesthetic Text
摘要:POI #Year2006 #dp 表示考虑到第 个单词,当前行长度为 的最小代价 暴力转移是 的 然后观察到,其实合法的转移不能卡满,具体来说,有至少 的常数,因为 \(d
POI2006ZAB-Frogs
摘要:二分 #单调队列 #bfs #POI #Year2006 具有单调性,二分 从上往下考虑每一行,对于每一列维护一个单调队列,考虑维护一个覆盖的区间,表示这一列的最近的圆的位置,然后就可以计算它的覆盖区间 用差分计算每个位置是否被覆盖,处理当前长度下每个点是否被覆盖 然后 即可 //
POI2006SZK-Schools
摘要:费用流 #POI #Year2006 费用流模板题,暴力建图,限制一下流量 // Author: xiaruize #ifndef ONLINE_JUDGE #define debug(x) cerr << "On Line:" << __LINE__ << #x << "=" << x << en
POI2006PRO-Professor Szu
摘要:缩点 #dp #POI #Year2006 建反图, 缩点,在有向无环图上跑 , 计算方案数 超过 的直接与 取 就可以避免炸 特判 最大方案数为从最后一个点
POI2006PAL-Palindromes
摘要:POI #Year2006 #字符串 #妙妙题 #hash 结论 对于两个回文串,当且仅当两个串的最小循环节相同,这两个串拼起来是一个回文串 那么就可以用 维护,最短循环节的长度为 当 时为 否则为 然后 \(h
POI2006ORK-Ploughing
摘要:POI #Year2006 #贪心 #暴力 如果将所有的列干掉,那么贪心的如果可以删除一列就优先删除一列 当左右列不可以删除时,考虑上下行先删除谁不好判断 考虑在操作之前先枚举上面删除多少行,这样在操作时就可以贪心的使得下面删掉的行尽可能少 也就是贪心先删除上面 // Author: xiaruiz
POI2007ATR-Tourist Attractions
摘要:最短路 #状压dp #滚动优化 #POI #Year2007 从前 个跑 ,对这 个点到达的状态状压 会 MLE ,考虑每次转移都只会增加一个状压下的 ,按照 分组做滚动 // Author: xiaruize c
POI2007TET-Tetris Attack
摘要:POI #Year2007 #贪心 #树状数组 考虑每一对数的最小代价为,将当前的换到最近的下面 用树状数组记录中间有几个没有被消掉的 // Author: xiaruize const int N = 2e5 + 10; int n, m; int la[N]; struct BIT { int
POI2007POW-The Flood
摘要:POI #Year2007 #并查集 #贪心 按高度从小到大按顺序考虑每个点,将同样高度的点按顺序全部合并完,然后再遍历这些同样大小的点,如果一个点为关键点且它的联通块中没有抽水机,那么这个位置联通块的最低位置放一个抽水机 可以证明这个贪心是最优的 // Author: xiaruize const
POI2007ODW-Weights
摘要:进制 #背包dp #贪心 注意到呈倍数的性质,考虑按照倍数转换进制,贪心的选择小的按顺序选择 // Author: xiaruize const int INF = 0x3f3f3f3f3f3f3f3f; const int MOD = 1000000007; const int N = 2e5 +
POI2008KUP-Plot purchase
摘要:POI #Year2008 #贪心 #最大子矩形 #单调栈 先把所有的 的 先标记,然后考虑不包含这些点的最大子矩形 如果这个子矩形的 那么必然存在一个合法矩形,可以这样构造 如果当前行的 那么删除 \(x\
POI2008BBB-BBB
摘要:Year2008 #POI #贪心 #数学 考虑枚举旋转了几次,维护一个前缀和,一个前缀和的 ,目标为使和合法并使前缀 满足条件,这个代价就可以 计算 // Author: xiaruize const int INF = 0x3
POI2008UCI-The Great Escape
摘要:dp #POI #Year2008 倒着跑这个过程,发现为每次拓宽一个矩形,记录这个矩形的对角的坐标,当前的方向,可以得到 ,从同方向相邻的点,或者转向后经过一条边长的点转移过来,单次转移是 的 但是这个会
POI2008POC-Trains
摘要:哈希 #STL #POI #Year2008 对于每个串做 ,每次操作后只对被影响的等价类更新答案 // Author: xiaruize int n, l, m; char s[1005][105]; multiset<ull> st; ull hsh[1005]; int re
POI2008MAF-Mafia
摘要:POI #基环树 #贪心 #Year2008 一定是若干棵基环内向树,以下仅考虑一棵的情况 最小值直接从下往上选,然后环上的为环的 的一半 最大值为 减去叶子个数,再特判环上剩下一个的情况 // Author: xiaruize const int N = 1e6 + 1
01 矩阵游戏
摘要:构造 #POI 对每一行和每一列建一个点 对于每一个开关 从 行向 列建边 问题转化为选择一些边 使得每个点的度的奇偶性相同 分类讨论 如果存在环 那么只选择这个环就可以满足条件 暴搜 否则原图不 存在度数全为偶数的解 并且为一个森林 所以叶子节点必定选中
TheKingsArmyDiv1
摘要:Topcoder #区间dp 考虑 表示当前考虑区间 ,上面一行全部 的最小代价,下面一行全部 的最小代价,上下都 的最小代价 转移考虑每次将两段拼起来,或者从现有的拓展一个 貌似有贪心做法,不太会喵~~~ //
MagicMolecule
摘要:剪枝 #Topcoder 考虑爆搜,给这个加上最优性和可行性剪枝 具体来说,可行性判 最优性可以记录每个状态是否合法,对于有合法后继的,记录最大的 ,否则记录最多选几个数 // Author: xiaruize con
YetAnotherBoardGame
摘要:Topcoder #搜索 经典套路,我们发现枚举第一行后剩余的其实是确定的 那么枚举并爆搜即可 时间复杂度是 因为列的限制 // Author: xiaruize const int N = 13 + 10; int n, m; bool s[N][N], bck[N][N]; in
TravellingPurchasingMan
摘要:Topcoder #Floyd #状压dp Floyd 跑全源最短路,然后 表示在 购物过,并且最后一次在 的最小完成时间,枚举一个转移即可,时间复杂度是 ) 的 // Author: xiar
WolfDelaymasterHard
摘要:Topcoder #dp 的 是容易的 考虑怎么优化,注意到对于 这个位置,它能贡献到的区间是 的 因为每遇到一个 o ,合法的左端点都会从当前位置扩大到 倍,所以最多有 次扩大,即 \(
PalindromeMatrix
摘要:Topcoder #枚举 #dp 枚举回文的行,考虑 表示前 列和后 列中有 列为回文的列的最小代价 转移要分讨 // Author: xiaruize const int INF = 0x3f3f3f3f3f3f3f3f; const
P4677DeerInZooDivOne
摘要:费用流 #二分图最大权匹配 #dp 表示以 为对应点的最大同构子树的大小 对于一对点,转移为将 中的点按照一定顺序对应 那么问题转化为如何求一组匹配,使得两两匹配的权值尽可能大,即一个二分图最大权匹配,可以费用流解决 然后枚举断开的每条边,对
P4148BitwiseAnd
摘要:贪心 考虑什么样的数的集合满足条件,发现同一个二进制位不能有超过 个数为 加入第 个数要满足的条件为: 这个数与前面的每个数的 不为 ,即每次占用一个前面的数的 ,这个 必须是这个数仅有的 这个数必须有 \(n-
P4143PyramidSequences
摘要:数学 等价于在一个 的矩形中做弹球,问经过的整点个数 ,将 分别除掉 ,得到 此时会有 条线段,每条线段经过 个整点,另外还有 \(\lceil \frac{(n'
P4139TriangleXor
摘要:数学 #计数 #容斥 分为 个部分计算 上面的按奇偶性分类 下面的按每一层容斥,即 左右直接对每一块计算面积 // Author: xiaruize const int INF = 0x3f3f3f3f3f3f3
P4112DrawingPointsDivOne
摘要:二分 具有单调性,考虑二分答案 对于 考虑怎么 ,可以暴力的展开 次,再缩小 次,如果得到的结果和初始状态相同,那么就合法,否则不合法 // Author: xiaruize const int N = 1e3 + 10; int n; pii
ConvexPolygonGame
摘要:博弈 #计算几何 这要先手可以操作,那么一定存在必胜策略 所以题目转化为 判原来的多边形内有没有三个不共线的点 把所有点求出来判共线即可 // Author: xiaruize const int INF = 0x3f3f3f3f3f3f3f3f; const int MOD = 100000000
XorCards
摘要:高斯消元 #xor 考虑拆分限制分别算,对于一个 的限制,它等价于满足 和 的方案数的和 及将一个前缀的 转为 ,保证这个 前面的字符全部相等,剩下的部分任取 然后就可以得到一些 方程组,
TurnOnLamps
摘要:贪心 贪心的从下往上,对于当前位,如果这一位是任意的,那么如果它有儿子可以向上,那么当前点选择为翻转是肯定不劣的,而如果没有儿子向上,那么当前点选中一定是不优的 然后数向上的儿子个数,每 个可以合并为 条路径 如果一个点合并后不满足限制,则通过从当前点重新出发一条链来使它合法
LittleElephantAndRGB
摘要:计数 枚举第一个区间的右端点,第二个区间的左端点,然后记录每个点前面第一个连续的 个的位置,这个点往前连续的 的个数,对称在记录一遍 然后直接统计答案, 如果两个拼起来一段是可行的 考虑前面选的不够,后面去到一整段之后 前面和后面拼起来够,等差数列 前面足够长 否则 考虑
POI2006ZAB-Frogs
摘要:二分 #单调队列 #bfs #POI #Year2006 具有单调性,二分 从上往下考虑每一行,对于每一列维护一个单调队列,考虑维护一个覆盖的区间,表示这一列的最近的圆的位置,然后就可以计算它的覆盖区间 用差分计算每个位置是否被覆盖,处理当前长度下每个点是否被覆盖 然后 即可 //
POI2006SZK-Schools
摘要:费用流 #POI #Year2006 费用流模板题,暴力建图,限制一下流量 // Author: xiaruize #ifndef ONLINE_JUDGE #define debug(x) cerr << "On Line:" << __LINE__ << #x << "=" << x << en
POI2006PRO-Professor Szu
摘要:缩点 #dp #POI #Year2006 建反图, 缩点,在有向无环图上跑 , 计算方案数 超过 的直接与 取 就可以避免炸 特判 最大方案数为从最后一个点
POI2006PAL-Palindromes
摘要:POI #Year2006 #字符串 #妙妙题 #hash 结论 对于两个回文串,当且仅当两个串的最小循环节相同,这两个串拼起来是一个回文串 那么就可以用 维护,最短循环节的长度为 当 时为 否则为 然后 \(h
POI2006ORK-Ploughing
摘要:POI #Year2006 #贪心 #暴力 如果将所有的列干掉,那么贪心的如果可以删除一列就优先删除一列 当左右列不可以删除时,考虑上下行先删除谁不好判断 考虑在操作之前先枚举上面删除多少行,这样在操作时就可以贪心的使得下面删掉的行尽可能少 也就是贪心先删除上面 // Author: xiaruiz
POI2006MET-Subway
摘要:POI #Year2006 #妙妙题 #贪心 考虑从下往上按照拓扑序分层,对于每一层,这一层最多可以选择 个 考虑这个上界是否可以达到,这是一定可以的,通过将在下面结束的路径向上,可以做到每个点都被经过 所以直接统计 // Author: xiaruize #ifnd
POI2006MAG-Warehouse
摘要:切比雪夫距离 #曼哈顿距离 #POI #Year2006 切比雪夫距离向曼哈顿距离转换 直接转换会炸精度,考虑先不除以 然后根据小学数学,可以将 分别排序,然后前缀和+二
POI2005SZA-Template
摘要:字符串 #kmp #POI #Year2005 考虑字符串做 考虑第 位的答案,假设 ,考虑 在什么情况下是合法的 当最后一个 的 满足 时,那么 \
POI2005KOS-Dicing
摘要:网络流 #二分 #POI #Year2005 考虑二分答案,用 来 具体来说,就是对每一个人限制流量,然后检查能不能把所有场全部流满 #include <bits/stdc++.h> using namespace std; #define int long
POI2005DWA-Two Parties
摘要:高斯消元 #POI #Year2005 考虑对一边的人标 另一边标 考虑对于每一个人,如果这个人当前有奇数个连边,考虑连一条自环,使得它变为偶数个连边 将每个点所有的连接的点的点值 起来,如果当前为奇数,那么使异或和为 否则为 解出一个
POI2004MAK
摘要:dp #贪心 #构造 #POI #Year2004 order 等于所有环的长度的 表示前 个质数组成和为 的最大 每个数一定是 ,其它方案在贪心上都是不优的 在 的时候记录方案,尽可能优先
POI2004JAS
摘要:贪心 #POI #Year2004 询问操作等价于将当前的子树从一个点分为几棵树,类似于点分治的操作 所以询问可以转化为原树的最小点分树的大小 然后考虑对于每个点计算一个 表示答案, 状压一个子树内的所有答案 因为点分治最多 层,所以状压 \(1
Poi2004Gra
摘要:博弈论 #阶梯博弈 #Year2004 #POI 对于每一个 ,转化为它到 的间隔数,然后发现这个等价于阶梯博弈 阶梯博弈只考虑奇数位,但是同时也要考虑操作完偶数位以后是必败状态的情况 注意如果一开始在 上有数,那么必胜一定是先取这些数 // Auth
POI2005 KOS-Dicing
摘要:网络流 #二分 #POI #Year2005 考虑二分答案,用 来 具体来说,就是对每一个人限制流量,然后检查能不能把所有场全部流满 #include <bits/stdc++.h> using namespace std; #define int long
POI1999原始生物
摘要:欧拉路径 #数学 #POI #Year1999 考虑转化题面,在 建边,得到一个图 原题意等价于求在这个图中至少加多少条边使得图中有一条欧拉路径(经过所有边的路径) \[res=\sum \limits_{u\in G}max(indegree_u,outdeg
Poi2002滑雪者命名
摘要:网络流 #有源汇上下界费用流 #最小点覆盖 #Year2002 #POI 最小点覆盖问题 这里可以直接有源汇上下界费用流 // Author: xiaruize #ifndef ONLINE_JUDGE #define debug(x) cerr << "On Line:" << __LINE__
POI2005 KOS-Dicing
摘要:网络流 #二分 考虑二分答案,用 来 具体来说,就是对每一个人限制流量,然后检查能不能把所有场全部流满 #include <bits/stdc++.h> using namespace std; #define int long long #define ul
POI1999原始生物
摘要:欧拉路径 #数学 考虑转化题面,在 建边,得到一个图 原题意等价于求在这个图中至少加多少条边使得图中有一条欧拉路径(经过所有边的路径) \[res=\sum \limits_{u\in G}max(indegree_u,outdegree_u)+\text{原图
Poi2002滑雪者命名
摘要:网络流 #有源汇上下界费用流 #最小点覆盖 最小点覆盖问题 这里可以直接有源汇上下界费用流 // Author: xiaruize #ifndef ONLINE_JUDGE #define debug(x) cerr << "On Line:" << __LINE__ << #x << "=" <<
P4678
摘要:dp #概率期望 表示在不使用 的情况下,达到有 个石头, 个剪刀, 个布的情况的概率 转移可以做背包,每次加入一个 对于每个可能得状态,统计所有可能的下一步的每一个方案的期望,然后取最大值 // Author: xiar
P4138
摘要:差分约束 难度在读入 对于每一个限制,转化为两个不等式,用差分约束 每次询问相当于添加一个限制,问是否仍然存在合法的差分约束的解,直接重新跑差分约束即可 // Author: xiaruize #ifndef ONLINE_JUDGE bool start_of_memory_use; #endif
P4137
摘要:dp #数学 #计数dp #组合 从大到小考虑将每个数加入当前的序列 表示 全部加入后, 的方案数 对于一个新的数,有 个,枚举这个数加入的时候分为几段 ,再枚举其中有多少段 加在一个
P4129
摘要:贪心 #状压 一定优先选择当前的距离最远的两个点中的一个 proof 如果后取这两个,取到这两个点的时候的代价仍然为这个值,不会更优,、 但是对于中间的部分,代价只会不变或者更劣,所以优先选择这两个点中的一个是正确的 证毕 然后直接对当前选择节点状压,最多 种状态,但是其
P4113
摘要:Nim游戏 建树,考虑公平组合游戏 对于一个点 ,枚举它及它的子树,计算所有的后继状态,具体来说每个后继状态都是在这个子树中删除一条链,然后将分开的每一个子树的 异或起来,这个值为这个子状态的 值 然后 特判最上
POI2005 KOS-Dicing
摘要:网络流 #二分 考虑二分答案,用 来 具体来说,就是对每一个人限制流量,然后检查能不能把所有场全部流满 #include <bits/stdc++.h> using namespace std; #define int long long #define ul
POI1999原始生物
摘要:欧拉路径 #数学 考虑转化题面,在 建边,得到一个图 原题意等价于求在这个图中至少加多少条边使得图中有一条欧拉路径(经过所有边的路径) \[res=\sum \limits_{u\in G}max(indegree_u,outdegree_u)+\text{原图
Poi2002滑雪者命名
摘要:网络流 #有源汇上下界费用流 #最小点覆盖 最小点覆盖问题 这里可以直接有源汇上下界费用流 // Author: xiaruize #ifndef ONLINE_JUDGE #define debug(x) cerr << "On Line:" << __LINE__ << #x << "=" <<
WolfInZooDivOne
摘要:dp #预处理 表示第 个选择, 前面的第一个为 的方案数 预处理不合法的区间,暴力转移 // Author: xiaruize #ifndef ONLINE_JUDGE bool start_of_memory_use; #endif #
P4121
摘要:二进制枚举每一个数是给它右侧的还是接收它右侧的,贪心的选择整倍数的,时间复杂度 // Author: xiaruize #ifndef ONLINE_JUDGE bool start_of_memory_use; #endif #include <bits