考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正解: 上面的大题思路是正确的,但是记忆化搜索太慢,考虑倍增 $floyd.$令 $f[i][j]$ 表示 $i$ 号点花费 $j$ 能走的最远距离$.$令 $go[i][j][k]$ 表示 $i$ 号点走到 $j$ 号点走 $k$ 步的最远距离(在 $i$ 号点加一次油)$.$如果能求出 $g[i]…
n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<=n*n,ci<=1e5,现T<=1e5个询问:从Ai出发,带Yi<=n*n块钱走不少于Si<=1e9的路程,问最多剩多少钱. 方法一:其实就是问从某个点出发,走路程Si,问最少花费.F(i,j,k)--从i出发,剩下j的油,走路程k最小花费,决策一下在i要不要加油即可. 方法二:走路程…
哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走ci步的最长距离(一开始以为一条路耗油为路的长度T T), 这个是经典题, 倍增求就好了...然后就可以转移了呀T T 最后二分就好了呀T T... 我怎么这么菜啊, 还写了好久T T... 一开始还写成n^4logn TLE了半天没查到错 #include<iostream> #include&l…
[题意]给定正边权有向图,车油量上限C,每个点可以花费pi加油至min(C,ci),走一条边油-1,T次询问s点出发带钱q,旅行路程至少为d的最多剩余钱数. n<=100,m<=1000,C<=10^5,q<=n^2. [算法]动态规划 [题解]官方题解 虽然不是DAG,但是由于q很小的特点,将q加入状态就满足DP的无后效性了. 令f[i][q]表示当前在i点并在i点加油,加油前钱数为q的最大路程.(q<pi时,f[i][q]=0) 假设下一加油点为j,转移方程:f[i][q…
题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\)边内,故可对此设计 \(DP\). 由于 \(D\) 很大,不妨将其设为 \(DP\) 的价值,用的钱设置为容量. 所以我们只需要枚举那些需要加油的点,用最优性取跳即可. Step 1: 快速求出从 \(u\) 到 \(v\) 不超过 \(c[i]\) 条边的最大距离 设 \(g[u][v][k]…
description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那么对于每一个询问就可以二分答案\(O(logq)\)查询了 可以得出转移方程\(f[i][k]=\max(f[j][k-p[j]]+g[i][j],f[i][k])\),其中\(g[i][j]\)表示从在\(i\)点加满油后从\(i\)走到\(j\)能走过的最大路程 \(g\)可以使用倍增\(flo…
Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景区,道路是单向通行的.每条道路都有一个长度. 为了方便旅游,每个景点都有一个加油站.第 iii 个景点的加油站的费用为 pip_ip​i​​,加油量为 cic_ic​i​​.若汽车在第 iii 个景点加油,则需要花费 pip_ip​i​​ 元钱,之后车的油量将被加至油量上限与 cic_ic​i​​…
有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去的奶茶,若没有符合要求的奶茶则忽略此次操作.对每次操作需要在线询问:操作进行后,不在车上的奶茶的最小编号.m<=1e6,b<=2m,a<=m,数据组数T<=50. 方法一:nlogn暴力,什么树状数组优先队列尽管上.. 方法二:不在车上的最小编号,其实就是还没买的最小和丢下车的最小,还…
description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现在给出一段 DNA 序列,请帮他求出这段 DNA 序列中所有连续 \(k\)个碱基形成的碱基序列中,出现最多的一种的出现次数. \(n\le5*10^6,k\le 10\) solution 直接找出所有连续\(k\)个碱基形成的碱基序列的哈希值即可 code #include<bits/stdc+…
description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从\(0\)开始,无限长的整数列\({a_{i}}\),\(i \in N\) ,已知\(a_{0},a_{1}\) 的值,以及递推式\(a_{i+2}=ka_{i+1}+a_{i}\),\(i \in N\) ,\(k \in N^+\). sosusosu 研究了这些数列,发现它们十分优美充满人类智慧,于是决定出一道 OI 题. sos…
description 题面很长,这里给出题目链接 solution 用队列维护扔掉的红茶,同时若后扔出的红茶比先扔出的红茶编号更小,那么先扔出的红茶不可能成为答案,所以可以用单调队列维护 故每次询问的答案只可能是单调队列的队首或者没有出现过的红茶中编号最小的,后者可以\(O(b)\)暴力计算 code #include<bits/stdc++.h> using namespace std; namespace IO{ int c; unsigned int seed; unsigned in…
[题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列最后一项>10^7时退出. 2.可能第一要求项就比你枚举的大,需要特判. 3.要求项的枚举不能等于最大项,不然会无法正常指向最后一个. #include<cstdio> #include<cstring> #include<cctype> #include<cm…
题目传送门:LOJ #510. 题意简述: 给出一个在 \(K\) 进制下的树状数组,但是它的实现有问题. 形式化地说,令 \(\mathrm{lowbit}(x)\) 为在 \(K\) 进制下的 \(x\) 的最低非零位的值,例如 \(\mathrm{lowbit} \!\left( 230_{(5)} \right)\! = 30_{(5)}\). 则 add(x, v) 操作执行的是: 当 \(x \le n\) 时,执行 s[x] ^= v,并将 \(x\) 变为 \(x + \math…
题目描述 \(NOIP\)复赛之前\(HSD\)桑进行了一项研究,发现人某条染色体上的一段\(DNA\)序列中连续的\(k\)个碱基组成的碱基序列与做题的 \(AC\) 率有关!于是他想研究一下这种关系. 现在给出一段 \(DNA\) 序列,请帮他求出这段 \(DNA\) 序列中所有连续\(k\)个碱基形成的碱基序列中,出现最多的一种的出现次数. 输入格式 两行,第一行为一段 \(DNA\) 序列,保证 \(DNA\) 序列合法,即只含有 \(A, G, C, T\) 四种碱基: 第二行为一个正…
solutions 题面loj#542 对我来说,这或许已经超出了我的能力,我,只能看题解 不知道我写完这一篇题解之后,会不会对我的构造题有一点点的帮助 让我在这类题的解决上能过有一些提升 直接说明白,这就是一个构造题 这个很好判断,因为有SPJ,并且方案有很多,随便输出就可以 开头是K,结尾是K,长度也是K 总结一下,我们一定可以将这个序列划分成K个序列,如果你划分的更多的话,我完全可以将多出来的合并一下 并且,我们的起点和终点,一定是前K个和后K个可以被K整除的数, 如果不是,那肯定前面或者…
被以前自己瞎YY的东西坑了T T...单调队列的确是可以维护这种操作的.... 显然这题可以转化成维护不在车上的东西的最小值, 支持插入和删去最早出现的值,然后就可以用单调队列了T T #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long #define uint unsign…
题目啰嗦:支持三个操作: 不可重复集合:1.加入一个数 2.删除一个数 3.恢复目前最早的一次删除的数 操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数) 50组数据+1e6,必须O(N) 维护删除.恢复的数的操作可以队列维护. 数有没有在集合里可以全局bool数组记录 加入删除一个数,mex怎么维护? 考虑化简问题:只插入? 直接mex往上走到第一个没有出现的数即可.单增,O(N) 有删除? 如果删除小的一个数,mex要跳下来,然后再恢复这个删除的数,mex又得一步一步走上去…
[题意]一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作: 1.买进编号未在车上出现过的红茶. 2.丢掉车上指定编号的红茶. 3.将最早丢出去的红茶捡回来. 每次操作后求编号最小的不在车上的红茶. [算法]单调队列 [题解]本题最重要的性质在于早丢早捡. 因此,当进行丢掉编号为x的红茶这一操作时,如果编号>x的红茶早丢,那么也一定早捡,所以这些红茶没有贡献. 所以用单调队列维护所有有效的红茶,那么捡回来的时候判断是否队头,每次答案就是min(队头,maxs+1),m…
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远不会变为\(0\),也就是说最低位所在的位置是不变的,并且\(1\)到\(n\)会被分成若干条链,链上我们可以用线段树之类的搞一搞 然而如果\(k\)不是奇数的话事情就会变得比较辣手了--不过我们可以发现对于所有满足\(x=a\times 2^s\)的数,如果\(k=b\times 2^t\)且\(…
题意 一个带边权无向图,有两种操作:加边以及询问在\(x,x+b,...,x+(c-1)b\)这些数中,有多少个数存在至少一条与之模\(m\)同余的从\(u\)到\(v\)的路径(可以不是简单路径). 做法 奇数 考虑某一边\((u,v,w)\in E\),从\(u\)到\(v\),通过来回绕圈的方式,能形成\(2k+1\)的关于\(w\)系数,将其放在模意义考虑,通过调整\(m\)的系数,能产生\(w\)的任意整数系数: 故能贡献\((w,m)\)任意倍系数: 整个\(E\)能构成的贡献就为\…
「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的方案数. 枚举有多少个大于号被钦点了,\(F(0)=\sum_{i=0}^n G(i)(-1)^i\) . 对于一个只有小于号限制的序列的方案数就是每一个小于号链接的联通块里分配的数字顺序固定,块与块之间随便排,令 \(sz[i]\) 表示第 \(i\) 个联通块的大小,方案数也就是 $ \dfra…
二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱就好了 再随便用前缀和优化一下 O(N) */ #include <iostream> #include <cstdio> ; char Buf[BUF], *buf = Buf; inline long long max (long long a, long long b) { re…
LOJ 思路 发现既有大于又有小于比较难办,使用容斥,把大于改成任意减去小于的. 于是最后的串就长成这样:<<?<?<??<<<?<.我们把一段连续的<称作一条链.如果枚举大于号变成什么,那么最后的答案很容易算,就是\(\frac {n!}{\prod len!}\). \(dp_i\)表示前\(i\)个位置分成若干条链,带上容斥系数的方案数. \(dp_i\)从\(dp_j\)转移,即\([j+1,i]\)这些位置用<连接,并且需要满足\(s_…
麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然后判断:枚举完LCP,再往回做过去. 外面: 假如是一串0101010表示每个点有没有在独立集里,然后比较这个01串的字典序? 枚举LCP,LCP下一位:原来是0,这次就是1:原来是1,这次必须还是1.后面的随便选择.找方案数 但是这里是一般的字典序,两个1中间的0都会省略,使得大小比较没有那么容易…
下面给出部分分做法和满分做法 有一些奇妙的方法可以拿到同样多的分数,本蒟蒻只能介绍几种常见的做法 如果您想拿18分左右,需要了解:质因数分解 如果您想拿30分左右,需要了解:一种较快的筛法 如果您想拿70分左右,需要了解:莫比乌斯反演+杜教筛+整除分块+容斥 如果您想拿100分,需要了解:线性筛+杜教筛+莫比乌斯函数+狄利克雷卷积+推式子+微积分+整除分块 这时候如果您还想做这道题的话... 18分做法 首先N=1 时,就是求不超过 M的完全平方数有多少个,直接输出\(\lfloor \sqrt…
题目: 题解: 几何部分,先证明一下 \(KX = \sqrt{a},YL = \sqrt{b}\) 设左侧的圆心为 \(O\) ,连接 \(OK\) ,我们有 \(OK = r\). 然后有 \(r = \frac{a+1}{2},OX = r - a\) 勾股定理有 : \(KX^2 = OK^2 + OX^2\) 解得 : \(KX = \sqrt{a}\). 同理 : \(YL = \sqrt{b}\). 然后我们将 \(YL\) 向左平移直到 \(b\) 与 \(X\) 重合,设此时点…
题目: 题解: 我们考虑把每对花色相同的牌看作区间. 那么如果我们设 \(f_i\) 表示决策在 \([1,i]\) 内的最优答案. 那么有 \(f_i = max\{max\{(f_{j-1}+\sum_{k=j}^iv_k) | a_{j-1} = a_i\},f_{i-1}\}\) 我们可以记录每个点上一次出现的位置 \(la_i\). 那么每次我们更新的时候用 \(la\) 跳转即可. 然后我们发现每个数只能用和它相同的数的位置转移过来. 所以实际上这分成了若干的转移线. 然后我们发现在…
嘟嘟嘟 这题没卡带一个\(log\)的,那么就很水了. 然后我因为好长时间没写矩阵优化dp,就只敲了一个暴力分--看来复习还是很关键的啊. 这个函数显然是从后往前递推的,那么令第\(i\)位的分子分母为\(x', y'\),第\(i + 1\)的为\(x, y\),因为\(f(i) = a_i + \frac{1}{f(i + 1)} = \frac{a_i * f(i + 1) + 1}{f(i + 1)}\),所以\(x' = a_i * x + y, y' = x\). 这样我们把\(x,…
题目 先进行一个转化: 每次花费\(\gcd\limits_{i=l+1}^rB_i\)的代价,可以连\((l,r)\)这一条边. 然后我们需要求\(0\sim n\)的最小生成树. 根据Kruskal的思想,\((0,n)\)这条边一定会被选. 然后根据Prim的思想,对于某个点,我们需要找到其最短的出边. 而显然对于\(i\),它最短的出边为\((i,0)\)或者\((i,n)\).边权为\(L_i=\gcd\limits_{j=1}^iB_j\)和\(R_i=\gcd\limits_{j=…
题目 瞎猜一下我们只要\(n\)次询问就能确定出\(\{A_i\}\)来 感受一下大概是询问的区间越长代价就越小,比如询问\([l,n]\)或\([1,r]\)的代价肯定不会超过\([l,r]\) 所以大胆猜一下我们询问的只有一些前缀和后缀 首先我们肯定要询问一下\([1,n]\)的和,之后我们考虑顺次得到\(A_1\)到\(A_n\)的和 想得到\(A_1\),我们当然可以直接询问\([1,1]\),但是有\([1,n]\)的和我们询问\([2,n]\)的和也能得到\(A_1\) 同理我们想得…