求解策略
文章平均质量分 53
扩展的灰
扩展的灰(Extended Ash)
展开
-
Jzoj5408 Dark
LichKing 希望收集邪恶的黑暗力量,并依靠它称霸世界。世间的黑暗力量被描述成一个长度为N 的非负整数序列{Ai},每次它可以选择这个序列中的两个相邻的正整数,让他们的值同时减一并获得一点邪恶力量,直到不存在满足条件的数。然而你不希望他能够得逞,所以你会使得他收集的能量尽可能少。这个题目存在线性的dp,这里先说一种ΣAi的方法我们设f[i][j][0/1]表示现在正在做第i原创 2017-11-06 20:36:30 · 255 阅读 · 0 评论 -
Jzoj5407 Deep
失败的燃烧军团想要逃回深渊,Khadgar 想要追击它们。然而进入深渊的传送门只有一座,燃烧军团和Khadgar 各有一些法力水晶,由Khadgar 先手,双方每次可以作出如下选择:• 使用一个法力水晶,使得传送门的法力等级增加一。• 不用法力水晶,让对方增加等于传送门法力等级的深度,然后将传送门的法力值清零。特别地,若法力水晶数不为零且传送门法力等级为零则不能进行这样的操作。双方原创 2017-11-06 20:29:15 · 248 阅读 · 0 评论 -
Jzoj5409 Fantasy
Y sera 陷入了沉睡,幻境中它梦到一个长度为N 的序列{Ai}。对于这个序列的每一个子串,定义其幻境值为这个子串的和,现在Y sera 希望选择K 个不同的子串并使得这K 个子串的幻境值之和最大。然而由于梦境中的种种限制,这些子串的长度必须在L 到R 之间。你需要告诉她,最大的幻境值之和。对于100% 的数据,有1 此题做法比较神奇,也很好懂,但是很难搞清楚如何去构原创 2017-11-06 20:55:19 · 297 阅读 · 0 评论 -
Jzoj5418 合影
题目背景 热烈庆祝北京师范大学附属实验中学成立100周年!问题描述 经过一天的忙碌,志愿者们结束了他们的工作,准备站在一排合影留念。 现在总共有n名志愿者留下来准备合影。不过,进程并不是那么顺利,有些同学提出了一些奇奇怪怪的要求(每个人最多只会提出一个):他必须站在另外一个同学的左边(不一定相邻),仁慈的老师满足了他们的要求。这时,其中一位来原创 2017-11-07 07:52:09 · 345 阅读 · 0 评论 -
Jzoj4834 图书列表
这个题废话真多题面好长首先看懂题意大概就做完了,完全就是模拟嘛#include#include#includeusing namespace std;int l[100]={0},w[100]={0},r[100]={0};char s[100][100][200]={0};char c[200]={0}; int n,m=0;bool nc(char cc){ ret原创 2017-10-29 10:23:03 · 299 阅读 · 0 评论 -
Jzoj4790 选数问题
在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出R*C个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少采用二分+贪心策略我们将r*c个数排序,显然,最优情况每一行必然是序列中一段连续的数字二分可以接受的最大法值那么判定合法的段数有没有r段即可原创 2017-10-26 20:42:23 · 322 阅读 · 0 评论 -
Jzoj4788 序列
题意:给你a,b两个序列,每次可以在区间[l,r]对每个数加一,求最少的步数使a变成b注意,整个过程都是在mod 4的意义下的,a,b所有元素的值都在[0,3]之间我们可以先考虑不存在Mod 4 的情况我们假设di=max(0,bi-ai)那么显然,对于一个位置i,我们需要将其操作max(0,di)次考虑从1开始,我们设f[i]表示将1~i的d清零所需要的最小次数显然,f[原创 2017-10-26 19:53:41 · 357 阅读 · 0 评论 -
Jzoj4778 数列编辑器
我们发现前四个操作可以用双向链表维护,而最后一个操作有一个限制就是1#include#include#include#define N 1000010using namespace std;int l[N],r[N],s[N]; char c[5];int w[N],f[N]={-129},n=0,m,t,cnt=0;int main(){ freopen("editor.原创 2017-10-24 20:33:52 · 295 阅读 · 0 评论 -
Jzoj4776 排序
给你一个序列,问你能不能只交换2个元素使得它有序解法:扫一遍即可,如果可以,那么逆序对#includeint main(){ int n,a,b,num; scanf("%d%d",&n,&a); b=a; for(int i=2;iscanf("%d",&b); if(b<a) num++; b=a; } if(num1) puts("YES"); else p原创 2017-10-24 20:30:04 · 241 阅读 · 0 评论 -
Jzoj4764 Brothers
在遥远的西方有一个古老的王国,国王将他的王国分成了网格状,每一块称之为一个城市。在国王临死前,他将这些城市分给了自己的N个儿子(编号为0到N-1)。然而这N个王子的关系不是很好,0讨厌1,1讨厌2,2讨厌3……N-1讨厌0。在国王死后,这种不好的关系使得王子之间爆发了战争。战斗只会在相邻的两个城市之间爆发(共有一条边称之为相邻),并且只有当A讨厌B时,A才会对B发起战斗,结果必定是A获得这次战原创 2017-10-24 08:02:37 · 353 阅读 · 0 评论 -
Jzoj4747 被粉碎的线段树
额这个题么有一个很关键的点:结点个数依然为2N-1(证明可以看sam的讲稿)不难发现以下性质:区间定位个数+区间所覆盖的节点个数=2*区间长度所以问题变为,一个区间覆盖了多少个节点?我们可以求出所有的节点,然后这个问题就是一个二维偏序计数问题了具体用离线+按照r排序套上树状数组即可#include#includeusing namespace std;inline原创 2017-10-23 19:48:31 · 401 阅读 · 0 评论 -
Jzoj4787 数格子
题意:用1x2的骨牌填满4xN的格子的方案数设f[i][j]表示填到第i行,这一行的状态为j的方案数f[i][j]=Σf[i-1][k],其中k->j是一个合法转移合法转移要满足两个条件:1.若k的第x位为0,那么j的第x位一定要为1 (~k|j==j)2.k,j都为一的位置必须是偶数个且必须连续,即k&j的二进制不能出现单独一个1,例如0101不合法,0011和0110都合法原创 2017-10-25 21:07:45 · 405 阅读 · 0 评论 -
Jzoj1279 解题
过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目.精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一样找到了工作. 他们的月薪是M (1 他们的题目是一流的难题,所以他们得找帮手.帮手们不是免费的,但是他们能保证在一个月内作出任何题目.每做一道题需要两比付款, 第一笔A_i(1 <= A_i <= M)元在做题原创 2017-09-19 20:51:22 · 409 阅读 · 0 评论 -
Jzoj1310 生日礼物
先模拟,这个是双向链表的工作,让后将移动过后的序列取出来,在序列上面作LIS,那么答案就是n-LIS为什么?很简单LIS上的数不用动其他的都一次移动搞定就好了原创 2017-09-19 22:02:39 · 545 阅读 · 0 评论 -
Jzoj1321 灯
我们考虑到点数比较少,而且按下开关的操作可以用异或代替,但是问题是2^35直接搜索会超时,所以我们采用折半搜索+map就可以ac了,复杂度O(2^(n/2)n)原创 2017-09-20 18:10:23 · 291 阅读 · 0 评论 -
Jzoj1322硬币
动态规划,设f[i][j]为上一次取到第i个硬币,上一次取了j个硬币的最大答案,则f[i][j]=max(SUM[i]-f[i-k][k]),对于f[i][j],可以沿原创 2017-09-20 19:12:58 · 349 阅读 · 0 评论 -
Jzoj1307 Jail
这个题很坑,我们考虑|x1-X1|+|x2-X2|,若已经知道每一维的正负号,我们就可以将每一维的x加起来求最大和最小并相减(x1+x2-X1-X2)又因为d原创 2017-09-19 21:27:19 · 500 阅读 · 0 评论 -
Jzoj2921【NOI2012模拟题】字符串识别
神(shui)题,AC后看了下别人的code发现全都是后缀数组(难看)可能是因为我太弱了所以只想到SAM的算法做法:建立SAM,求出parent树,预处理倍增,让后就可以O(lg n)查询一个字串的出现次数了接下来,我们对于每个l∈[1,n],我们求出一个最小的r使得[l,r]在整个串里面只出现一次那么对于每个点i,ans[i]有两种情况:1.i被一个最短的区间[lj,原创 2017-09-20 20:54:46 · 400 阅读 · 0 评论 -
Jzoj2934 字符串函数
首先显然不能每个串暴力,我们考虑单独计算每一个字符的贡献对于b[i],若我们找到a[j]=b[i],可以分两种情况讨论1.i所以贡献就是i*j2.i>j 情况是对称的,所以贡献是(n-i+1)*(n-j+1)所以对于原创 2017-09-20 21:48:34 · 388 阅读 · 0 评论 -
Jzoj3223 Ede的新背包问题
最简单的方法肯定是暴力,每次询问都做一次背包,显然这样会超时我们可以用二进制分拆法或者是用单调队列优化复杂度到O(qnm),可是依然不能过注意到每次不能取的部分只有一个,那我们考虑用前缀和后缀分别维护,最后合并两个部分的答案f[i][j]表示做到第i个物品的状态,g[i][j]表示倒着做i个物品的状态最后合并两边即可原创 2017-09-25 15:52:49 · 426 阅读 · 0 评论 -
Jzoj3497 隐藏指令
显然,我们在计算方案时,每次必然加入在同一维度的,方向相反的行动那么我们令f[i][j][k]表示目前在处理第i维,已经走了2*j步,其中有2*k步在第i维上那么显然,f[i+1][j][0]+=f[i][j][k] 这等于是停止当前这一维的处理,开始下一维原创 2017-09-25 21:57:22 · 317 阅读 · 0 评论 -
Jzoj3443 压缩
看到数据范围我们发现可以用dp,设f[i][j]表示目前在第i位,最后一个循环串的长度为j的情况下,最短的长度那么显然,无论怎么样,有一种转移总是成立的,f[i][j]=min(f[i-j][k]+j+1),这相当于新开了一个循环节而另一个转移需要满足一个条件,f[i][j]=min(f[i-j][j]+1),当s(i-j+1,i)=s(i-j*2+1,i-j)时,这相当于在循环节里面加入一个*那么综合下来转移就是n^3的,我们加上两个优化1.令g[i]为min(f[i][k]),避免每次枚举k2原创 2017-09-25 19:39:21 · 275 阅读 · 0 评论 -
Jzoj3928 射♂击
有问题,找副连,无聊的时候当然也可以找他啦。小W找到了他的叔叔——东厂厂长——宇宙超级无敌老WS yy。他们叔侄两个商量之后决定用弹弓打破社区里的一些窗户,但是弹弓每秒只能彻底打破一扇窗户。而且如果某户窗户的主人回来了的话,他们就不能进行破坏了(不然会死得很惨的)。因为有的人装的玻璃好,有的人装的玻璃差,有的人装的玻璃高,有的人装的玻璃矮,所以你不能要求他们叔侄两个打破不同的窗户获得的快乐值必须相原创 2017-10-04 11:40:15 · 276 阅读 · 0 评论 -
Jzoj3769【NOI2015模拟8.14】A+B
完成斐波那契进制下的加法运算第一位为1,第二位为2,依次类推。。这里其实很简单,只是要考虑一下进位即可首先连续两位不为零直接向前进位即可但是不能解决问题,因为可能出现一个位上面的值大于1那么我们可以这样做,设连续的四位分别为:0,0,2,0那么我们可以将其变成1,0,0,1这样就相当于一次进位了,多次重复以上的进位过程即可这里可以加上第0位方便运算#includ原创 2017-09-27 21:32:40 · 484 阅读 · 0 评论 -
Jzoj3780 Magical GCD
给你一个序列s,求区间[l,r]使得gcd(s[l]~s[r])*(r-l+1)最大,输出这个最大值,n显然,我们暴力是不可以过的,那么我们考虑一下的做法:我们维护一个g数组,g[i]表示gcd(s[i]~s[r])那么我们每次移动r指针,让后重新更新g数组,显然每个g[i]可以O(lg k)更新,但是这样的复杂度依然是n^2lgk我们发现,对于g[i]=g[j]而且i为什么?原创 2017-09-28 16:25:36 · 385 阅读 · 0 评论 -
Jzoj3805 小X的二叉堆计数
题意:给你n个不同的数问你能构成多少个不同的二叉堆显然不能枚举,我们考虑用递推我们令f[i]表示以i为根的二叉堆有多少种令l,r为i的左右儿子,令size[i]为以i为根的堆的大小那么显然,f[i]=f[l]*f[r]*C(size[i]-1,size[l]),因为n个数互不相同,所以没有重复相当于是1~size[i]这几个数填进这个堆中,那么显然根只能填最大那个,让后在剩下的原创 2017-10-02 11:26:29 · 807 阅读 · 0 评论 -
Jzoj3806 小X 的道路修建
给你一个图,求一个最大边和最小边差值最小的生成树首先我们可以枚举最小边,每次跑一个最小生成树即可但是这样会超时,我们考虑优化采用最优性剪枝,假设我们当前树中的最小边是i,当前边是j,当前最优答案是ans,那么对于所有边k使得Length(j)-Length(k)>Ans的边在枚举最小边的时候可以直接跳过,下一次直接从k+1开始枚举,这样就可以优化时间复杂度,期望100分当然这不是正原创 2017-10-02 11:53:12 · 400 阅读 · 0 评论 -
Jzoj3894 改造二叉树
#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include<stdio.h>#include<string.h>#include<algorithm>#define INF 0x7f7f7f7fusing namespace std;int l[100010],r[100010],f[100010];int s[100010],w[100010],n,t=0;void mdfs(int x){ if(x){ mdfs(l[原创 2017-10-03 17:20:15 · 311 阅读 · 0 评论 -
Jzoj3895 数字对
给你一个序列s,求出所有最长的区间[l,r]使得存在一个k∈[l,r]且对于任何i∈[l,r]都有s[k]|s[i]显然如果这个k存在,那么s[k]一定是s[l]~s[r]的最小值现在问题就成了,求一个最长的区间使得s[l]~s[r]的最小值=s[l]~s[r]的gcd那么我们可以二分答案,而求一个区间最小和gcd都可以用ST表完成,所以整体复杂度nlg^2n(虽然说这是solut原创 2017-10-03 17:26:51 · 389 阅读 · 0 评论 -
Jzoj3902 游戏
农夫FJ和奶牛Bessie玩游戏,游戏由一个黑板和N张卡片组成。游戏初始时,黑板写的数字是0。每张卡片都写有一个[0,511]的整数。FJ和Bessie轮流操作,FJ先操作。操作者每次从当前的卡片中选取一张卡片出来(被选出来的卡片不会被再次利用),假设选出来的卡片写的数是X,并假设当前黑板写的数是Y,那么本轮操作后黑板的数变成Y|X,其中|是位操作的或。如果某个操作者没有卡片可取了(卡片已经取完)原创 2017-10-03 20:26:56 · 613 阅读 · 0 评论 -
Jzoj3906 魏传之长坂逆袭(梦回三国系列)
【题目背景】众所周知,刘备在长坂坡上与他的一众将领各种开挂,硬生生从曹操手中逃了出去,随后与孙权一起火烧赤壁、占有荆益、成就霸业。而曹操则在赤壁一败后再起不能,终生无力南下。建安二十五年(220年),曹操已到风烛残年,但仍难忘当年长坂的失误,霸业的破灭。他想如果在刘备逃亡的路中事先布下一些陷阱,便能拖延刘备的逃脱时间了。你作为曹操身边的太傅,有幸穿越到了208年的长坂坡,为大魏帝国贡献一份原创 2017-10-03 22:57:46 · 356 阅读 · 0 评论 -
Jzoj3907 蜀传之单刀赴会(梦回三国系列)
【题目背景】公元215年,刘备取益州,孙权令诸葛瑾找刘备索要荆州。刘备不答应,孙权极为恼恨,便派吕蒙率军取长沙、零陵、桂阳三郡。长沙、桂阳蜀将当即投降。刘备得知后,亲自从成都赶到公安(今湖北公安),派大将关羽争夺三郡。孙权也随即进驻陆口,派鲁肃屯兵益阳,抵挡关羽。双方剑拔弩张,孙刘联盟面临破裂,在这紧要关头,鲁肃为了维护孙刘联盟,不给曹操可乘之机,决定当面和关羽商谈。“肃邀羽相见,各驻兵马百步原创 2017-10-04 10:55:17 · 542 阅读 · 0 评论 -
Jzoj3908 吴传之火烧连营 (梦回三国系列)
【题目背景】蜀汉章武元年(221年),刘备为报吴夺荆州、关羽被杀之仇,率大军攻吴。吴将陆逊为避其锋,坚守不战,双方成对峙之势。蜀军远征,补给困难,又不能速战速决,加上入夏以后天气炎热,以致锐气渐失,士气低落。刘备为舒缓军士酷热之苦,命蜀军在山林中安营扎寨以避暑热。陆逊看准时机,命士兵每人带一把茅草,到达蜀军营垒时边放火边猛攻。蜀军营寨的木栅和周围的林木为易燃之物,火势迅速在各营漫延。蜀军大乱,原创 2017-10-04 11:04:28 · 661 阅读 · 0 评论 -
Jzoj4713 A
题意:给出n个没有区别的物品放入k个没有区别的盒子,求方案数这个题目可谓计数dp的经典我们令f[i][j][k]表示现在所有数和为i,有j个,最后一个为k的方案数那么显然,f[i][j][k]=∑f[i-p][j-1][p](1这样用前缀和,可以做到kn^2,水到60pts如何优化?我们发现状态表示其实是有可以改进的地方的,k这一位可以省掉为什么呢?我们发现,如原创 2017-10-14 22:20:34 · 274 阅读 · 0 评论 -
Jzoj4710 Value
题意:有n([1,5000])个物品,每一个有价值v和代价w,当你选择了这个物品后,剩下没选的物品价值减少w,问最大价值?假设我们已经选好了物品,那么显然,按照w升序排序贪心是最优的选择让后我们可以用dp来计算最优方案,这样的话我们需要将物品按照w降序排序,否则无法计算转移时的价值变化量#pragma GCC opitmize("O3")#pragma G++ opitmize(原创 2017-10-14 21:55:43 · 278 阅读 · 0 评论 -
Jzoj4627 斐波那契数列
题意:求Fib(n)此题渗水,这里讲一种不用矩阵的方法令f[n]=Fib(n)我们假设k=n/2那么久有以下递推式:若n-k%2=1f[n]=f[k]*f[k]+f[k+1]*f[k+1]否则f[n]=f[k]*f[k+1]+f[k+1]*(f[k]+f[k+1])边界特判一下就好了,复杂度lg n#include#define L long long原创 2017-10-11 21:45:49 · 459 阅读 · 0 评论 -
Jzoj4626 矩阵
先声明:本人在OJ上并没有AC但是坚信是spj错了因为我下载了数据本地评测而且交了一个直接输出答案的程序这个题目思路比较奇怪,题解我也没有看懂,这里提供一种三分的方法我们假设这个B的表达式为[a±x,b±x][c±x,d±x]那么显然答案就是x我们先暴力枚举正负号(二进制法),让后对于每一种情况,我们用三分法求B使得B的行列式绝对值尽量小,若这个值小余一个极小的量(我原来用的是1e原创 2017-10-11 21:29:13 · 319 阅读 · 0 评论 -
Jzoj4625 树
如果∑d≠2n-2说明错了否则,我们先构造出这棵树的直径,若一个di>2则我们将d-2个节点与其相连,所以answer=n-1-∑(max(2,d[i])-2)#includeinline int max(int a,int b){ return a>b?a:b; }int main(){ int n,d[20],ds=0,m; scanf("%d",&n); for(int原创 2017-10-11 21:23:35 · 274 阅读 · 0 评论 -
Jzoj4614 字符串(待填)
(EMPTY)原创 2017-10-07 22:32:40 · 329 阅读 · 0 评论 -
Jzoj4605 排序
树套树?莫队?分块?好像都可以?我们发现询问只有一个,我们考虑二分这个最后答案我们将序列中所有大于mid的值变成1,否则变成0,那么,排序就变成了将序列的01放在头或尾,可以用线段树区间修改做到#include#include#define mid (l+r>>1)#define ls x#define rs xusing namespace std;int s[400原创 2017-10-07 22:08:35 · 367 阅读 · 0 评论