自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tlyzxc的博客

我看到到处是阳光,快乐在城市上空飘扬

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

原创 CodeForces 1519D :Maximum Sum of Products 枚举 + 贡献

传送门题目描述给你一个两个序列aia_{i}ai​和bib_{i}bi​,现在需要你反转之多一次序列aia_{i}ai​,要求最后∑i=1nai∗bi\sum_{i=1}^na_{i}*b_{i}∑i=1n​ai​∗bi​最大分析看这个数据范围大概就是个二重循环,我们可以枚举反转的中点和反转半径,然后记录贡献的最大值即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x&

2021-04-30 18:52:14 184 1

原创 CodeForces 1355E :Restorer Distance 三分

传送门题目描述你要修理一堵墙,这堵墙由 NNN 个宽度为一的砖块构成,其中第 iii 块砖的高度为 hih_{i}hi​ 。你需要执行下列操作让这 NNN块砖的高度变得全部相等。1、使一块砖的高度加一,这需要花费 AAA 的代价。2、使一块高度为正的砖的高度减一,这需要花费 RRR 的代价。3、使一块高度为正的砖的高度减一,另一块砖的高度加一,这需要花费 MMM 的代价。给定 NNN,AAA,RRR,MMM ,你需要求出使所有砖的高度变得相同的最小代价。分析首先3操作可以转换成一个1操

2021-04-30 18:18:49 193 1

原创 CodeForces 1355D :Game With Array 思维构造

传送门题目描述给出两个数NNN,SSS问是否可以找到一个序列和一个数KKK(0<=K<=S0<=K<=S0<=K<=S)满足:存在一个长度为NNN,和为SSS序列,在其中找不到一个子段的和为KKK或者S−KS-KS−K如果可以,输出YESYESYES以及找到的序列还有KKK否则,输出NONONO分析很经典的构造题,也是我一直以来的短板首先这种有解无解的题目,首先要判断的就是,什么情况下无解当S<2∗NS < 2 * NS<2∗N的情况下

2021-04-30 13:09:28 117

原创 POJ - 2486 :Apple Tree 树上有依赖背包

传送门题目描述一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走k步,最多能遍历到的权值。分析首先我们可以去dfs每一个为为根节点的时候,子树走kkk步的时候的最大权值,但这里涉及到一位问题,因为每一条边可以重复走,所以会不会有回头的情况我们用f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示在iii点的时候,走kkk步,是否返回iii节点的情况下所能获得的最大权值,然去去状态转移就可以了如果返回uuu点,那么f[u][j+2][1]=max(

2021-04-29 19:22:10 52

原创 CodeForces 815C :Karen and Supermarket 树上有依赖背包

传送门题目描述在回家的路上,凯伦决定到超市停下来买一些杂货。 她需要买很多东西,但因为她是学生,所以她的预算仍然很有限。事实上,她只花了bbb美元。超市出售NNN种商品。第iii件商品可以以cic_{i}ci​美元的价格购买。当然,每件商品只能买一次。最近,超市一直在努力促销。凯伦作为一个忠实的客户,收到了nnn张优惠券。如果凯伦购买iii次商品,她可以用i次优惠券降低did_{i}di​美元。 当然,不买对应的商品,优惠券不能使用。然而,对于优惠券有一个规则。对于所有i>=2i>

2021-04-29 00:01:11 215

原创 The more, The Better 树上背包

传送门题目描述ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?分析树上背包问题,建立一个虚根即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<&

2021-04-28 23:17:32 46

原创 PC买礼物:DP + 拓扑排序

传送门题目描述分析大意了啊这波,天梯赛病毒那道题随手秒到这里同样的套路就gg了首先有向无环图,很容易想到在DAGDAGDAG上DP处理然后我们从后往前DP就可以了,两种情况,这个点不选,那么f[j][p]=(f[j][p]+f[t][p])%mod;f[j][p] = (f[j][p] + f[t][p]) \% mod;f[j][p]=(f[j][p]+f[t][p])%mod;如果这个点选,那么f[j][p]=(f[j][p]+f[t][p−a[j]])%mod;f[j][p] = (

2021-04-28 17:11:22 63

原创 P4170 [CQOI2007]涂色 区间DP

传送门题目描述分析还是区间DP的思路去写f[i][j]f[i][j]f[i][j]表示[i,j][i,j][i,j]这个区间最少的涂色次数,我们去枚举区间[i,j][i,j][i,j],分两种情况如果str[i]==str[j]str[i] == str[j]str[i]==str[j],那么我只要在处理[i+1,j][i + 1,j][i+1,j]或者[i,j−1][i,j - 1][i,j−1]区间的时候多刷一格就可以了,f[i][j]=min(f[i+1][j],f[i][j−1])f[

2021-04-28 00:03:13 102

原创 CodeForces 1132F :Clear the String 区间DP

传送门题目描述给你一个串sss,每次可以花费111的代价删去一个子串,要求子串的每一位为同一个字符。求删去整个串的最小代价。分析这个数据范围很明显就是O(n3)O(n ^ 3)O(n3)的区间DP了设f[i][j]f[i][j]f[i][j]为删区间[i,j][i,j][i,j]的最小代价,预处理f[i][i]=1f[i][i] = 1f[i][i]=1,那么我们去枚举一个区间[i,j][i,j][i,j]和区间的内的一个kkk,如果str[k]==str[j]str[k] == str[j]s

2021-04-27 23:37:46 124

原创 CodeForces 512B :Fox And Jumping 裴蜀定理 + DP

传送门题目描述给定nnn个数,每个数aia_{i}ai​都有一个对应的costicost_{i}costi​,现在你需要从中取若干种数,每种数可以有若干个,将他们相加减可以得到任意一个整数,问你最小的花费是多少分析首先我们可以把问题转换成选若干个数凑出一个1,因为凑出来1,就可以凑出来任意个数根据裴蜀定理我们知道,方程ax+by=gcd(a,b)ax + by = gcd(a,b)ax+by=gcd(a,b)存在一组x,yx,yx,y使得该等式成立,所以可以得到gcd(a,b)==1gcd(a,b

2021-04-27 22:52:57 112

原创 洛谷多校 :À la Volonté du Peuple 最短路

传送门题目描述给你一个 nnn 个点的无向图(允许自环)从编号为 111 的点开始点火,然后沿着边跑,可以分身(说白了就是火药被点着了)当火药被两个以上不同方向同时被点燃的时候,会发生爆炸询问能发生几次爆炸分析首先分情况讨论一下,爆炸的地方只会在点上爆炸或者边上爆炸点上爆炸这个比较好判断,如果想在点上发上爆炸的话,那么必然有多个火星同时到达了这个点,而必须要在点上爆炸而不能到边上爆炸,那么必然满足这些火星是最早到达这个点的(这个比较好证明,画画图就能理解)边上爆炸首先我们来分析一

2021-04-26 22:57:15 116

原创 CodeForces 1114D :Flood Fill 区间DP

传送门题目描述首先,定义一串数如果这串数字全部相同,那么这串数被称为“联通串”。现在给定一个串,每次可以把一个联通串中每一个数变成任意数字,求最少把整个串变成联通串的次数。分析首先我们可以去掉重复的区间,例如1 1 1 2 2 ,可以转换为区间1 2然后我们可以设计状态转移方程了f[i][j]f[i][j]f[i][j]表示从iii到jjj这个区间内如果要变成合法状态最小需要刷几次,然后我们就可以枚举起点和终点了如果a[i]==a[j]a[i] == a[j]a[i]==a[j],那么我可以先把

2021-04-26 22:36:07 93

原创 CodeForces 1447D :Catching Cheaters 字符串DP

传送门题目描述给我们两个字符串,让我们从中选出两个字串,算出它们的最大公共子序列长度。然后将它乘4在减去两个字串的长度。问你这个数最大是多少。分析我们可以把这个式子转换为2 * LIS - a的剩余长度 - b的剩余长度,然后就可以设计dp方程了如果当前这一位匹配了,那么答案+2,否则答案-1代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"&lt

2021-04-23 10:44:56 104

原创 CodeForces 1288D :Minimax Problem 二分

传送门题目描述给出一个 nnn行 mmm列的数字矩阵 aaa,找出两行 x,yx,yx,y,令 bj=max(ax,j,ay,j)b_j=max(a_{x,j},a_{y,j})bj​=max(ax,j​,ay,j​),试使得 min⁡1≤j≤mbj\min\limits_{1\le j \le m}b_j1≤j≤mmin​bj​最大,输出选择的 x,yx,yx,y,可以相同分析比较有意思的题目首先,求最小值的最大,大概就是朝二分那个方向想了,关键怎么去写这个check函数我们去二分这个答案,如

2021-04-22 20:45:22 74

原创 CodeForces 343D : Water Tree 树链剖分

传送门题目描述给定 n 个点的一棵有根树,1 号点是根,维护三种操作: 1.把结点 v 及其子树赋值 1。 2.把结点 v 及其到根上的路径赋值 0。 3.询问 v 点的值。 初始时所有的点都是 0。分析学过树链剖分之后我们可以很快的秒掉这道题代码#include <bits/stdc++.h>using namespace std;const int N = 100010;int h[N],ne[N],e[N],idx;int cnt,id[N];int dep[N]

2021-04-22 00:08:20 90

原创 CodeForces 1287C : Garland DP

传送门题目描述有一个由1−n1 - n1−n构成的数列,其中部分被删除(删除的元素由nnn代替),请用被删除的元素补全这个数列,使这个数列中相邻元素奇偶性不同的对数最少。分析我们可以去计算一下要填入的数中有多少个奇数,然后dp[i][j][0//1]表示枚举到第i个位置,已经把j个奇数填上去了,最后一位表示是奇数还是偶数,然后进行状态转移即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout

2021-04-21 21:12:04 118

原创 CodeForces 1312E : Array Shrinking 区间DP

传送门题目描述给你一个序列aia_{i}ai​,相邻两个数如果相同的话,我们可以删去其中一个数字,另一个数字+1,最后留下来的序列最小可以是多少分析这个数据范围大概就能想到是区间DP问题了我们首先初始化每一个区间f[i][j] = j - i + 1,然后只有当左右两个区间长度都为1且最后剩余数字相同的时候才能进行合并代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x&

2021-04-21 11:49:07 75

原创 CodeForces 1514D : Cut and Stick 主席树

传送门题目描述现在给你一个序列aia_{i}ai​,我们定义一个好的序列为序列中每一种数字出现的次数都不超过n2\frac{n}{2}2n​,nnn为序列总长度,现在给你一个区间l,rl,rl,r,问你最少将这个区间分割成几部分,可以使每个子区间都是一个好区间分析首先分析一下一个区间内只会有一个数出现的次数大于n2\frac{n}{2}2n​如果这个区间没有任何一个数出现的次数大于n2\frac{n}{2}2n​,返回1如果有,假设出现次数为xxx,那么剩下的数的数量为n−xn - xn−x,所

2021-04-20 21:17:15 160

原创 Tokitsukaze and Multiple 思维

传送门题目描述找出数列中和为k的倍数的连续子序列的最大个数。分析这题cf都快出烂了我们去维护一下前缀和,然后根据性质可以知道只要当前这一位的前缀和前面出现过,那么这一段的和就是0,所以我们可以对前缀和取模,最后map维护一下结果即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(

2021-04-20 16:45:24 130

原创 Go Running 二分图最小点覆盖

传送门题目描述有一条跑道,学生以1m/s1m/s1m/s的速度跑步,给你nnn组tit_{i}ti​和xix_{i}xi​,表示这个时候这个位置存在一个学生,问你最少有多少学生在跑道上分析我们可以考虑一下,这个学生可能是000时刻从x+tx + tx+t或者x−tx - tx−t转移过来的,但这两个位置只能存在一个,所以就构成了一个二分图,这样就转换成了二分图的最小点覆盖问题,求一下最大匹配即可代码#pragma GCC optimize(3)#include <bits/stdc++.

2021-04-20 00:51:46 83

原创 Finding a MEX 分块 + 树状数组

传送门题目描述给你一个无向图,每个点都有一个权值aia_{i}ai​,现在有两种操作1:将点xxx的权值改为www2:将与点xxx相连的所有点的的权值构成一个集合,求这个集合的mexmexmex分析这个题的思路比较巧妙首先我们求mexmexmex有很多方法,可以直接暴力,或者树状数组二分,线段树等,但不管任何方法,要么时间复杂度不理想,要么空间复杂度不理想,那么我们就要来权衡一下首先这个图的所有点的度数最大为n∗(n−1)n * (n - 1)n∗(n−1),为完全图的情况下,那么这张图中点

2021-04-19 20:40:58 84

原创 CodeForces 1407E : Egor in the Republic of Dagestan 最短路 + 染色

传送门题目描述nnn 个点 mmm 条边的无向图,边有黑白两种颜色。现在要给点染色,每个点染成黑或白色。白点只能走它连出去的白边,黑点只能走它连出去的黑边。问是否存在一种染色方案,使得不存在一条 1→n1\rightarrow n1→n 的路径。如果不存在,在第一行输出 -1,否则输出 1→n1\rightarrow n1→n 最长的最短路径长度。在第二行,输出对应第一行答案的染色方案。分析这个图论比较裸了我们可以从重点开始反向搜索,把所有能走的边尽量的都去封死这样就会产生两种情况,一个点

2021-04-19 02:31:12 153

原创 CodeForces 1153D : Serval and Rooted Tree 树形DP

传送门题目描述nnn个节点以111为根的一棵树,每个非叶子节点都有一个操作maxmaxmax或minminmin(000表示minminmin,111表示maxmaxmax),表示这个节点中的值应该分别等于其子节点中所有值的最大值或最小值。假设树上有kkk个叶节点,你可以将每个叶节点填上[1,k][1,k][1,k]的数字,且每个数字只使用一次,求根节点的最大值分析这个题目非常的有意思,容易想到二分那方面去首先我们想要值最大,那么就需要子节点中大于这个节点的数尽可能的少,我们去给每个叶节点赋值为1

2021-04-19 01:35:05 179

原创 CodeForces 1509D : Binary Literature 思维构造

传送门题目描述给你三个长度为2∗n2 * n2∗n的字符串,只包含0,10,10,1两种元素,现在需要构造一个长度为3∗n3 * n3∗n的字符串,他的子串最少包含其中两个字符串分析看别人的博客补的,比赛时候自己写的代码又臭又长,最后还WA了我们去分析一下,如果不考虑长度的话,我们可以去构造一个长度为4∗n4 * n4∗n的字符串,也就是把两个字符串拼接在一起组成,但是这样会超过,所以怎么办呢我们考虑去删减一下字符以达到公用的效果,首先这三个字符串,要么000的个数大于nnn,要么111的个数大

2021-04-19 00:48:03 166

原创 CodeForces 1285D : Dr. Evil Underscores 树形DP

传送门题目描述给你一个长度为nnn的序列aia_{i}ai​,你需要找到一个非负整数XXX,使得max(ai⊕X)max(a_{i} ⊕ X)max(ai​⊕X)最小,⊕⊕⊕为按位异或运算分析一开始看到最大值的最小值想的是二分,但是想不出check因为这题涉及到二进制操作,所以我们很容易想到把每一个数字进行拆位分析一下可以得出,如果每个数字二进制下的第iii位都为111或者都为000,那么不管这一位我选择000还是111,最后结果都是1所以我们可以去建一个trie树,在trie树上做树形DP即

2021-04-18 23:06:03 85

原创 CodeForces 1504E : GCD and MST 思维

传送门题目描述给你一个序列aia_{i}ai​和一个代价ppp,任意两个相邻点之间的可以连一条代价为ppp的边,如果一个区间内的gcdgcdgcd为这个区间内的最小值的话,那么这个区间的两个端点之间可以连一条代价为这个最小值的边,最你最小生成树为多少分析首先最坏情况下的答案是(n−1)∗p(n - 1) * p(n−1)∗p,然后我们就要尽量用代价小的边去代替我们可以用优先队列存下每个点的权值和坐标,然后求以这个点为最小值,最大的能保证每个数都是这个数的倍数的一个区间是多少,然后进行边的替换即可

2021-04-17 15:01:03 171

原创 L2-022 重排链表

传送门题目描述分析李巨给的题这题其实就是个模拟,但是题目这个表述就很迷给你的nnn个点不一定都在同一条链上,所以最后打印出来的答案不一定有nnn行另外注意用mapmapmap存储信息内存会爆炸,所以用数组存就可以了代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) prin

2021-04-16 16:34:55 70

原创 CodeForces 1504E : Travelling Salesman Problem思维

传送门题目描述分析比赛的时候寻思着这应该是线性筛的某种变形,奈何自己是数论白痴推了半天没推出结果赛后才发现这道题可以直接用埃筛莽过去??大意了啊代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("

2021-04-14 19:49:09 212

原创 CodeForces 1512G : Short Task 数学

传送门题目描述给你一个数,然你判断哪个数的所有约数和等于这个数分析比赛的时候寻思着这应该是线性筛的某种变形,奈何自己是数论白痴推了半天没推出结果赛后才发现这道题可以直接用埃筛莽过去??大意了啊代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x

2021-04-12 08:44:42 207

原创 CodeForces 1512F : Education 模拟

传送门题目描述给你一个序列aia_{i}ai​和bib_{i}bi​,你如果在iii点停留一天,可以或者aia_{i}ai​单位的金钱,你如果想从iii点移动到i+1i + 1i+1 点,需要一天时间,并支付aia_{i}ai​单位的金钱,为如果想或得ccc单位的金枪,最少需要多少天分析先计算出,如果最后停留在iii点,前面最少需要花费多少天,然后循环最后停留的点,更新答案代码#pragma GCC optimize(3)#include <bits/stdc++.h>#defi

2021-04-11 14:44:21 189

原创 CodeForces 1283D :Christmas Trees 模拟

传送门题目描述现在有nnn棵树和mmm个人,给你每一个树的位置,需要你安排每一个人的位置,使每个人到离他最近的那棵树的距离和最小分析有点类似于广搜,我们把每个树作为一个起点,然后向两边进行拓展,丢进队列进行模拟就可以了代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) print

2021-04-08 14:17:39 71

原创 CodeForces 813E :Army Creation 主席树

传送门题目描述给你一个长度为nnn序列aia_{i}ai​,qqq次询问,每次给你一个l,rl,rl,r,问你在[l,r][l,r][l,r]内最多可以选多少个数,满足同一个数的出现次数不超过kkk强制在线分析我们去存一下每一个数字出现的位置,就可以倒推前面kkk个数出现的位置,也就是说只要前面kkk个数字出现的位置大于lll都可以选,然后我们可以用主席树储存一下每一段可选的个数,然后区间操作即可代码#pragma GCC optimize(3)#include <bits/stdc+

2021-04-07 20:22:16 97

原创 HDU - 5119: Happy Matt Friends DP

分析dp处理一下,假设f[i][j]f[i][j]f[i][j]表示前iii个数中最后异或值为jjj的情况有这么多种,然后状态转移方程就比较好写了f[i][j] = f[i - 1][j] + f[i - 1][j ^ a[i]];因为一个数字都不选相当于0,所以初始化状态为f[0][0]=1f[0][0] = 1f[0][0]=1即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout&l

2021-04-02 17:28:15 137

原创 CodeForces 1506G :Maximize the Remaining String 单调栈

传送门题目描述给你一个字符串,你可以删除任意一个字符,但是要保证最后每一种字符只能存在一个,并且字符种类不能减少,求最后字典序最大的结果分析我们可以分析一下什么情况下一个字符应该被删除如果这个字符后面的字符比他大,并且后面还存在相同的字符的时候,那么我们就可以把这个字符删除,这个过程有没有很想单调栈的过程?所以我们只需要用单调栈模拟一下就可以了代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) co

2021-04-01 16:20:11 125

空空如也

空空如也

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

TA关注的人

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