自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 [省选联考 2020 A 卷] 树

一、题目点此看题二、解法终于吧咕的这道题补回来了,考虑搞一个数据结构,我们需要维护:支持单点插入支持启发式合并支持统计异或和支持全局+1+1+1发现只有第四个不会做,那就搞它,考虑+1+1+1的意义在二进制下的意义是把末尾一段连续的111删去,把前面的000设置成111,发现这样可以通过tiretiretire树交换子树来做,但是细节不是很清楚。考场上我想到这一点就止步了,原因是我的tiretiretire树是从大到小建的(指二进制位的顺序),但是如果我们从小到大建出这颗tiretir

2020-07-31 11:46:18 219 2

原创 CF815C Karen and Supermarket

一、题目点此看题二、解法首先可以把树建出来,由于价格范围太大,所以把物品个数加进状态中,设dp[u][i][0/1]dp[u][i][0/1]dp[u][i][0/1]为uuu为根的子树内,买了iii件物品,uuu有没有被买(能不能用优惠券)的最小花费,转移相当于一个背包,特别注意能用劵的情况下可以让子树不用劵。咋一看这样做的时间复杂度是O(n3)O(n^3)O(n3)的,考虑一种常用的树上复杂度计算方式,由于没对点只会在lcalcalca处被计算一次,所以时间复杂度是O(n2)O(n^2)O(n2

2020-07-31 09:45:13 132

原创 CF629E Famil Door and Roads

一、题目点此看题二、解法关键在于讨论lcalcalca在哪儿:

2020-07-31 08:25:09 122

原创 CF1032F Vasya and Maximum Matching

一、题目点此看题二、解法最大匹配只有一种的条件是必须完美匹配或者是孤点。设dp[u][0/1/2]dp[u][0/1/2]dp[u][0/1/2]为uuu是孤点/u/u/u的匹配要交给父亲解决/u/u/u子树内已经解决好问题,转移:dp[u][0]=dp[u][0]×(dp[v][0]+dp[v][2])dp[u][0]=dp[u][0]\times(dp[v][0]+dp[v][2])dp[u][0]=dp[u][0]×(dp[v][0]+dp[v][2])dp[u][1]=dp[u][0]

2020-07-31 08:15:26 158

原创 CF960E Alternating Tree

一、题目点此看题二、解法一开始想对于每个根统计其子树贡献,但是难。换一个角度,由于加法是相对独立的,于是考虑每个点的贡献。有向路径有点麻烦,我们来分类讨论:xxx子树内->xxx->xxx子树外(包括xxx)xxx子树内(包括xxx)->xxx->xxx的另一个子树xxx子树外->xxx->xxx的子树(包括xxx)第我们需要处理出:子树内的和它距离为偶数的点数fdfdfd,子树内和它距离为奇数的点数gdgdgd,子树外的和它距离为偶数的点数fufuf

2020-07-30 16:18:09 199

原创 CF101D Castle

一、题目点此看题二、解法一看感觉就是贪心。主要问题在于确定访问子树的顺序,先访问的子树的会给后访问的子树叠加边权和的两倍,设这个值为fff,但还要考虑到子树大小,因为子树中的每个点都会增加这么多,综上可知比较的方法为:f[v0]×siz[v1]<f[v1]×siz[v0]f[v_0]\times siz[v_1]<f[v_1]\times siz[v_0]f[v0​]×siz[v1​]<f[v1​]×siz[v0​]然后就是据题意模拟统计即可。#include <cstd

2020-07-30 15:01:13 143

原创 CF935E Fafa and Ancient Mathematics

一、题目

2020-07-30 14:50:31 189 3

原创 CF1249F Maximum Weight Subset

一、题目点此看题

2020-07-30 09:05:12 144

原创 CF734E Anton and Tree

一、题目点此看题二、解法首先可以把相同的点缩在一起,这样树就变得黑白相间。缩点之后的染色可以层层染色(没有动图,自己脑补),假如一开始是个黑点,把它染成白的,就和周围的白点融为一体,再把这个整体染成黑的,又和周围黑的融为一体..................如此一来,每次扩展两个格子,那么答案就是直径+2+2+2懒得写并查集了,直接搞了个双dfsdfsdfs求直径,证明:https://www.cnblogs.com/handsome-zyc/p/11237529.html#include &

2020-07-29 21:12:27 141

原创 CF77C Beavermuncher-0xFF

一、题目点此看题二、解法对于每一个点,要考虑他到子树的走法。由于这个点要被根走到才能产生贡献,所以先预留一个海狸让父亲能走过来(根就特判),然后贪心地走到贡献最大的子树中去(因为可能海狸个数不够访问所有子树)如果还有剩余,那么就跟儿子来回走刷贡献。#include <cstdio>#include <vector>#include <algorithm>using namespace std;const int M = 100005;#define i

2020-07-29 20:08:45 152

原创 CF1223E Paint the Tree

一、题目点此看题二、解法我tmtmtm自己想出来了哈哈哈(跟标解的做法竟然一模一样?)题意转化应该很轻松吧,因为一种颜色只能染两次,所以对于一个点最多选其相连的kkk条边。然后就是套路了,设dp[u][0/1]dp[u][0/1]dp[u][0/1]为点uuu和它的子树选边,给不给父亲留一条返祖边(这个点选儿子方向的k−1k-1k−1或者kkk条边),转移有点意思,有两种转移方式:不选连向儿子的边,贡献是dp[v][0]dp[v][0]dp[v][0]选连向儿子的边,贡献是dp[v][1]+

2020-07-29 19:18:25 240

原创 CF486D Valid Sets

一、题目点此看题二、解法题目中要求最大点权与最小点权之差小于d,我们可以固定最大点权,这样判断点权的合法也方便,就容易算联通子图了。但是可能会算重,最大点权需要重新定义,如果点权相同需要比编号。算个数可以用树形dpdpdp,设dp[u]dp[u]dp[u]为以uuu为根,每个点权需要小于钦定点权,需要大于等于最大点权−d-d−d的联通子图方案数,转移:dp[u]=dp[u]+dp[u]×dp[v]dp[u]=dp[u]+dp[u]\times dp[v]dp[u]=dp[u]+dp[u]×dp[v]

2020-07-29 17:05:44 136

原创 [省选联考 2020 A 卷]作业题

一、题目点此看题二、解法学了好久的前置芝士才切掉这道题

2020-07-29 16:14:55 164

原创 CF1101F Trucks and Cities

一、题目点此看题二、解法可以把加油理解成划段,那么题目转化成求点[i,j][i,j][i,j]之间划kkk段最大的段的最小值是多少,对于所有的车算出这个值乘以ccc,然后取最大值就是打啊。设dp[i][j][k]dp[i][j][k]dp[i][j][k]为[i,j][i,j][i,j]划kkk段的最大段最小值,转移:dp[i][j][k]=max⁡(dp[i][l][k−1],t[j]−t[l])dp[i][j][k]=\max(dp[i][l][k-1],t[j]-t[l])dp[i][j][

2020-07-29 11:41:13 132

原创 CF888F Connecting Vertices

一、题目点此看题二、解法一开始有一个很直接的想法,设dp[i][j]dp[i][j]dp[i][j]为建出区间[i,j][i,j][i,j]的生成树的方案,转移:选中间的一个点作为桥梁:∑dp[i][k]×dp[k][j]\sum dp[i][k]\times dp[k][j]∑dp[i][k]×dp[k][j]本来是两部分,连了[i,j][i,j][i,j]之后合并了:∑dp[i][k]×dp[k+1][j]\sum dp[i][k]\times dp[k+1][j]∑dp[i][k]×dp[

2020-07-29 10:32:56 190

原创 CF1107E Vasya and Binary String

一、题目点此看题二、解法巧妙的定义,我可能这辈子都想不到。设dp[i][j][k]dp[i][j][k]dp[i][j][k]为区间[i,j][i,j][i,j]右边有kkk个和jjj颜色相同的格子,转移:删去jjj和后面kkk个格子:dp[i][j][k]=dp[i][j−1][0]+v[k+1]dp[i][j][k]=dp[i][j-1][0]+v[k+1]dp[i][j][k]=dp[i][j−1][0]+v[k+1]枚举一个和jjj颜色相同的格子ppp:dp[i][j][k]=dp[i

2020-07-29 10:19:13 142

原创 CF838E Convex Countour

一、题目点此看题

2020-07-29 09:38:31 230

原创 CF825F String Compression

一、题目点此看题

2020-07-28 19:39:55 228

原创 CF49E Common ancestor

一、题目点此看题二、解法设dp[i][j]dp[i][j]dp[i][j]为最少的s3s_3s3​大小,能生成s1s_1s1​的前iii个,s2s_2s2​的前jjj个,转移:dp[i][j]=dp[k−1][l−1]+1dp[i][j]=dp[k-1][l-1]+1dp[i][j]=dp[k−1][l−1]+1转移的条件是存在字符www能生成s2[k,i],s3[l,j]s_2[k,i],s_3[l,j]s2​[k,i],s3​[l,j],这个需要再处理一下。设ok1[i][j][w]ok1[i

2020-07-28 19:25:10 144

原创 CF1178F1 Short Colorful Strip

一、题目点此看题二、解法设dp[l][r]dp[l][r]dp[l][r]为现在还没有涂色,涂色完[l,r][l,r][l,r]的方案数,关键是转移。由于题目明说了染色是按颜色顺序从小到大,所以转移可以从这个区间最小的颜色入手,这个最小的颜色会把区间划分成444部分(因为这个点染完就固定了,是不可跨越的,就达到了分裂区间的效果),转移枚举染色段的左端点iii和右端点jjj,设最小的颜色位置是ppp:dp[l][r]=dp[l][i−1]×dp[i][p−1]×dp[p+1][j]×dp[j+1][

2020-07-28 15:04:42 228

原创 CF1336C Kaavi and Magic Spell

一、题目点此看题二、解法题目中的前缀,放前放后提示我们可以用区间dpdpdp了(虽然我也看不太出来)设dp[l][r]dp[l][r]dp[l][r]为SSS的前r−l+1r-l+1r−l+1项去填TTT的[l,r][l,r][l,r](可能超过mmm,但超过的话就随便填),转移就看s[r−l+1]s[r-l+1]s[r−l+1]能不能填到lll位置上,能不能填在rrr位置上。答案是∑i=mndp[1][i]\sum_{i=m}^n dp[1][i]∑i=mn​dp[1][i]#include &

2020-07-28 11:39:54 183

原创 CF39C Moon Craters

一、题目点此看题二、解法把每个圆表示成线段覆盖,判断相不相交只需要比较大小,所以我们可以先离散化。考虑使用区间dpdpdp,但一定要想清楚区间指的是什么,一开始我把区间理解成连续的若干个圆,发现根本做不动。而本题显然把区间理解成数轴上的区间更好做,定义dp[i][j]dp[i][j]dp[i][j]为区间[i,j][i,j][i,j]最多的圆数量,转移:dp[i][j]=dp[i][x]+dp[x][j]+g[i][j]dp[i][j]=dp[i][x]+dp[x][j]+g[i][j]dp[i]

2020-07-28 10:31:19 798 1

原创 CF1312E Array Shrinking

一、题目点此看题二、解法如果一个区间能化成一个数,那么这个数是固定的,我们可以用区间dpdpdp的方式O(n3)O(n^3)O(n3)地把它算出来。然后问题就变成了前iii个数化成最少的段,使每个段都能化成一个数,暴力dpdpdp是O(n2)O(n^2)O(n2)的。#include <cstdio>#include <iostream>using namespace std;const int M = 505;int read(){ int x=0,fl

2020-07-28 08:54:21 145

原创 CF788C The Great Mixing

一、题目点此看题二、解法把浓度减nnn,那么就不需要考虑选出来的个数了,只需要和为000就行了。不能用完全背包,因为答案可能选出100010001000,考虑一种类似于bfsbfsbfs的扩展方法,每个点只扩展一次,每次用所有的点扩展,这样就能保证操作在[−1000,1000][-1000,1000][−1000,1000]以内了,所以时间复杂度O(10002)O(1000^2)O(10002)#include <cstdio>#include <queue>#incl

2020-07-27 21:57:59 184

原创 CF243C Colorado Potato Beetle

一、题目

2020-07-27 21:47:14 218

原创 CF590C Three States

一、题目点此看题二、解法联通三个国家,换一个角度说,就是让三个国家在某一个点集合。预处理每个点到最近

2020-07-27 21:31:56 157

原创 CF453C Little Pony and Summer Sun Celebration

一、题目点此看题二、解法先判断有无解,如果有超过一个连通块有奇数需求的点就无解。对于我们需要操作的连通块,给出构造解的方法。首先搞一颗生成树,考虑遍历的过程,如果遍历整棵树,每个点会被访问子节点个数+1+1+1次,遍历序列长最多2n2n2n如果遍历后还是不满足,那么父亲节点再回到该点再走回去,这样该点的奇偶就会改变,这样新增的序列长最多2n2n2n但是根没有父亲,如果他不满足,我们最后一个点不回溯回根就行了。#include <cstdio>#include <vec

2020-07-27 09:06:54 137

原创 CF662B Graph Coloring

一、题目点此看题二、解法刚开始一看可能没有什么思路,但是这个问题很像染色,

2020-07-27 08:55:31 150

原创 CF877D Olya and Energy Drinks

一、题目点此看题二、解法考察搜索的优化,我们把访问标记设置成每个位置是从哪个方向来的,而不能直接标记,这是为了使kkk那部分的移动是连续的(一旦访问过就不用再做了,这样每个位置只能被访问一次),考虑下图:如此图,他们在bfsbfsbfs的同一层,假设红先访问并标记,如果我们的标记不考虑方向那么就不满足上述的性质。#include <cstdio>#include <queue>using namespace std;const int M = 1005;int r

2020-07-26 21:58:40 860

原创 CF540C Ice Cave

一、题目点此看题二、解法ppl yyds\text{ppl yyds}ppl yyds好巧的一道搜索题,可以分类讨论,如果终点是X,那么直接bfsbfsbfs。否则一定会走到周围一个好点再走回去,我们就枚举这个好点,暂时把它弄成坏的,看能不能跑到终点。#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>using namespace st

2020-07-26 16:13:37 152

原创 CF1098C Construct a tree

一、题目点此看题

2020-07-26 08:33:52 192

原创 CF949D Curfew

一、题目

2020-07-26 08:19:58 377

原创 CF248D Sweets for Everyone!

一、题目点此看题二、解法二分答案是显然的,但是检查有点难了,贪心地看,有这两种情况:

2020-07-25 10:32:46 121

原创 CF333E Summer Earnings

一、题目点此看题

2020-07-24 16:40:44 172

原创 CF1227E Arson In Berland Forest

一、题目点此看题

2020-07-24 16:33:47 185

原创 CF1132D Stressful Training

一、题目点此看题二、解法显然这个xxx可以二分,关键在于如何检查。我们肯定是去救最危险的,怎么定义这个危险呢?用a[i]/b[i]a[i]/b[i]a[i]/b[i],也就是能承受的天数。#include <cstdio>#include <queue>using namespace std;#define int long longconst int M = 200005;int read(){ int x=0,f=1;char c; while((c=g

2020-07-24 16:27:12 154

原创 CF808E Selling Souvenirs

一、题目点此看题

2020-07-24 07:42:55 162

原创 CF626E Simple Skewness

一、题目点此看题

2020-07-24 07:27:42 204

原创 CF620D Professor GukiZ and Two Arrays

一、题目点此看题

2020-07-23 22:03:10 171

原创 CF404E Maze 1D

一、题目点此看题二、解法只可能安放111个或者不安放障碍物,可以一开始模拟一下来判断要不要安放障碍物。把移动理解为数轴上的移动,如果最后一次是+1+1+1,那么障碍物位置一定是负数,否者障碍物位置一定是正数。然后考虑,如果一个离000较远的障碍物可以,那么一个离000较近的障碍物一定可以,因为离000较近的障碍物会挡掉更多的反向移动,那么最后的位置就比额定的位置更远,就合法了,这就是本题可以二分的原因。#include <cstdio>#include <cstring>

2020-07-23 16:52:59 129

空空如也

空空如也

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

TA关注的人

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