solutions 题面loj#542 对我来说,这或许已经超出了我的能力,我,只能看题解 不知道我写完这一篇题解之后,会不会对我的构造题有一点点的帮助 让我在这类题的解决上能过有一些提升 直接说明白,这就是一个构造题 这个很好判断,因为有SPJ,并且方案有很多,随便输出就可以 开头是K,结尾是K,长度也是K 总结一下,我们一定可以将这个序列划分成K个序列,如果你划分的更多的话,我完全可以将多出来的合并一下 并且,我们的起点和终点,一定是前K个和后K个可以被K整除的数, 如果不是,那肯定前面或者…
题目描述 \(NOIP\)复赛之前\(HSD\)桑进行了一项研究,发现人某条染色体上的一段\(DNA\)序列中连续的\(k\)个碱基组成的碱基序列与做题的 \(AC\) 率有关!于是他想研究一下这种关系. 现在给出一段 \(DNA\) 序列,请帮他求出这段 \(DNA\) 序列中所有连续\(k\)个碱基形成的碱基序列中,出现最多的一种的出现次数. 输入格式 两行,第一行为一段 \(DNA\) 序列,保证 \(DNA\) 序列合法,即只含有 \(A, G, C, T\) 四种碱基: 第二行为一个正…
description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现在给出一段 DNA 序列,请帮他求出这段 DNA 序列中所有连续 \(k\)个碱基形成的碱基序列中,出现最多的一种的出现次数. \(n\le5*10^6,k\le 10\) solution 直接找出所有连续\(k\)个碱基形成的碱基序列的哈希值即可 code #include<bits/stdc+…
[题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列最后一项>10^7时退出. 2.可能第一要求项就比你枚举的大,需要特判. 3.要求项的枚举不能等于最大项,不然会无法正常指向最后一个. #include<cstdio> #include<cstring> #include<cctype> #include<cm…
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…
题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\)边内,故可对此设计 \(DP\). 由于 \(D\) 很大,不妨将其设为 \(DP\) 的价值,用的钱设置为容量. 所以我们只需要枚举那些需要加油的点,用最优性取跳即可. Step 1: 快速求出从 \(u\) 到 \(v\) 不超过 \(c[i]\) 条边的最大距离 设 \(g[u][v][k]…
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​​…
哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走ci步的最长距离(一开始以为一条路耗油为路的长度T T), 这个是经典题, 倍增求就好了...然后就可以转移了呀T T 最后二分就好了呀T T... 我怎么这么菜啊, 还写了好久T T... 一开始还写成n^4logn TLE了半天没查到错 #include<iostream> #include&l…
被以前自己瞎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又得一步一步走上去…
[题意]给定正边权有向图,车油量上限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…
[题意]一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作: 1.买进编号未在车上出现过的红茶. 2.丢掉车上指定编号的红茶. 3.将最早丢出去的红茶捡回来. 每次操作后求编号最小的不在车上的红茶. [算法]单调队列 [题解]本题最重要的性质在于早丢早捡. 因此,当进行丢掉编号为x的红茶这一操作时,如果编号>x的红茶早丢,那么也一定早捡,所以这些红茶没有贡献. 所以用单调队列维护所有有效的红茶,那么捡回来的时候判断是否队头,每次答案就是min(队头,maxs+1),m…
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要不要加油即可. 方法二:走路程…
有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去的奶茶,若没有符合要求的奶茶则忽略此次操作.对每次操作需要在线询问:操作进行后,不在车上的奶茶的最小编号.m<=1e6,b<=2m,a<=m,数据组数T<=50. 方法一:nlogn暴力,什么树状数组优先队列尽管上.. 方法二:不在车上的最小编号,其实就是还没买的最小和丢下车的最小,还…
考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正解: 上面的大题思路是正确的,但是记忆化搜索太慢,考虑倍增 $floyd.$令 $f[i][j]$ 表示 $i$ 号点花费 $j$ 能走的最远距离$.$令 $go[i][j][k]$ 表示 $i$ 号点走到 $j$ 号点走 $k$ 步的最远距离(在 $i$ 号点加一次油)$.$如果能求出 $g[i]…
description 题面很长,这里给出题目链接 solution 用队列维护扔掉的红茶,同时若后扔出的红茶比先扔出的红茶编号更小,那么先扔出的红茶不可能成为答案,所以可以用单调队列维护 故每次询问的答案只可能是单调队列的队首或者没有出现过的红茶中编号最小的,后者可以\(O(b)\)暴力计算 code #include<bits/stdc++.h> using namespace std; namespace IO{ int c; unsigned int seed; unsigned in…
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…
「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…
麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然后判断:枚举完LCP,再往回做过去. 外面: 假如是一串0101010表示每个点有没有在独立集里,然后比较这个01串的字典序? 枚举LCP,LCP下一位:原来是0,这次就是1:原来是1,这次必须还是1.后面的随便选择.找方案数 但是这里是一般的字典序,两个1中间的0都会省略,使得大小比较没有那么容易…