题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的树的部分可以 DP 或者贪心,贪心就是只在分叉处断边. 对于每个环,先做出 f[ i ][ 0/1 ] 表示环上这个点 不向下 / 向下 延伸链的代价,然后在环上 DP . 方法就是先指定 tot -> 1 的边不选, DP 一番,再制定 tot -> 1 的边选, DP 一番. 如果指定 tot…
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少有一个棋子,也至少有一个空位. 游戏的目标是:在还没有放棋子的格子上依次放棋子,并填满整个棋盘.在某个格子上放置棋子必须满足以下条件之一: 这个格子的上下一格都放有棋子: 这个格子的左右一格都放有棋子. JOI 君想知道有多少种从初始状态开始,并达到游戏目标的方案,这个答案可能会非常大.请你帮 JO…
题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可以分块! 考虑如果 l = 1 , r = n ,怎么知道最后的序列每个位置是什么. 可以这样:把所有操作的数字都放进小根堆里,依次遍历每个位置,如果堆顶比该位置的值小,就把该位置的值换成堆顶的值,堆里删掉原堆顶,加入该位置原来的值. 分块的话,每个块开两个大根堆,一个 yq 维护原序列的数字,一个…
题意 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少有一个棋子,也至少有一个空位. 游戏的目标是:在还没有放棋子的格子上依次放棋子,并填满整个棋盘.在某个格子上放置棋子必须满足以下条件之一: 这个格子的上下一格都放有棋子: 这个格子的左右一格都放有棋子. JOI 君想知道有多少种从初始状态开始,并达到游戏目标的方案,这个答案可能会非常大.请你帮 JOI 君算出这个答案,并对 \(10^9+7\) 取模. 数…
参考博文 (不过个人感觉我讲的稍微更清楚一点) 题目就是让我们求图中满足数值大于等于B的连通块数量 然后我们可以尝试转换为求连通块两端所产生的“谷”的数量,显然一个连通块对谷可以贡献2的答案,最终答案就是谷的数量除以2 (下图为查询$B_i$大小为4时的情况,每一个箭头代表一个谷) 发现每两个数中间的空格都是有可能产生谷的,所以我们只需要维护有多少个空格满足产生谷的条件即可 记一个空格左边的数字为X,右边的数字为Y,当前询问为B,观察发现,当且仅当满足下列条件时,这个空格可以成为谷 $$min(…
用 LCT 维护颜色相同连通块,然后在线段树上查一下逆序对个数就可以了. code: #include <cstdio> #include <algorithm> #include <cstring> #include <string> #define N 100005 #define ll long long using namespace std; namespace IO { void setIO(string s) { string in=s+&qu…
题目传送门 题目大意 给出一个\(n\)个点\(n\)条边的图,每个点有且仅有一个出边,改变每条边都会有对应的花费.求最小的花费使得整个图强连通. 思路 很显然,最后的图就是一个环.那我们要求的答案实际上就是链的最大权值之和. 我们再次将问题转换,发现就是每个点只保留一条边,而保留的边就是连向它的边权最大的边.但是我们发现这实际上还有问题,因为这样仍可以构成一个环,那我们就选环上一个点断开再选一条不在环上且边权最大的边即可. \(\texttt{Code}\) #include <bits/st…
「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分开两边来计算,然后再排列一下. 所以目前要处理的是一段 第二行都没有棋子的棋盘的方案数. 对于该段棋盘: 定义\(dp[i][j][2]\)为前\(i\)列,当前列的第二行是第\(j\)个放置的,\(0/1\)表示是否为通过行的方式放置. 这里为了避免重复和方便,若可以通过列的方式放置,就不通过行的…
loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有火的人应该是选前面一个或后面一个没火的人,去和他相遇,所有任意时刻点过火的人都是连续的区间\([L,R](L\le k \le R)\) 现在要做的是推出\([1,n]\)是否可以被全部点火.一个区间\([L,R]\)能被点火,至少要满足的条件为\(x_R-x_L\le 2tv(R-L)\),即这两…
https://loj.ac/problem/2736 题解 挺有意思的题. 考虑这种操作不好直接维护,还有时限比较长,所以考虑分块. 考虑一个操作对整个块的影响,无非就是可能把最大的拿走,再把新的元素插进去. 对于散块我们可以重构,那么对于整块我们也可以快速查询. 现在的问题就是对于一个整块,我们打上了一堆标记,现在如何快速下放标记. 考虑到我们只需要知道最终的结果是什么,我们可以开一个小根堆存所有的标记,然后从左到右模拟就行了. 代码 #include<bits/stdc++.h> #de…
loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面推.我们把女性设为+1,男性设为-1,然后从队伍末尾开始开始计算后缀和.一但后缀和到了-2,就说明到了两个男的商量谁去女厕的地步.所以说只要保证后缀和一直大于等于-1,那么这个就一定可以在N分钟内解决(请读者自行证明,利用数学归纳法) F>=M-1,M<=F+1S=F+M>=2M-1<…
题目大意:有一个$n\times m$的网格图,若一个人的同一行或同一列有人,他就必须面向那个人,若都无人,就可以任意一个方向.若一个人无法确定方向,则方案不合法,问不同的方案数.$n,m\leqslant3000$ 题解:令$f_{n,m}$表示$n\times m$的网格图的答案.$f_{0,i}=f_{i,0}=1$,考虑在原来基础上加一列 1. 这一列是空的.$f_{n,m}+=f_{n,m-1}$2. 这一列放一个人,且他所在的一行无人,那么他可以放在这一列的任意一个位置,并且可以向$…
有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选了它旁边的就把它取消掉 也是一个打tag的思想 说起来不是很好描述 看代码可能会更好理解(? //Love and Freedom. #include<cstdio> #include<algorithm> #include<cstring> #include<cma…
分析 预处理每个点的前根号小的距离 对于每次询问删除点小于根号则已经处理好 否则直接暴力dp即可 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define mp make_pair ; ],vis[]; priority_queue<pair<]; pair<][b+]; vector<]; int main(){ int i,j,k; scanf…
分析 https://yhx-12243.github.io/OI-transit/records/uoj356%3Bloj2391%3Bac2534.html 代码 #include<bits/stdc++.h> using namespace std; ; vector<]; ][],a[],b[],bel[],],n,m,vis[]; inline int sf(int wh,int x){return fa[wh][x]==x?x:fa[wh][x]=sf(wh,fa[wh][x…
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. 可是-- 可是如果 Stalin 把自己当作炸弹扔到地堡花园里来了呢? 怀揣着这份小小的希望,元首 Adolf 独自走进了花园.终有一天会重逢的吧,Stalin.或许是在此处,或许是在遥远的彼方. 无论如何,在此之前,好好装点一番花园,编排一段优美的舞步吧! 元首把花园分为 \(n\) 行 \(m\…
layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathjax: true - kuangbin - 动态规划 - 斜率DP 传送门 A.HDU - 3507 Print Article 题意 就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 题解 概率DP的入门题,把我搞得要死要活的. 首先dp[i]表示输出前i…
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathjax: true - kuangbin - 动态规划 传送门 A.HDU1024 Max Sum Plus Plus 题意 给你N个数,然后你分成M个不重叠部分,并且这M个不重叠部分的和最大. 思路 动态规划最大m字段和,dp数组,dp[i][j]表示以a[j]结尾的,i个字段的最大和 两种情况:1.第a[j…
#6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最大化两个 DNA 序列的相似程度,具体步骤如下: 给出两个 DNA 序列,第一个长度为 nnn,第二个长度为 mmm. 在两个序列的任意位置插入任意多的空格,使得两个字符串长度相同. 逐位进行匹配,如果两个序列相同位置上的字符都不是空格,假设第一个是 xxx,第二个是 yyy,那么他们的相似程度由 …
「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一段),并且每段至少有一个元素,使得和最大的那一段最小. 请你求出这个最小值. 输入格式 第一行两个整数 n,K n, Kn,K,意义见题目描述.接下来一行 n nn 个整数表示序列 Ai A_iA​i​​. 输出格式 仅一行一个整数表示答案. 样例 样例输入 9 4 1 1 1 3 2 2 1 3…
题目:https://loj.ac/problem/2292 直接 DP 很难做,主要是有那种 “一个区间内部有很多个别的区间” 的情况. 自己想了一番枚举 max-min 的最大限制,然后在该基础上最小化区间个数之类的.还是不会. 看了题解才会. 考虑再设一个 dp 数组来辅助表示那种麻烦的情况. 值可以离散化!又因为代价与值有关,可以考虑把值放进角标里. 令 f[ i ][ j ] 表示把 [ i , j ] 全取完的最小代价,g[ i ][ j ][ l ][ r ] 表示把 [ i ,…
题目:https://loj.ac/problem/2291 想了线段树合并的做法.就是用线段树维护 trie 的每个点在各种时间的操作. 然后线段树合并一番,线段树维护前缀最大值,就是维护最大子段和的套路,记录区间和.前缀 max .查询的时候,因为当前区间只记录了自己区间内部的前缀 max 值,所以要加一个 pr 表示该区间前面的区间和. 空间可能爆? RE 就没管.后来发现是 go[ ][ ] 开成 N 而非 M 了.这个做法还是可过的. 注意强制在线的 ans 是带绝对值的.注意 mx…
题目地址 https://loj.ac/problem/2343 题解 首先处理出\(f[i]\)表示以当前位置开头(J,O,I)的合法方案数.这个显然可以\(O(n)\)处理出来.然后考虑在每个位置插入三种数. 在位置i插入J:显然对于i后面的所有\(f[j](i<j,s[j]=O)\)有多一个转移点,对\(f[j]\)做个后缀和即可. 在位置i插入O:对于i前面的J,和i后面的I,显然都多一个中转点,于是对J做前缀和,I做后缀和,枚举插入位置i,左右两边相乘取\(\max\)即可. 在位置i…
loj 看着就很区间dp,所以考虑求\(f_{i,j}\)表示区间\([i,j]\)的答案.注意到贡献答案的方式是每次选一个连续段,拿走后剩下的段拼起来继续段,所以转移就考虑从最后一次选的方法转移过来,那么最后一次选的是原序列的一个连续段中挖掉一些小连续段的一些段.设辅助状态\(g_{i,j,p,q}\)表示区间\([i,j]\)要选出一个连续段,其中最小值为\(p\),最大值为\(q\)的最小代价,转移可以在左右两边接上一个\(f_{i,j}\)(这一段不在最终段中),或者接上一个在段内的元素…
LOJ 题面传送门 人傻常数大,需要狠命卡--/wq/wq 画个图可以发现两条路径相交无非以下两种情况(其中红色部分为两路径的重叠部分,粉色.绿色的部分分别表示两条路径): 考虑如何计算它们的贡献,对于第一种情况,我们枚举两条路径 LCA 中深度较大者,也就是上图中的 A 点.枚举这个点 \(x\) 以后进而枚举对应的路径,设其为 \(u\to x\to v\),那么我们考虑二分重叠部分的长度 \(len\),那么这个重叠部分要么是 \(u\) 的 \(dep_u-dep_x-len\) 级祖先…
传送门 g[i][j][k][l]g[i][j][k][l]g[i][j][k][l]表示将区间l,rl,rl,r变成最小值等于kkk,最大值等于lll时的花费的最优值. f[i][j]f[i][j]f[i][j]表示取掉区间l,rl,rl,r的最优值. 考虑ggg数组的转移. g[i][j+1][min(k,w[j+1])][max(l,w[i+1])]=min(g[i][j+1][min(k,w[j+1])][max(l,w[i+1])],g[i][j][k][l])g[i][j+1][mi…
题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没有匹配. 转移时注意一个车站可以有多个左括号和右括号,如果选多个类似无限背包顺着倒着递推一遍即可. 复杂度 \(O(n^2)\) 代码 代码链接…
题意 给你一个 \(n\) 个 \(\rm 01\) 组成的环,每次操作之后每个位置为1当且仅当他的左右恰好有1个1.输出进行 \(T\) 次操作之后的环. \(n\leq 10^5, T\leq 10^{15}\). 分析 通过1~4步之内模拟可以得到结论:一个位置能够在 \(2^k\) 的操作之后为1当且仅当他的往左往右的 \(2^k\) 个位置的异或值为1. 将数字拆成若干个 \(2^k\) 进行操作即可. 总时间复杂度为 \(O(nlogT)\). 代码 #include<bits/st…
题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一个定点,然后把其它所有点按到这个定点的极角排序,那么就可以\(O(n^2)\)得出答案了 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define inline __inline__ __a…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个生日蛋糕.虽然他计划买一整个蛋糕,但是他不小心订成了 N 块蛋糕.这 N 块蛋糕编号为 1\ldots N ,每块蛋糕都有价值和颜色.第 i 块蛋糕的价值为 V_i ,颜色深度为 C_i . 为了做成一整块蛋糕,他决定选择 M 块互不相同的蛋糕,然后将它们按一定顺序排成一个环.整块蛋糕的美观程度定义…