自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

樾殇的博客

公主已经死了,屠龙的少年还在燃烧。

  • 博客(51)
  • 收藏
  • 关注

原创 (换根dp)点权

题目链接:这里题解:对于每个点权为000或者111的节点,必须要求他的旁边有222或者111个点权可以变为222的节点。但是旁边可以变为222的节点也是从它的旁边扩展来的,对于这种情况我们就想到了树形dp,我们可以以111为根节点进行一次树形dp。但是这样只是一种情况,我们还要以其他节点为根节点的树,如果每个都进行一次树形dp的话,复杂度根本无法接受。所以我们想到了换根dp。为了进行树形dp,我们还要保存每个节点旁边可以进行转换的最小的三个代价,这样在树形dp的时候我们才能正确的判断出我们要取的价值。换

2021-12-28 17:47:01 474

原创 2021 济南 D Arithmetic Sequence

题目链接:这里题解:这个题意读起来非常简单,就是给你nnn个数,每一次操作可以使每一个数加111或者减去111,然后让你求使这个序列变为等差序列最小的次数。首先我们这样考虑,对于不同的公差ddd,肯定是只有一个最优的,两边的都要比这个公差要大,这就是个单谷函数,我们可以用三分来求这个公差ddd。但是有了公差ddd以后很明显我们是无法确定首项是什么的,我们队当时在考场上的做法为再套一个三分,但是这样直接tletletle了。我们可以这样考虑,设首项为xxx,公差为ddd,原序列为aaa,那么我们可以得

2021-11-17 13:50:08 547

原创 魔法学院(hard version)

题解:这个题是个很有意思的一道题,数的范围是很大的,如果我们用线段树来处理这个题的话,很明显会tletletle。我们贪心的想一下,如果这个字符要更改的话,我们贪心的想肯定是改成这个字符能改成的最大的字符。所以我们可以给mmm个魔法排一下序,然后我们从大到小来给这些字符来进行变化。但是如何维护这个点已经变换过了是一个问题。然后我们可以考虑并查集,这是一个很经典的做法,当这个点变化过后,就把这个点的父亲改成它的下一个节点,这样我们就可以O(1)O(1)O(1)来维护这个点是否已经更改过,如果已经更改过,也可

2021-11-15 21:11:37 355

原创 2021 CCPC 新疆省赛 部分题解

比赛链接:这里A:签到题,排一下序就可以过,可能唯一的考点是重载。#include<bits/stdc++.h>#define LL long long#define pr pair<LL,LL>#define ios ios::sync_with_stdio(false)#define CRL(a) memset(a,0,sizeof a)using namespace std;const int N = 2e5 + 5;struct node{ int

2021-11-12 22:23:36 684

原创 Arena

题目链接:这里题意:给你一个 n 和一个 x ,表示你有n个人,这些人的血量大于等于1,小于等于x,每一秒这些人都会攻击所有活着的人,造成一点伤害,死了不会攻击。如果最后活一个人那么这个人即为这个人胜利,没有人活着即为没有人胜利,让你求没有人胜利的方法数有多少。题解:考虑dp,我们设**dp[n][x]**表示有n个人血量为x时没有玩家胜利的数量,那么我们可以得到这些人在第一轮中就死完的方案数为 min(n−1,x)nmin(n-1, x)^{n}min(n−1,x)n。然后剩下的我们就要从别的地方转

2021-11-12 21:51:04 470

原创 最大化最短路

题目链接题解:假设我们连接了两个点a,b,那么这条路是从1到a的距离+a到b的距离+b到n的距离。那么我们首先就要预处理出来两个距离,分别是1到各个点的最短距离为d1,另一个就是n到各个点的最短距离d2。我们再有了这个之后,就可以得到距离为min(d1[a]+1+d2[b],d1[b]+1+d2[a]),但是我们有了它以后如果暴力遍历所有点的话,是O(n²),很明显是会超时的。我们可以把这两个式子中的元素交换交换下,会得到这样的一个式子,d1[a]-d1[b],d2[a]-d2[b],而我们要找的是两个

2021-08-09 21:56:19 67

原创 Permutation Shift(思维+构造)

题目链接题意:给你一个数组a,你可以选择删去数组当中的一些元素,删去这个元素以后,它后面的元素都往后移一个位置,问你在删除一些元素以后,使得这个数组当中i == ai的元素最多有多少个。题解:我们首先要注意到这样一个性质,假设当前位置为i,元素为ai,那么只有i - ai> = 0的元素才有机会移动到那些正确的位置,那么我们首先要预处理出来这些元素,然后按照(i - ai)的大小来进行排序,然后我们可以用二分来处理这个问题,我们首先要知道你移动一个位置,是不会影响这个位置左边的情况的,所以我们可以

2021-08-09 21:33:42 103

原创 Codeforces Global Round 15(A-D)

补一补之前没打的cf比赛链接A:签到题 排一下序即可#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_stdio(false)#define CRL(a) memset(a,0,sizeof a)#define endl "\n"using namespace std;const int maxn = 1e5 + 5;int a

2021-08-08 18:28:29 130

原创 Acwing第 9 场周赛

这个系列从来都是随心写…(差不多没按时打过)比赛链接A:都会#include <iostream>#include <cstring>#include <algorithm>using namespace std;int main(){ int T; cin >> T; while (T -- ) { int n; cin >> n; cout &l

2021-07-26 23:07:06 66

原创 Array Stabilization (GCD version)

题目链接题意:给我们一个有n个元素的数组a成环形,然后b数组为 b[i] = gcd(a[i], a[i+1]),且b[n] = gcd(a[n],a[1])。然后再把b数组赋给a数组,问这样几次以后可以使a数组当中所有的元素相等。题解:易证gcd(gcd(a,b),c) == gcd(a,b,c)。有了这个结论后我们就好写题了。我们可以知道要最后元素相等的话,那么肯定是a[i] = gcd(a[1],a[2]…a[n])(1<=i<=n)。且第一次为a[i] = gcd(a[i],a[i+

2021-07-26 22:36:55 239

原创 剪纸游戏(博弈论)

给定一张 N×M的矩形网格纸,两名玩家轮流行动。在每一次行动中,可以任选一张矩形网格纸,沿着某一行或某一列的格线,把它剪成两部分。首先剪出 1×1的格纸的玩家获胜。两名玩家都采取最优策略行动,求先手是否能获胜。提示:开始时只有一张纸可以进行裁剪,随着游戏进行,纸张被裁剪成 2,3,…更多张,可选择进行裁剪的纸张就会越来越多。输入格式输入包含多组测试数据,每组数据占一行。每组数据包括两个整数 N和 M,表示初始网格纸的尺寸。输出格式每组测试数据输出一个结果,结果占一行。如果先手方

2021-07-22 16:01:49 378 1

原创 Penguins(bfs)

题目链接题解:这个题目已经说的很明显了,就是一个很明显的bfs,不过在bfs的时候我们要注意题目还要求字典序最小的是什么,所以我们只需要让企鹅在走的时候按照四个方向的字典序走就行。而且这个题目状态存储我们要放在一块儿存储,要开一个四维数组,如果你分开存,那么很多状态你是走不到的,这个题避错,然后就是输出麻烦点,注意细节即可。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios

2021-07-20 22:58:35 73

原创 Stack(拓扑排序)

题目链接题解:这个题我们可以用拓扑排序来写。我们可以这么思考,当栈中的个数大于b数组给的要求的时候,那么把这些数弹掉,且弹掉的数中最小的数连向i(因为这个最小的数要比放进去的数大),在这个过程中我们建边,表示该点要比这个点大,然后再执行一遍拓扑排序,注意拓扑排序的时候我们要从大到小进行赋值,因为我们建边的时候是从大指向小的。这个题就可以完成了。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#

2021-07-20 22:45:55 153

原创 科学幻想(线段树+哈希+二分)

题目链接题解:这个题让我们求两个子串,他们当中至多只能有一个不相等。在没有更改的情况下,我们可以利用二分来解决这个问题,至多只有一个元素的情况是,前面的一部分是相等的,从这个元素往后是不相等的,我们只需要找到这个地方就行了。这个题再加上更改的话就需要线段树来解决问题了,我们直接在线段树上哈希就行,这其中有很多小细节,都在注释上,别写错了。#include<bits/stdc++.h>#define ll long long#define ull unsigned long long#d

2021-07-19 23:33:40 115

原创 哥三好(dp)

题目链接题解:这个题很明显就是个dp,我们可以用开三维dp[i][j][k]来表示当第一个人剩下i钱时,第二个人剩下j钱时,第三个人剩下k钱时的方案数,很明显这个是要从钱更多的地方转移过来的,所以我们要倒着来转移。但如果我们直接开空间会炸,我们注意到三个人的总和肯定是150的倍数,所以我们让钱除150既可以优化空间。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios

2021-07-19 22:49:59 62

原创 队伍配置(dp)

链接:https://ac.nowcoder.com/acm/problem/14699来源:牛客网萌学姐在玩大型手游《futa go》,他现在准备进入作战环节,所以他准备安排自己的队伍。队伍配置里,可供玩家选择的作战人物被称作“从者”,玩家可以对每个“从者”可以装备至多1件的“概念礼装”,玩家具有一个cost上限值。详细定义如下:1、 每个从者和概念礼装都具有攻击值ATK。2、 每个从者和概念礼装都会占据一定的cost值。3、 每个从者和概念礼装只能上场一次,不能重复使用。

2021-07-14 22:37:43 166

原创 AquaMoon and Strange Sort

题目链接题解:我们可以很容易的得到这样一个性质,如果一个数要移动,那么它必须要移动偶数次数。我们首先把这个数组排序,然后判断排完序后的数组和之前数组的位置是不是奇偶性质相同,如果相同那么肯定是要移动偶数次(移动一个位置的数,对其他位置的数的移动次数并无影响)。然后我们就可以得到这个题的答案。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_s

2021-07-13 12:47:06 190

原创 最大剩余油量

题目题解:这个题给了我们一个树,很明显这是一个树形dp,我们这样表示状态,dp[i]表示i的孩子以i为结尾的最大值,那么以i的这棵树上能取到的最大值就是以i为结尾的最大值和以i为结尾的次大值相加(就是以i为中间点)。我们用一个全局变量去更新这个值,但是dp[i]依旧存的是以i为结尾的最大值,如果你存以i为中间点的最大值,那么向上更新时当前dp[i]里存的已经是一条有开头有结尾的路径了,再往上更新会出错。#include<bits/stdc++.h>#define ll long long

2021-07-13 12:37:17 105

原创 Palindrome Game

这个题分两个版本,分别是简单和困难版本。简单题解:简单题给的字符串都是回文串,如果是回文串那么第一个肯定要花费1使一个0变成1,然后这个串会变成非回文串或者回文串,而变成回文串只有字符串的长度是奇数,而且中间的为0。往后推可得只有第一次回文串改变后仍为回文串,ALICE才会赢,其他的都为BOB赢。#include<bits/stdc++.h>using namespace std;int main(){ int t; cin>>t; while(t--){ str

2021-07-05 15:16:20 119

原创 牛客杂题欢乐赛 6

这里的题基本都是老题,牛客每日一题上的题目集。A题意:这是cf上的一个老题,意思就是给你一个区间l,r,让你在l r里找一个数,这个数是这些数里二进制表示里1最多的数,并且输出这个数。题解:贪心的想,我们要找的这个数是在l,r范围里,我们可以算出r总共有几位,然后让l上不是1的位置变为1,然后加上这个数,注意加上之后以后要小于r,我们要让1的数目尽量大的话,就要从小开始遍历,然后输出即可,另外需要注意范围。#include<bits/stdc++.h>#define ll long l

2021-06-27 20:07:58 49

原创 Codeforces Round #728 (Div. 2)(A-C)

补一篇 打游戏忘写了A题意:给你n个数,让你把这些数移动到每个数不在自己该有的位置上,求最小移动次数的数组是什么样。题解:偶数直接两两交换,奇数让最后三个交换即可。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_stdio(false)#define CRL(a) memset(a,0,sizeof a)#define endl "

2021-06-27 18:21:38 177

原创 [AHOI2009]中国象棋

题目链接题解:很明显这是个dp,很明显每一行只能最多放两个炮,这样就很容易状态表示了,我们用dp[i][j][k]来表示前i行放了一个炮的列数有j个,放了两个的炮列数有k个,我们很容易可以得到放了0个炮的列数有多少个。具体怎么转移看代码注释。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_stdio(false)#define CRL(a

2021-06-22 10:13:52 62

原创 Codeforces Round #727 (Div. 2) A-D

不专心写题见祖宗A题解:这个题的意思是这样的,第一个人开始时间为0,然后下一个人为x时间开始,下下个为2*x开始,以此类推。然后每个人完成时间为开始时间+t,如果这个人开始得时候有人还没完成他会不爽,让我们求总共不爽的。读懂题意后就很简单了,就是个简单的数学题,等差数列即可,具体看代码。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_s

2021-06-20 23:24:37 93 1

原创 连续非空子序列

题目链接题目大意:让你在一个n个数的序列中,找总共有多少连续的子序列,子序列中的数和大于0。题解:这个题就是让我们找sum[j]-sum[i-1]>0,(1<=j<=n,1<=i<=j),我们可以把他转化为sum[j]>sum[i-1],这样这个题目就简单了,我们可以用树状数组来解决这个问题,但是这个题的数据太大了,我们需要离散化一下,然后这个题就解决了。启发:这个题我在区间上折腾了半天,一直都没有好的解决方法,以后有时候要换一个思路,转化一下,或许这个题就很好写了

2021-06-20 15:10:32 636

原创 移动服务

忍龙真好玩题目链接题解:这个题是个dp,我们首先可以想到用dp[i][j][k][l]来表示状态,第一维表示当前是第几个请求,剩下的三个状态表示当前三个人在什么位置,然后我们遍历三个人的位置来解决问题就好,但是这样做是O(n4),肯定超时。我们只能想办法来优化,我们发现如果要进行第i个请求,那么肯定有一个人在第i-1个位置上,所以我们可以将这个缩小一维,这样我们就可以不t了。然后我们还发现我们当前第i次请求只和第i-1次有关,那么我们就可以使用滚动数组来解决这个问题。如果我们发现当前表示的状态很明显解

2021-06-16 22:33:22 52

原创 [SCOI2008]着色方案

希望我明天四级稳过…(所以我为什么还在刷题)这里题解:题目给的数据范围并不算大,所以我们可以有两个方案,爆搜或者dp,但爆搜不仅不好搜而且肯定会超时,所以我们只好用dp来解决这个问题。我本来想给每种颜色设一个状态,然后来dp,但5的15次方很明显是超时的,而且也会爆空间。所以我们可以换一种思路,我们看到每种颜色最多只有五个,所以我们可以用五维来表示只能涂n(n>=1&&n<=5)个的木块的油漆各有多少种,再开一维来表示当前选择的是那一维,这样我们就可以用记忆化搜索来解决题目

2021-06-11 21:54:58 122 1

原创 Codeforces Round #724 (Div. 2) (A-D)

最近真是糟糕透了,干啥啥不行,还活成了笑话,题也写不出来,唉…比赛链接A题意:如果一个数组中的任意两个数的绝对值之差都在这个数组中出现过,则称这个数组为好数组,现在给我们一个数组a,问我们能否往里面添加几个数,使其成为数组大小不超过300的好数组。题解:如果这个数组当中有负数,那么必不可能成为好数组(一个数减去一个负数会变得更大),而数的范围又只在-100-100,所以我们只需要输出0-100即可。#include<bits/stdc++.h>#define ll long long

2021-06-09 17:38:36 123 1

原创 AcWing第一周周赛(补题)

因为一些原因(开黑)周赛给忘了,所以只能补题了,总的这次来说这次题并不难,可以说是手速场,唯一卡住我的只有b题,思维这方面太差了,应该多刷刷。比赛链接:这里A:签到,直接暴力搞就好了。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_stdio(false)#define CRL(a) memset(a,0,sizeof a)usin

2021-05-30 23:15:12 151 2

原创 一起来做题~欢乐赛2(题解)

总算把这几周的考试忙完了,接下来要多搞得就是刷题了吧。比赛链接:这里A:很久之前写的题了,这个题目说的虽然是二分,但是和二分没有一点关系,反而是用差分来写的。比较简单的一道题,直接放代码了。#include<iostream>#include<map>#include<algorithm>using namespace std;const int INF=0x7f7f7f7f;map<int,int>mp;int main(){ i

2021-05-28 15:35:39 94

原创 [HEOI2016/TJOI2016]排序

题目链接:点这里题解:01序列+线段树。这个题我们要离线的写,首先我们要二分答案,得到mid以后将所以小于mid的位置为0,大于等于mid的为1。然后我们建立一个线段树,在上面进行离线操作,每次排序就是把这个区间里的0和1换一下位置,这在线段树上是很容易实现的。如果第p个位置为1的话代表当前这个位置的数应该小于等于mid,满足单调性,然后我们再继续进行二分即可。#include<bits/stdc++.h>#define ll long long#define pr pair<l

2021-05-19 22:32:23 81

原创 [NOIP2013 提高组] 货车运输

题目链接:点这里题解:这道算是一道蛮有意思的题,这道题我们要用最小生成树+lca来写。我们贪心的想,我们要使这条路上的最小的最大。我们可以建一个最小生成树,但是我们排序的时候要把边权较大的放在最前面,然后用krustal来建这个树即可。建完树以后,我们可以用lca来解决询问问题。每当询问的时候,我们可以用lca来找他们的公共祖先,然后再取这两条路上的最小值就可以了。#include<bits/stdc++.h>#define ll long long#define pr pair<

2021-05-17 23:19:30 233

原创 Educational Codeforces Round 109 (Rated for Div. 2) A B D

A:点这里题解:签到题,这个题让你做个药剂啥的,让你求浓度为k%的药剂最少需要多少份。这个直接除以k和100 - k的gcd即可。 #include<bits/stdc++.h> #define ll long long #define pr pair<ll,ll> #define ios ios::sync_with_stdio(false) #define CRL(a) memset(a,0,sizeof a) #define e

2021-05-17 23:02:52 73

原创 [JLOI2011]飞行路线

题目链接:点这里题解:这个题是一个很明显的分层图问题,我们要建立k+1层图,从代表从这一层到上一层免费,即代表用了一次的免费机会,所以我们最后是要求在第k层的终点,即代表已经用了这k次的免费机会。而且这个题数据相当毒瘤,我们还需要建立终点各个层的图,因为有可能最短的数据是没有用完这k次机会的(这数据绝了)。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::syn

2021-05-16 23:24:25 247

原创 Educational Codeforces Round 107 (Rated for Div. 2)(A~D)

比赛链接:这里A:题解:这个有两个服务器,贪心的想,我们把差评放在第二个服务器,其余的放在第一个服务器,这样中立就可以变为好评了,这样可以得到最大。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_stdio(false)#define CRL(a) memset(a,0,sizeof a)using namespace std;

2021-04-13 14:51:32 97

原创 Codeforces Round #712 (Div. 2) (A~C,E)

比赛链接:这里A:题意:让我们在原字符串的基础上再插入一个字母a,并且要求插入后的字符串不能是回文串。题解:我们可以这样想,如果它原先是回文串,那么我们插在第一个或者最后一个个都会使它变为不是回文串。如果它原先不是回文串,我们有可能会插入一个a后使它变为回文串,但只有唯一的位置,所以我们只需要判断在第一个和最后一个插入的情况即可。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define

2021-04-08 18:51:17 73

原创 Codeforces Round #708 (Div. 2) A--C2andE

A 题目链接 这里题解:签到题,这个题和之前某一场的b描述是一样的,都是找不在当前数里的最小值,这个排个序,把相同的扔最后可以得到答案。 #include<bits/stdc++.h> #define ll long long #define pr pair<ll,ll> #define ios ios::sync_with_stdio(false) #define CRL(a) memset(a,0,sizeof a)

2021-03-20 15:58:29 110 1

原创 树上背包两题详解

题目链接:点这里题解:这题算是比较裸的一道题,我们可以很明显的看出来题目是一棵树,所以我们可以先建一颗树,然后从下往上进行转移,这时候就要用到树形dp了,我们可以看到题目是会有好几颗树的,也就是森林,所以我们可以建一个0点,把这个森林连成一棵树,这时0是必选的(可以好好思考下这个点),所以这时我们是要选m+1节课,这时我们可以从下往上进行转移,这时问题有来了,假如a是b的父亲,b也有好几个孩子,那么选b的那几个孩子是最好的那(注意必须要选b),这个问题是不是很像背包?没错,这时候我们只需要在这里进行一个背

2021-03-14 23:02:07 170

原创 饥饿的奶牛(dp)

题目链接:点这里题解:我们可以首先按照右端点进行排序,然后状态表示为f[i]选不选择第i个,如果不选择第i个的话,很明显是从第i-1个转移过来,如果选择第i个,由于我们是排过序的,所以只需要求第i个的左端点前的最优子结构就好了,这个我们要二分来进行求解,否则可能会超时,这个题就解决了,剩下的写代码就好了。#include<bits/stdc++.h>#define ll long long using namespace std;struct node{ int a, b,

2021-03-10 19:12:31 438

原创 货币系统

题目链接:点这里题解:我们可以得到如果要得到最小的m,我们要使b是a的子集,并且a中所有的数都可以由b来表示出来。想到这里这个题就比较简单了,我们可以先排序一下,然后用完全背包就可以解决这个问题了。具体看代码就好了,要注意一下细节。#include<bits/stdc++.h>#define ll long long#define pr pair<ll,ll>#define ios ios::sync_with_stdio(false)#define CRL(a) mem

2021-03-10 19:06:05 121

原创 Maximum width

题目链接:点这里题目大意:给你两个字符串a,b,让你求a中找一个子序列和b相同,并且两个字符之间的距离最大。题解:贪心的想,我们只需要让两个字符之间的距离最大就好了,其余的就不用管了,但同时我们还得满足b的顺序。所以我们可以正着扫一遍a,求满足b的,然后再倒着扫一遍a,求满足b的,这时候相距的就是最大距离。 #include<bits/stdc++.h> #define ll long long #define pr pair<ll,ll> #de

2021-03-07 18:03:00 191

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除