【洛谷P1963】变换序列】的更多相关文章

洛谷 P1628 合并序列 题目传送门 题目描述 有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词. 输入格式 输入文件第一行包含一个正整数N: 接下来N行,每行一个单词,长度不超过100: 最后一行包含字符串T. [数据规模] 对于60%的数据,满足1≤N≤1000: 对于100%的数据,满足1≤N≤100000且所有字符均为小写字母; 输出格式 按字典序升序输出答案. 输入输出样例 输入 #1复制 输出 #1复制 题解: 这道题有多种方法: 字典树(Trie树).排序.二叉堆..…
洛谷题面传送门 u1s1 在我完成这篇题解之前,全网总共两篇题解,一篇使用的平衡树,一篇使用的就是这篇题解讲解的这个做法,但特判掉了一个点,把特判去掉在 BZOJ 上会 WA 一个点. 两篇题解都异常简略,前一篇题解甚至只有代码没有说明,所以这里我来写篇比较详细题解造福人类了(大雾 建议没做过这题的同学先看看这道题,看题解区第一个做法,对这题有比较大的启发. 注:下文中分别用 \(a,b,l,r\) 代替题面中的 \(X,Y,A,B\). 首先关于这题咱们可以想到一个非常 naive 的 DP,…
洛谷题面传送门 好几天没写题解了,写篇题解意思一下(大雾 考虑反悔贪心,首先我们考虑取出 \(a,b\) 序列中最大的 \(k\) 个数,但这样并不一定满足交集 \(\ge L\) 的限制,因此我们需要调整,我们假设 \(L-\) \(a,b\) 序列中最大的 \(k\) 个数的交集为 \(L'\),如果 \(L'\le 0\) 那不用调整直接输出即可.否则我们考虑每次调整部分 \(a_i,b_i\) 的取值使得 \(a,b\) 的交集加 \(1\),不难发现每次调整可能有以下可能: 选择两个下…
BZ链接 洛谷链接 这道题真是丧心病狂.... 应该很容易就可以看出做法,但是写代码写的....... 思路很简单,用一个平衡树维护一下所有的操作就好了,重点讲解一下代码的细节 首先如果按照常规写法的话,splay的节点要开到4000000, 直接炸飞, 由于任意时刻splay中的节点最多只有500000个,我们只需要开500000个节点就好了 然后将没有用的节点回收起来,下一次插入是插入到这些节点中 然后就是插入是将要插入的所有数字build成一颗平衡树,直接接在要插入的位置,这样会快很多 维…
题目大意:对于一个顺序序列,求一个合法置换,可以满足一些约束,若存在多个合法置换,则输出字典序最小的一个置换. 题解:对于序列的置换是否有解的问题,可以和二分图的完美匹配相关联.由于是字典序最小,显然需要贪心考虑.在匈牙利算法执行的过程中,对于每个点来说,可以优先匹配符合条件的最小的点:对于左边点集来说,可以从后往前进行匹配,这样可以保证字典序小的点更可能抢到字典序小的点. 代码如下 #include <bits/stdc++.h> #define pb push_back #define a…
这是一道二分图匹配的题 先%dalao博客 建图并没有什么难的,但是关键在于如何使字典序最小. 一个很显然的想法是先求出一个完美匹配,然后从x集合的第一个元素开始,如果该元素匹配的较小的一个,那么继续,如果是较小的一个,那么强制把它转换成较小的一个,然后在其之后,寻找增广路,如果能找到的话,就修改,如果没有,取消修改. 然而这样的时间复杂度比较高,我们可以采取一种比较高效的贪心. 倒着匹配 即从x集合的最后一个元素开始匹配,最后得到的就是字典序最小的. 那么为什么这样是对的呢? 我们可以发现,总…
传送门 我可能真的只会网络流……二分图的题一点都做不来…… 首先每个位置有两种取值,所以建一个二分图,只要有完美匹配就说明有解 考虑一下每一个位置,分别让它选择两种取值,如果都不能形成完美匹配,说明无解 然后考虑要让字典序最小.考虑一下匈牙利的过程,我们每一次如果遇到右边的点有匹配,我们都会让它把那个匹配给挤掉 那么我们考虑倒着做,这样的话每一次都必定是字典序小的挤掉字典序大的,可以保证最优 //minamoto #include<iostream> #include<cstdio>…
传送门 题意: 现有一个\(0\)到\(n-1\)的排列\(T\),定义距离\(D(x,y)=min\{|x-y|,N-|x-y|\}\). 现在给出\(D(i, T_i)\),输出字典序最小的符合条件的排列\(T\). 思路: 将问题转化为二分图匹配,左边的点表示位置,右边的点表示值. 那么现在就是要找一个使得最终字典序最小的排列. 从后往前逐一匹配即可. 主要考察对匈牙利算法的理解程度,前面位置小的肯定选择小的最后,但如果一开始给匹配了,后面的来进行匹配会直接强行插入,可能会使得答案不优.…
题目大意:给定一个长度为 N 的序列,有 M 个操作,支持将下标为 x 的倍数的数都加上 y,查询下标为 i 的元素的值. 题解:由于查询操作很少,相对的,修改操作很多.若直接模拟修改操作,即:枚举倍数,容易超时.现考虑记录下每次 x 位置的修改值,每次查询一个位置时,只需枚举这个位置的约数,将这个位置所有约数处的修改加入答案贡献即可. 代码如下 #include <bits/stdc++.h> #define fi first #define se second #define pb pus…
P1241 括号序列 题目描述 定义如下规则序列(字符串): 1.空序列是规则序列: 2.如果S是规则序列,那么(S)和[S]也是规则序列: 3.如果A和B都是规则序列,那么AB也是规则序列. 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()] 而以下几个则不是: (,[,],)(,()),([() 现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的那个序列是你给出的规则序列的子列.(对于序列a1,a2,……
题目大意:给定一个长度为 N 的序列,序列中的数两两不相同,每次可以交换序列中任意两个数,代价为这两个数的和,问将序列调整为升序,最少的代价是多少. 题解:考虑这个问题的一个子问题,这个序列为 N 的一个排列的时候,代价是多少.首先,对于许多交换操作来说,并不是所有操作都是有意义的.可以发现,序列可以被分成若干互不相交的环,在同一个环上的值进行交换才更有意义.第一种策略是对于同一个环上的点来说,可以用环上值最小的点来把其他点交换到对应的位置,这样的代价为\(\sum\limits_{i\in S…
P3648 [APIO2014]序列分割 题目描述 你正在玩一个关于长度为\(n\)的非负整数序列的游戏.这个游戏中你需要把序列分成\(k+1\)个非空的块.为了得到\(k+1\)块,你需要重复下面的操作\(k\)次: 选择一个有超过一个元素的块(初始时你只有一块,即整个序列) 选择两个相邻元素把这个块从中间分开,得到两个非空的块. 每次操作后你将获得那两个新产生的块的元素和的乘积的分数.你想要最大化最后的总得分. 输入输出格式 输入格式: 第一行包含两个整数\(n\)和\(k\).保证\(k…
P3152 正整数序列 题目描述 kkk制造了一个序列,这个序列里的数全是由正整数构成的.你别认为她的数列很神奇——其实就是1, 2, …, n而已.当然,n是给定的.kkk的同学lzn认为0是一个好数字(看上去很饱满有木有),所以他机智的趁kkk不在把这个序列全变成了0(其实只是准备窝)~ 可是kkk突然回来了!于是lzn的计划破灭了.但是他并不甘心,就和kkk说:我可以每次从这个序列中选取一些数,然后一起减去一个相同的数(当然也是正整数).然后经过有(wu)限(qiong)次这样的操作后,这…
P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: 第一行一个正整数N,表示询问次数: 接下来的N行每行一个正整数Ai,Ai表示在序列中的位置. 输出格式: N行,每行为0或l,表示序列第Ai位上的数字. 输入输出样例 输入样例#1: 复制 4 3 14 7 6 输出样例#1: 复制 0 0 1 0 说明 对于100%的数据有N≤1500000,Ai…
传送门 没想到这种多个状态转移的还能用上斜率优化……学到了…… 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得分是$ab+bc+ac$,而如果先切$bc$再切$ab$,得分也是$ab+bc+ac$,不难看出得分是一样的 那么我们可以考虑一下转移方程$$dp[a][i]=max\{dp[a-1][j]+sum[j]*(sum[i]-sum[j])\}$$ 其中$a$表示切几刀,$sum$表示前缀和 然后发现空…
题目大意:给你一个集合$n,m,x,S(S_i\in(0,m],m\leqslant 8000,m\in \rm{prime},n\leqslant10^9)$,求一个长度为$n$的序列$Q$,满足$Q_i\in S$,且$\prod\limits _{i=1}^nQ_i=x$,求序列的个数 题解:乘比较麻烦,可以把每个数求$\ln$,可以求出$m$的原根,求原根可以暴力$O(m^2)$求,然后每个数求$\ln$,求出生成函数$F(x)$,算出$F^n(x)$.发现$n$较大,多项式快速幂即可.…
P3152 正整数序列 题目描述 kkk制造了一个序列,这个序列里的数全是由正整数构成的.你别认为她的数列很神奇——其实就是1, 2, …, n而已.当然,n是给定的.kkk的同学lzn认为0是一个好数字(看上去很饱满有木有),所以他机智的趁kkk不在把这个序列全变成了0(其实只是准备窝)~ 可是kkk突然回来了!于是lzn的计划破灭了.但是他并不甘心,就和kkk说:我可以每次从这个序列中选取一些数,然后一起减去一个相同的数(当然也是正整数).然后经过有(wu)限(qiong)次这样的操作后,这…
P1732 [TJOI2011]序列 题目描述 一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中: 求\sum\limits^n_{i=1} b_ii=1∑n​bi​ 输入输出格式 输入格式: 第一行是一个正整数t,表示测试数据的组数.接下来有t行,每行表示一组测试数据.每行以一个正整数n开始,表示数列A中元素的个数:然后是n个非负整数,依次表示a1, a2, …, an的值. 0<t<=10 0<n<=100 000 0<…
P1716 双调序列 题目描述 电脑组的童鞋们经常玩一些智力PK小游戏,某月某日,发源于小朋友又发明了一种新的序列:双调序列,所谓的双调呢主要是满足如下条件描述: 假定有n(n<=1000)个整数(都在longint范围内,即-2147483648~2147483647),双调序列的第一个数是n个整数中的最大数,第二个数是n个整数中的最小数,第三个数是n个数中的第二大数,第四个数是n个数中的第二小数……取过的数不能再取,依次类推,直到结束. 聪明的你听完描述就抿嘴笑了吧?那就请你用程序正确的帮他…
P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: 第一行一个正整数N,表示询问次数: 接下来的N行每行一个正整数Ai,Ai表示在序列中的位置. 输出格式: N行,每行为0或l,表示序列第Ai位上的数字. 输入输出样例 输入样例#1: 复制 4 3 14 7 6 输出样例#1: 复制 0 0 1 0 说明 对于100%的数据有N≤1500000,Ai…
题意简述 维护一个序列,支持如下操作 把[a, b]区间内的所有数全变成0 把[a, b]区间内的所有数全变成1 把[a,b]区间内所有的0变成1,所有的1变成0 询问[a, b]区间内总共有多少个1 询问[a, b]区间内最多有多少个连续的1 题解思路 线段树 对于每个节点,维护对应区间 sum:1的个数 L0:连续0的最大长度 L1:连续1的最长长度 l0:包含区间左端点的连续0的最大长度 l1:包含区间左端点的连续1的最大长度 r0:包含区间右端点的连续0的最大长度 r1:包含区间右端点的…
题意简述 有一个长度为n的序列,分成k + 1非空的块, 选择两个相邻元素把这个块从中间分开,得到两个非空的块. 每次操作后你将获得那两个新产生的块的元素和的乘积的分数.求总得分最大值. 题解思路 f[p][i]=max(f[p−1][j]+sum[j]×(sum[i]−sum[j])) 可以用斜率优化 代码 #include <cstdio> using namespace std; typedef long long ll; int n, k, l, h, t; int q[110000]…
题目大意: Alice想要得到一个长度为\(n\)的序列,序列中的数都是不超过\(m\)的正整数,而且这\(n\)个数的和是\(p\)的倍数. Alice还希望,这\(n\)个数中,至少有一个数是质数. Alice想知道,有多少个序列满足她的要求. 对\(100\%\)的数据,\(1\leq n \leq 10^9,1\leq m \leq 2\times 10^7,1\leq p\leq 100\) 直接求不太好求,容斥一下,先求出全部的方案,再除掉没有质数的 全部的方案怎么求? 考虑\(dp…
嗯... 题目链接:https://www.luogu.org/problem/P1241 首先这道题是栈的入门题的加强版, 不仅要你判断这个括号序列是否合法,还要你将这个序列补充完整... 一开始是没有头绪的,看到tj之后恍然大悟... 思路: 我们假设所有的括号都是不合法的,即都没有匹配,然后我们从头扫一遍,对于左括号的处理比较简单: 把所有左括号的下标存入q这个手写栈,然后把所有左括号对应的右括号存入b数组中. 然后对于右括号的处理比较复杂: 如果先前的左括号都已匹配或者栈顶的左括号不与之…
题面传送门 这道题为什么我就没想出来呢/kk 对于每组询问 \([l,r]\),我们首先求出区间 \([l,r]\) 中最小值的位置 \(x\),这个可以用 ST 表实现 \(\mathcal O(n\log n)-\mathcal O(1)\) 维护,那么显然 \(\forall l'\in[l,x],r'\in[x,r],\min\limits_{t\in[l',r']}a_t=a_x\),产生的贡献为 \((r-x+1)(x-l+1)a_x\),于是我们只用计算 \([x+1,r],[l,…
\(\mathcal{Description}\)   Link.   给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作: 取 \([l,r]\),将其中所有 \(a\) 值 \(-1\): 取 \([l,r]\),将其中奇数下标的 \(a\) 值 \(-1\): 取 \([l,r]\),将其中偶数下标的 \(a\) 值 \(-1\).   求至少需要几次操作使得所有 \(a\) 值变为 \(0\).   \(n\le10^5\),数据组数 \(…
线段树 pushdown写的很浪~ #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define MAXN 100000+10 using namespace std; struct Node{ int L,R; int tag; ]; ],rcon[],mcon[]; Node(){ L=R=tag=; num[]=num[]=; lcon[]=rcon[]…
题意 题目链接 Sol 好像搞出了一个和题解不一样的做法(然而我考场上没写出来还是爆零0) 一个很显然的思路是考虑每个最小值的贡献. 预处理出每个数左边第一个比他小的数,右边第一个比他大的数. 那么\([L_i + 1, i]\)对\([i, R_i]\)中的每个数都会有\(a[i]\)的贡献. 我们可以抽象成一个二维平面内的矩形加. 询问就是询问最下角为\((l, l)\),右上角为\((r, r)\)的矩形内的权值 也就是我们需要解决这么一个问题:两个操作, 矩形加矩形求和,而且前者都在后者…
传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \(ans+=\sum_{i=l}^r \min\{a_i,a_{i+1} ,\dots ,a_r\}\). 那么这东西如何快速统计呢? 考虑使用前缀和. 首先,显然要用单调栈预处理每个点左边最靠右的第一个比它小的数的位置\(L_i\),和ST表处理出RMQ的位置. 预处理出对于每一个\(r\),\(…
题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long long #define Fin(x) freopen(#x".in", "r", stdin); #define Fout(x) freopen(#x".out", "w", stdout); #define fi first #…