【题解】Luogu P5470 [NOI2019]序列】的更多相关文章

原题传送门 同步赛上我一开始想了个看似正确却漏洞百出的贪心:按\(a_i+b_i\)的和从大向小贪心 随便想想发现是假的,然后就写了个28pts的暴力dp 杜神后半程说这题就是个贪心,但我没时间写了 (实际是没想明白) 我们来说这道题的正解: 我们先珂以满足和最大,再满足并集大小大于等于\(l\).所以我们先将\(a\)序列和\(b\)序列排序,取出两个序列的前\(k\)大 如果并集大小大于等于\(l\)就直接统计答案 否则我们要凑满\(l\)个都包含的,在凑的过程中动态更新答案 我们在两个序列…
LINK:序列 考虑前20分 容易想到爆搜. 考虑dp 容易设\(f_{i,j,k,l}\)表示前i个位置 选了j对 且此时A选择了k个 B选择了l个的最大值.期望得分28. code //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<ctime> #include<cctype> #include<queue> #include<deq…
题目 可以直接贪心,但是用模拟费用流推的话会更轻松. 首先有一个显然的建图方式: \(S\)到\(0\)流量为\(k\),费用为\(0\). \(0\)到\(a_i\)流量为\(1\),费用为\(-a_i\). \(a_i\)到\(b_i\)流量为\(1\),费用为\(0\). \(b_i\)到\(T\)流量为\(1\),费用为\(-b_i\). \(a_i\)到\(c\)流量为\(1\),费用为\(0\). \(c\)到\(d\)流量为\(k-l\),费用为\(0\). \(d\)到\(b_i…
洛谷题面传送门 好几天没写题解了,写篇题解意思一下(大雾 考虑反悔贪心,首先我们考虑取出 \(a,b\) 序列中最大的 \(k\) 个数,但这样并不一定满足交集 \(\ge L\) 的限制,因此我们需要调整,我们假设 \(L-\) \(a,b\) 序列中最大的 \(k\) 个数的交集为 \(L'\),如果 \(L'\le 0\) 那不用调整直接输出即可.否则我们考虑每次调整部分 \(a_i,b_i\) 的取值使得 \(a,b\) 的交集加 \(1\),不难发现每次调整可能有以下可能: 选择两个下…
[luogu P3648] [APIO2014]序列分割 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的序列——也就是一开始得到的整个序列): 2.选择一个位置,并通过这个位置将这个序列分割成连续的两个非空的新序列. 每次进行上述步骤之后,小H将会得到一定的分数.这个分数为两个新序列中元素和的乘积.小H…
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,...,S_{n-1},S_n,S_{n-1},...S_2,S_1 \}\). 现在给定一个长度为\(n\)的字符串\(S^{'}\)表示原字符串\(S\)经过若干次(可能为0)旋转之后的一个前缀, 求原来字符串可能的长度\(l\). 显然当\(l > n\)时一定可行,所以只需要输出所有的\(l\leq…
原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 操作2:把区间内所有数推平成1,珂朵莉树基本操作 操作3:把区间内所有数取反(异或1),split后扫描一遍,值域取反 操作4:区间和,珂朵莉树基本操作 操作5:区间最长连续的1,暴力扫描累加 就是这样简单 好像跑的比线段树还快???喵喵喵 #pragma GCC optimize("O3&quo…
原题传送门 题意:给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小平方和 观察样例说明,发现一个很有趣的性质,\(B\)中数字相同的一段的数字正好是\(A\)中这段数字的平均数 那我们就珂以猜想:最优解的形式一定为分成若干段,每一段的\(B_i\)即取其中\(A_i\)的平均数,同时保证\(B\)的有序性(这篇论文好像有证明) 如何求出最优的\(B\)?我们珂以使用单调…
原题传送门 先考虑部分分做法: subtask1: 暴力\(O(nm)\)枚举,跑最短路 subtask2: 吧一行的点压到vector中并排序,二分查找每一个弹跳装置珂以到达的城市,跑最短路 subtask3: 看见是一个链,自然而然的可以想到线段树优化建图,跑最短路 100pts 上面是72pts的暴力做法,其中subtask3的做法给了我们了一些提示,这题要用数据结构优化建图: 在横轴上开一颗线段树,线段树每个节点上是一个存pair的set,存的是\([l,r]\)区间内有第\(id\)个…
原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好不好 我们先考虑\(O(mt)\)的暴力dp,先不考虑总时间对烦躁值的影响,设\(dp[id]\)表示走完第\(id\)条边最小的代价: \[dp[id]=Min(dp[j]+A(p_{id}-q_j)^2+B(p_{id}-q_j)+C)(id,j \in [1,m],q_j<=p_{id},v[…
不用FFT的多项式(大雾) 题目链接: https://www.luogu.org/problemnew/show/P5469 (这题在洛谷都成绿题了海星) 题解: 首先我们考虑,一个序列位置最右边的最大值可以走遍整个序列,并且其余任何点都不能跨过这个位置. 所以我们可以区间dp, \(dp[l][r][x]\)表示区间\([l,r]\)最大值不超过\(x\)的方案数,枚举最大值点\(mid\)及其值\(k\), \(dp[l][r][x]=\sum_{mid}\sum_{k}dp[l][mid…
看还没有人发记搜的题解,赶紧来水发一篇 我们定义dp[i][j]为区间i~j内最少添加几个括号才能把这个串变成正规括号序列. 考虑四种情况 i>j不存在这种子串,返回0 i==j子串长度为1无论是"[","]","(",")"都是要消耗1的,返回1 s=(s')或s=[s']那么返回的是DP(i+1,j-1) 其他情况,枚举断点,详见代码 至于输出嘛.....不会,看紫书的,输出代码的解释看看楼上吧,这里就不详细解释了…
最长上升序列2 - LIS2 Description 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. Input 输入一行二个整数 N , K ( K ≤ N ≤ 15) . Output 输出一行一个整数,描述合法的排列个数. Sample Input 15 8 Sample Output 37558353900 解析 这题...额...还是得打记搜. 首先,让我们回顾一下求最长上升序列的二分的方法吧(神犇可自动跳过当然神犇可能不需要看本蒟蒻的题解) 我们维护一个…
题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- 设\(dp[i]\)表示最后一步是坐\(i\)这辆车,一共花在等待上的烦躁值(不包括最终时间)为\(f[i]\). 然后容易发现这个转移是个DAG.(我在考场上居然以为有环,于是直接放弃--) 转移方程\(dp[i]=\min_{j|y[j]=x[i]}dp[j]+A(x_i-x_j)^2+B(x_…
关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可以通过改变顺序使这一次移动合法 证明: 考虑到达位置上的那个棋子, 如果它没有到达最终位置, 则我们考虑将该棋子移至下一步, 如果下一步还有没有到达最终位置的棋子, 则也移动它 否则直接调换这两个棋子的移动顺序即可 好的我们去除了题目中的要求: 「移动过程中不能出现多颗棋子同时在某一格的情况」, 接…
Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和.一个连续子序列的和为该子序列中所有数之和.每个连续子序列的最小长度为1,并且两个连续子序列之间至少间隔一个数. Input 第一行是一个整数表示n. 第二行是n个整数表示整数序列. Output 一个数,两个连续子序列的序列和之和. Range 对于30%的数据N<=100. 对于60%的数据有N<=10000. 对于100%的数据有N<=100000…
传送门 这个什么鬼证明直接看uoj的题解吧根本不会证明 首先方案一定是若干段等值的\(B\),然后对于一段,\(B\)的值应该是\(A\)的平均值.这个最优方案是可以线性构造的,也就是维护以区间平均值为权值的单调栈,每次在后面插入一个元素,不断弹栈并与最后一个合并,直到平均值单调递增 然后这个单调栈是可以两个区间的单调栈直接合并的,因为合并完后新单调栈的断点集合是原来两段的断点集合的子集.合并直接暴力就好了合并的话一定是前面那个的一段后缀的后面的一段前缀合并,然后后面的前缀位置(就是合并区间的右…
本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优化)来做,计数操作改装进去,ans[1]=1;迪杰斯特拉更新边长的时候如果大于号(具体见代码)就覆盖,相等的话就加上 4.%楼上SPFA,BFS大佬 具体见代码,其实就是在迪杰斯特拉里面填了几笔(逃 代码巨丑(捂脸) #include<cstdio> #include<cstring>…
BZOJ 3992 点开这道题之后才发现我对原根的理解大概只停留在$998244353$的原根是$3$…… 关于原根: 点我 首先写出$dp$方程,设$f_{i, j}$表示序列长度为$i$当前所有数乘积模$m$为$j$的方案数,有转移 $$f_{i, x * y \mod m} = \sum_{y \in s} f_{i - 1, x}$$ 把$x$和$y$取个对数就可以变成卷积的形式了. 然而在模意义下,我们可以用原根的$k$次方来代替原来的数,这样子就达到了取对数的效果. 注意到每一次转移…
看到这个题,小金羊第一秒的反应就是: 优先队列可解! 看到楼上某同学一个个比较, find()函数是时候现身了! string//类型库 //find具体用法可以自行百度 //这里仅说这里的用法(逃) 原型: public size_type basic_string::find(const basic_string&str,size_type __pos = 0)const noexcept; /* 返回一个定位器:pos(unsigned int pos) 或返回npos(unsigned…
P1963 变换序列 题目描述 对于N个整数0,1,-,N-1,一个变换序列T可以将i变成Ti,其中:Ti∈{0,1,-,N-1}且 {Ti}={0,1,-,N-1}. x,y∈{0,1,-,N-1},定义x和y之间的距离D(x,y)=min{|x-y|,N-|x-y|}.给定每个i和Ti之间的距离D(i,Ti),你需要求出一个满足要求的变换序列T.如果有多个满足条件的序列,输出其中字典序最小的一个. 说明:对于两个变换序列S和T,如果存在p<N,满足:对于i=0,1,-,p-1,Si=Ti且S…
Luogu P1631 题意很好懂,不作分析 很容易想出一个解法是求出每一个和,排序后取前n个. 当然这种做法妥妥的会MLE+TLE 我们会发现实质上这种做法的缺点在于存入了大量不需要的数据. 那么该怎么进行优化呢? 观察题目,易得下列关系 a[1]+b[1]<=a[2]+b[1]<=...<=a[n]+b[1] a[1]+b[2]<=a[2]+b[2]<=...<=a[n]+b[2] a[1]+b[3]<=a[2]+b[3]<=...<=a[n]+b…
题目描述 kkk制造了一个序列,这个序列里的数全是由正整数构成的.你别认为她的数列很神奇--其实就是1, 2, -, n而已.当然,n是给定的.kkk的同学lzn认为0是一个好数字(看上去很饱满有木有),所以他机智的趁kkk不在把这个序列全变成了0(其实只是准备窝)~ 可是kkk突然回来了!于是lzn的计划破灭了.但是他并不甘心,就和kkk说:我可以每次从这个序列中选取一些数,然后一起减去一个相同的数(当然也是正整数).然后经过有(wu)限(qiong)次这样的操作后,这个序列就可以全变成0.…
感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT$ 明显是求它的前驱与后继(可能有相同的),所以就用平衡树,但是又要求两个相邻的数的差,就可以有再开一个平衡树存放差值 实现:抛开奇奇怪怪的的题面,主要考虑这三个操作: 1.$INSERT$ $i$ $k$: 这个很简单,用链表就行了(数组模拟的),但是要注意,插入的时候,要接着上一个在这插入的,还…
题意: 有两个长度为n的序列,要求从每个序列中选k个,并且满足至少有l个位置都被选,问总和最大是多少. \(1\leq l\leq k\leq n\leq 2*10^5\). 首先,记录当前考虑到的位置i,第一个选的数量a, 第二个选的数量b,都被选的数量c,可以做到\(O(n^4)\), 卡常后能过\(n\leq 150\),有40分. 考虑正解:首先,看到这个范围,可以认为正解一定是贪心. 先看下\(n\leq 2000\),这个是网络流的范围.我们可以先建出费用流,然后再变为模拟费用流,即…
luogu 因为是一个点向矩形区域连边,所以可以二维数据结构优化连边,但是会MLE.关于维护矩形的数据结构还有\(KD-Tree\),所以考虑\(KDT\)优化连边,空间复杂度\(m\sqrt n\),无法通过 进一步的,一条题目中的边会对若干\(KDT\)上的点连边,然后这些点的子树被此点更新.考虑\(dijkstra\)的过程,每次拿出\(dis\)最小的点,并更新其他点,并且可以发现如果其他点被当前最小的\(dis_x+w_i\)更新到就不能再被更新了,那么我们可以每次取出最小的\(dis…
括号序列题目连接 这是一道与dp毫无半点关系的题 本来是去找的题来着,结果并没有找到,然后看到了这道题. (本来以为会是很好写的一道题结果因为题意不清直接原地去世了) 思路很简单,基本没有技术含量. 因为数据范围很小,我们可以直接进行暴搜: 定义bool 数组add表示第i个字符所对应的括号有没有被匹配,如果没有匹配需手动补全: 从左往右扫描,如果扫描到']'or')',从当前位置开始向左扫描,寻找配对括号,如果找到,将左右括号的add都置为1,break: 然后这么找大概就可以ac了叭? #i…
讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 代码(20pts): #include <bits/stdc++.h> using namespace std; char c[100001][1001]; bool pd(int x, int y) { int l1 = strlen(c[x]), l2 = strlen(c[y]); if(…
分治FFT的板子为什么要求逆呢 传送门 这个想法有点\(cdq\)啊,就是考虑分治,在算一段区间的时候,我们把他分成两个一样的区间,然后先做左区间的,算完过后把左区间和\(g\)卷积一下,这样就可以算出左区间里的\(f\)对右边的贡献,然后再算右边的就好了. 手玩一组样例吧:g=[0,3,1,2](默认\(g[0] = 0\)) 一开始,只有f[0]=1 f: [1 0|0 0] 然后我们从中间分开来,先算左边的 f: [1|0|0 0] 然后在分下去我们会找到\(f[0]\),就拿这一段和\(…
前言 其实这道题的关键就是在于预处理,其方法类似于 合唱队形 正文 求最大子段和 要想求出双子序列最大和,首先我们要会求出最大子段和 最大子段和的求值方法很简单 定义 \(f_i\) 为以第 \(i\) 个数结尾的最大子段和 #include <bits/stdc++.h> using namespace std; int f[1000010],a[1000010]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++)cin>…