自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Better-Mybatis-Generator插件登录失败的问题

第一次使用Better-Mybatis-Generator插件登录失败解决方法第一次使用这个插件生成mybatis相关文件的时候,它会让你输入一次你的数据库的账号密码,但是有时明明账号密码都是正确的,还是会弹出登录失败的窗口。这个插件的GitHub网站上有一个提示。加上这个时区设置即可。...

2022-02-09 22:51:12 1468 1

原创 第十八届同济大学程序设计竞赛H.三阳开泰(数位dp+二进制)

题目传送门题意给你T(1≤T≤100)T(1\le T \le 100)T(1≤T≤100)组询问,每次询问四个数A,B,C,X(1≤A,B,C,X≤1018A,B,C,X(1\le A,B,C,X\le 10^{18}A,B,C,X(1≤A,B,C,X≤1018,问你有多少个三元组(a,b,c)(a,b,c)(a,b,c)满足aaa xor b≤Xb\le Xb≤X,aaa xor c≤Xc\le Xc≤X,bbb xor c≤Xc\le Xc≤X。思路这个数据范围很容易想到数位dp,要是加上下限

2021-05-22 19:13:00 290

原创 P4318 完全平方数(莫比乌斯反演+二分)

题目传送门题意给出T(1≤T≤50)T(1\le T\le 50)T(1≤T≤50)组询问,每次询问一个K(1≤K≤109)K(1\le K\le 10^9)K(1≤K≤109),问你第KKK个不是完全平方数的整数倍的数是多少?(完全平方数如4,9,16...4,9,16...4,9,16...,不包含111)。思路显然,KKK和我们的答案之间是有单调性的,我们设f(x)f(x)f(x)为小于xxx的合法的数的数量。那么根据容斥原理,f(x)=∑i=1nμ(i)∗⌊ni2⌋f(x)=\sum\li

2021-05-18 23:00:31 233

原创 P1390 公约数的和(莫比乌斯反演)

题目传送门题意:给你一个n(1≤n≤2∗106)n(1\le n\le 2*10^6)n(1≤n≤2∗106),求∑i=1n∑j=i+1ngcd(i,j)\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{n}gcd(i,j)i=1∑n​j=i+1∑n​gcd(i,j)。思路:稍微对这个式子改写一下,变成了∑i=1n∑j=1ngcd(i,j)−(1+n)∗n22\cfrac{\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}gcd(i

2021-05-18 22:17:06 146

原创 P2257 YY的GCD(莫比乌斯反演,多组询问)

题目传送门tips:本题是题P2568的强化版,如果不会本题可以先试试P2568。题意:给出T(1≤T≤104)T(1\le T\le 10^4)T(1≤T≤104) 组询问,每组询问一对n,mn,mn,m,让你求出:ans=∑i=1n∑j=1m[gcd(i,j)∈{prime}]ans=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\left[gcd(i,j)∈\{prime\}\right]ans=i=1∑n​j=1∑m​[gcd(i,j)∈{prime}]

2021-05-18 21:21:32 77

原创 P2568 GCD(莫比乌斯反演)

题目传送门题意:给你一个正整数n(1≤n≤107)n(1\le n\le10^7)n(1≤n≤107),求出满足1≤x≤n,1≤y≤n,gcd(x,y)∈prime1\le x \le n,1 \le y \le n,gcd(x,y)∈prime1≤x≤n,1≤y≤n,gcd(x,y)∈prime的x,yx,yx,y的对数。思路一:莫比乌斯反演ans=∑i=1n∑j=1n[gcd(i,j)∈prime]=∑p∈prime∑i=1n∑j=1n[gcd(i,j)=p]=∑p∈prime∑i=1⌊np⌋∑

2021-05-18 15:24:19 178

原创 P2522 [HAOI2011]Problem b(莫比乌斯反演)

题目传送门题意:nnn组询问,每次询问a,b,c,d,ka,b,c,d,ka,b,c,d,k,求ans=∑i=ab∑j=cd[gcd(i,j)=k]ans=\sum\limits_{i=a}^{b}\sum\limits_{j=c}^{d}[gcd(i,j)=k]ans=i=a∑b​j=c∑d​[gcd(i,j)=k]。思路:设f(n,m)=∑i=1n∑j=1m[gcd(i,j)=k]f(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)=k

2021-05-17 19:40:47 88

原创 P1447 [NOI2010] 能量采集(莫比乌斯反演)

题目传送门题意:在一个n∗mn*mn∗m的矩阵上,将每个点和点(0,0)(0,0)(0,0)连起来,假设线段上除了两端点有kkk个点,这个点的贡献是2∗k+12*k+12∗k+1,求这n∗mn*mn∗m个点的贡献和。思路:可以知道,假设有点(i,j)(i,j)(i,j),(i,j)(i,j)(i,j)的贡献是2∗gcd(i,j)−12*gcd(i,j)-12∗gcd(i,j)−1。那么答案显而易见:ans=∑i=1n∑j=1m(2∗gcd(i,j)−1)=2∗∑i=1n∑j=1m(gcd(i,j))−

2021-05-17 18:51:07 137

原创 2020ICPC 江西省赛 A.A Simple Math Problem(莫比乌斯反演)

题目传送门题意: 定义f(i)f(i)f(i)是数字iii的数位和,f(123)=1+2+3f(123)=1+2+3f(123)=1+2+3。求∑i=1n∑j=1i[gcd(i,j)==1]f(j)\sum \limits_{i=1}^{n} \sum \limits_{j=1}^{i} [gcd(i,j)==1]f(j)i=1∑n​j=1∑i​[gcd(i,j)==1]f(j) 。思路: 这个式子一眼就是莫比乌斯反演,但是队友容斥就过了。推式子过程:∑i=1n∑j=1i[gcd(i,j)==1]

2021-05-15 23:23:02 278

原创 2020ICPC 江西省赛 H.Sequence(线段树+二分)

题目传送门题意: 给你一个长度为nnn的数列,进行mmm次询问,每次询问分两种,第一种输入x,yx,yx,y,a[x]:=ya[x]:=ya[x]:=y,第二种输入xxx,询问有多少个包含a[x]a[x]a[x]的子区间,区间最小值为a[x]a[x]a[x],题目保证数列里所有出现的数两两不同。思路: 首先线段树维护一下区间最小值,修改的时候直接修改就行了没什么好说的,查询的时候就是查询[0,x−1][0,x-1][0,x−1]内最后一个比a[x]a[x]a[x]小的位置,[x+1,n+1][x+1,n

2021-05-15 19:23:03 247

原创 2020ICPC 江西省赛 L.WZB‘s Harem(状压dp)

题目传送门题意: 给你一个n∗n(n≤20)n*n(n\le20)n∗n(n≤20)的图,图上有000和111两种数字,现在有nnn个互不相同的皇后,你需要将这nnn个皇后放在000的位置上,并且保证这nnn个皇后之间不存在任意两个皇后处于同一行、同一列,问你有多少种放法。思路: 很像n皇后问题,但是数据太大了爆搜肯定不行。但是这个数据很容易让人想到状压dp。我们可以考虑用f[i][j]f[i][j]f[i][j]表示放完第iii行,现在状态为jjj的方案数。状态jjj可以描述为前iii行放置的皇后的位

2021-05-15 19:07:41 267

原创 G. Old Floppy Drive(st表+二分套二分,1900)

题意: 给你一个环形的磁盘,对于磁盘的n个区域,每个区域有一个整数aia_iai​,你每次会将指针放到1号位置,它从1走到n,因为是环形,n之后又是1。他对你进行m次询问,每次询问有一个数x,每当你的指针指向一个区域,会对贡献加上当前区域的值(可重复),当贡献至少为时,指针停下,让你输出指针每次走的步数。思路: 显然,我们可以对走过的圈数进行二分,因为这显然有单调性。证明:我们使用sumisum_isumi​记录前i项的和。如果sumn>0sum_n>0sumn​>0,那么单调性显

2021-05-14 23:28:08 131

原创 C. Pekora and Trampoline(思维题)

题目传送门题意: 给你一些蹦床,每个蹦床的高度为sis_isi​,你每次可以任意选一个蹦床起跳,跳到si+is_i+isi​+i的位置,并且这个蹦床的高度减少1(最小为1,如果是1则不减。),问你至少需要跳多少次,才能让所有蹦床的高度变成1。思路: 我们可以先考虑每个蹦床对后面蹦床的影响,即一个高度为hhh的蹦床,在他变成1之前,可以跳到区间[h+2,min(n,h+posh)][h+2,min(n,h+pos_h)][h+2,min(n,h+posh​)]内每个点各一次(h+1的时候,高度已经是1了,

2021-05-14 17:34:18 232

原创 卡特兰数总结

卡特兰数经典模型:有nnn个000和nnn个111,有多少种排列方式使得任意一个前缀中,111的个数不少于000的个数?卡特兰数经典模型的证明:我们可以在数轴上看这个问题,从原点出发,将111看成向右上走一步,000看成向右下走一步,那么走完这2n2n2n步会到达点(2n,0)(2n,0)(2n,0)。不做限制时的走法是C2nnC_{2n}^nC2nn​,即在2n2n2n步中选nnn步放111。当我们加上限制,任意一个前缀中,111的个数不少于000的个数,那么我们的路线不可能触碰到 y=−1y=-1y=

2021-04-26 19:13:18 304

原创 C. Product 1 Modulo N(裴蜀定理、逆元)

题目传送门题意: 给你一个正整数nnn,让你在区间[1,n−1][1,n-1][1,n−1]中找出一个最长子序列tit_iti​,使得∏i=1ktimod  n=1\prod\limits_{i=1}^k t_i \mod n=1i=1∏k​ti​modn=1。思路: 首先,假定我们选择的序列包含数aaa,设其他数的乘积为x(mod  n)x(\mod n)x(modn),那么就有a∗x≡1(mod  n)a * x ≡1(\mod n)a∗x≡1(modn),也就是xxx是aaa的逆元。那么aaa就要

2021-04-20 10:30:35 1065 7

原创 P3455 [POI2007]ZAP-Queries(莫比乌斯反演)

题目传送门题意: TTT组询问,给你 a,b,da,b,da,b,d,求出1<=x<=a,1<=y<=b,gcd(x,y)=d1<=x<=a,1<=y<=b,gcd(x,y)=d1<=x<=a,1<=y<=b,gcd(x,y)=d 的数量。思路: 以下推导中,除法均为整数。f(d)=∑x=1a∑y=1b[gcd(x,y)=d]f(d) = \sum_{x=1}^a \sum_{y=1}^b [gcd(x,y)=d]f(d)=∑x

2021-04-15 00:04:19 132

原创 中国剩余定理及其拓展

中国剩余定理求下列同余方程组的解(保证ni,njn_i,n_jni​,nj​两两互质):x≡a1(mod  n1)x≡a_1(\mod n_1)x≡a1​(modn1​)x≡a2(mod  n2)x≡a_2(\mod n_2)x≡a2​(modn2​)x≡a3(mod  n3)x≡a_3(\mod n_3)x≡a3​(modn3​)…x≡ak(mod  nk)x≡a_k(\mod n_k)x≡ak​(modnk​)唯一解:ans≡∑ai∗ci(mod  M)ans≡\sum a_i*c_i(\

2021-04-05 14:38:55 125

原创 UVA11327 Enumerating Rational Numbers(欧拉函数)

题目传送门题意:for d = 1 to infinity do for n = 0 to d do if gcd(n,d) = 1 then print n/d执行上述伪代码,给定k,打印第k个输出。思路: 对于一个ddd,一般的,它会有φ(d)φ(d)φ(d)个输出,特殊的d=1d=1d=1时,会有两个输出。那么直接对欧拉函数做一个前缀和,然后二分查询k的位置,最后枚举找答案就行。单次查询的时间复杂度为O(nlogn)O(nlogn)O(nlogn)。代码:#include<b

2021-04-04 23:54:09 133

原创 UVA12775 Gift Dilemma(exgcd)

题目传送门题意: 给定T(T<=100)T(T<=100)T(T<=100)组A,B,C,P(A,B,C,P<=1e8)A,B,C,P(A,B,C,P<=1e8)A,B,C,P(A,B,C,P<=1e8),问你每组的数组中,有多少种方法使得Ax+By+Cz=PAx+By+Cz=PAx+By+Cz=P。保证C/gcd(a,b,c)>=200C/gcd(a,b,c)>=200C/gcd(a,b,c)>=200。思路: 因为至少保证了C/gcd(a,b,c

2021-04-01 17:30:45 315

原创 exgcd

题目传送门对于不等式:ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b),给定a,ba,ba,b,求出符合条件的一组x,yx,yx,y。推导: (假定a>=b)1.ax1+by1=gcd(a,b)ax_1+by_1=gcd(a,b)ax1​+by1​=gcd(a,b)2.bx2+a%by2=gcd(b,a%b)bx_2+a\%by_2=gcd(b,a\%b)bx2​+a%by2​=gcd(b,a%b)3.gcd(a,b)=gcd(b,a%b)gcd(a,b)

2021-03-25 16:23:48 152

原创 Meissel-Lehmer算法(求N以内素数个数)

比欧拉筛快。#define MAXN 100 // pre-calc max n for phi(m, n)#define MAXM 10010 // pre-calc max m for phi(m, n)#define MAXP 40000 // max primes counter#define MAX 400010 // max prime#define setbit(ar, i) (((ar[(i) >> 6]) |= (1 << (((i) >

2021-03-24 22:52:31 589

原创 E. Number With The Given Amount Of Divisors(dfs)

题目传送门题意: 找出一个因子数恰为n 的最小的正整数。(n<=1000,保证答案在1e18以内)思路: 深度优先搜索,我们可以知道,答案保持在1e18以内,就算前几个质因数都只出现一次,也最多16个质因数,所以只需要考虑前16个质因数。搜索的时候需要采用剪枝技巧:即小的质数出现的幂次一定比大的质数出现的多。如果大的质因数出现过,比他小的质因数一定出现过。解释:1.如果小的质因数出现幂次比大的少,那可以交换这两个质因数的幂次使得答案更小。2.如果大的出现过,小的没出现过,那么可以让小的

2021-03-23 21:38:16 148

原创 Atcoder abc194_F - Digits Paradise in Hexadecimal(状压+数位dp)

题目传送门题意: 给你一个长度为2e52e52e5的16进制数NNN,问你在[1,N][1,N][1,N]范围内的16进制数中,有多少个数的数位上有且仅有KKK个不同的数。思路: 数位dp,f[pos][cnt]表示搜到第pos位,已经有cnt个不同的数时,到达终点的方案数,每次转移的时候有两种情况,第一是目前搜到的全是0且下一个还是0,第二是其他情况。对于全是0的情况,如果再碰到0,这个0并不能计入贡献。对于其他情况,我们使用二进制数去压缩已经搜过的数。最后搜完的时候,我们只需要判断当前二进制数

2021-03-11 22:18:50 245

原创 P4127 [AHOI2009]同类分布(数位dp)

题目传送门题意: 给出两个数a,b,求出[a,b]中各位数字之和能整除原数的数的个数。思路: 因为a和b的范围都是101810^{18}1018,位数和最多能达到18*9=162,所以我们枚举位数和,统计可以整数这个位数和的原数个数,原数必须保证位数和与枚举的一致。考虑使用状态f[pos][sum][mod]记录当搜索到第pos位,原数模位数和为sum,位数和为mod的情况下,到达终点的方案数。思路:#include<bits/stdc++.h>#define endl '\n'#d

2021-03-10 14:13:47 162

原创 P2602 [ZJOI2010]数字计数(数位dp)

题目传送门题意: 给定两个正整数 aaa 和 bbb,求在 [a,b][a,b][a,b] 中的所有整数中,每个数码(digit)各出现了多少次。思路: 数位dp模板题,从0到9分别统计每个数位出现次数即可。代码:#include<bits/stdc++.h>#define endl '\n'#define mp make_pair#define pb push_back#define ll long long#define int long long#define pii

2021-03-10 14:08:19 210

原创 HDU 2089 不要62(数位dp)

题目传送门题意: 在给定区间[n,m][n,m][n,m]内,寻找有多少个数字的数位中,不包含4或者62。思路: 考虑使用前缀和思想,ans[i]ans[i]ans[i]表示从[0,i][0,i][0,i]中有多少个符合的数字,处理出ans[m]−ans[n−1]ans[m]-ans[n-1]ans[m]−ans[n−1]。代码:#include<bits/stdc++.h>#define endl '\n'#define mp make_pair#define pb push_b

2021-03-06 15:29:07 145

原创 P2051 [AHOI2009]中国象棋(dp)

题目传送门题意: 在一个n*m的棋盘上摆放象棋中的“炮”,让他们不会互相攻击,问你有多少种摆法。(不摆也算一种)。思路: f[i][j][k]表示摆放了前i行,有j列放了1个,k列放了2个的时候的方案数,每次转移考虑怎么放这些炮就行了。代码:#include<bits/stdc++.h>#define endl '\n'#define mp make_pair#define pb push_back#define ll long long#define int long lon

2021-02-02 00:54:25 164

原创 P1879 [USACO06NOV]Corn Fields G(状压dp)

题目传送门题意: 有一张大小为N*M的由0/1组成的地图,你可以在标有1的地方种草,但是你种的任意两块草不能有公共边,问你有多少种不同的方案(不种也是一种方案)?(N<=12,M<=12)思路: 看到这个数据范围我们很容易想到用二进制去压缩每一行,在同一行合法的情况去考虑每一行同时合法。我们先预处理出一行内所有可能的情况,然后根据输入的地图,用二进制将0标出,用于判断一个情况是否在该行合法。然后枚举所有情况,f[i][j]表示前i行,第i行是状态j时的方案数,同时需要枚举一个状态k,表示第i

2021-02-01 23:32:54 145

原创 P2704 [NOI2001] 炮兵阵地(状压dp)

题目传送门题意: 给你一张N*M大小的由P和H组成的地图,在点P上你可以放置炮兵,炮兵的攻击范围如图,问你这张地图中最多放多少个炮兵从而让他们不会互相攻击。(N<=100,M<=10)思路: 每一行的状态用二进制压缩,1为放置炮兵,0为不放置。最开始把每一行中炮兵不会互相攻击的状态全部处理出来,然后输入地图的时候把所有H看成1,方便后面枚举的时候判断某个状态是否在第i行适用(两个状态按位与为0则适用)。用f[i][j][k]表示前i行,第i行状态为j,并且第i-1行状态为k时,可以放置最大炮

2021-02-01 02:44:43 165

原创 P1896 [SCOI2005]互不侵犯(状压dp)

题目传送门题意: 在一个n*n的棋盘上放k个国王,让他们互不攻击,问你有多少种放置的方案。(一个国王会攻击与之相邻的8个格子里的国王。)(1 <=n <=9, 0 <= k <= n * n)思路: 我们可以先预处理出单独一行时,合法的放置情况。然后我们用f[i][j][q]f[i][j][q]f[i][j][q]表示放完了前i行,第i行状态为j,总共放了q个的时候的方案数。i和q都好表示,但是我们需要考虑如何表示当前行状态j。考虑到一行最多9个,我们可以用二进制去表示,一个9位

2021-01-31 01:19:40 158

原创 A. Sticker Album(期望dp)

题目传送门题意: 你要凑齐n张卡片,市面上有一些卡片包,每一包中有一些卡片,每一包中卡片的数量独立,为[a,b]区间中的随机整数值,问你期望买多少包,才能凑齐n张卡片。思路: 考虑用f[i]表示当手里有i张卡片的时候,还期望需要购买多少包。那么出状态f[n]=0,我们要求f[0]。明确目标之后考虑状态转移,我们买一包,至少得到a张卡片,至多得到b张卡片。那么f[i]就要从f[i+a]~f[i+b]转移过来,即f[i]=∑(f[j]+1)b−a+1,j∈[i+a,i+b]f[i]=\sum \frac{(

2021-01-26 22:49:07 471

原创 P2986 [USACO10MAR]Great Cow Gathering G(换根dp)

题目传送门本题是这题的延伸。题意: 有一颗树,你可以选定一个根节点,这个根节点的代价是∑c[i]∗dis[i]\sum c[i]*dis[i]∑c[i]∗dis[i],c[i]c[i]c[i]表示点i的点权值,dis[i]dis[i]dis[i]表示点i到根节点的距离。思路: 先处理出以1为根节点的时候的代价,然后再遍历这棵树,根据方程转移即可。f[to]=f[x]−siz[i]∗dis(x,to)+(totc[i]−siz[i])∗dis(x,to)f[to]=f[x]-siz[i]*dis(x

2021-01-23 16:27:06 166 2

原创 POJ 3585 Accumulation Degree(换根dp)

题目传送门题意: 有一颗树,树上的每条边有一个流量限制,一个节点的流量值为从它出发最多能到达叶子节点流量的总和。问你最大的流量值是多少?思路: 先以1为根遍历这棵树,用sum[i]表示子树i的最大流量,f[i]表示以i为根节点时,整棵树的最大流量。当我们从节点x转移到它的子节点y时,可以推导出状态转移方程式:sum[x]+=(du[y]==1)?dis(x,y):min(sum[y],dis(x,y))sum[x]+=(du[y]==1)?dis(x,y):min(sum[y],dis(x,y))s

2021-01-23 02:27:03 106

原创 P3478 [POI2008]STA-Station(换根dp)

题目传送门题意: 有一颗树,问你选哪个节点为根节点时,所有节点深度之和最大?思路: 先以1为根,求出每个点的深度和以该节点为根的子树大小。f[x]f[x]f[x]表示以x为根节点时,所有节点的深度之和,再深搜一遍,如果y是x的子节点,那么f[y]=f[x]−siz[y]+(n−siz[y])f[y]=f[x]-siz[y]+(n-siz[y])f[y]=f[x]−siz[y]+(n−siz[y]),即从x作为根节点转化成从y作为根节点,y的子树中所有点的深度-1,其他所有点深度+1,从而得到了这个状态转

2021-01-23 00:13:11 268 1

原创 P2014 [CTSC1997]选课(树上分组背包)

题目传送门题意: 有一颗以0为虚根的树,每个节点有一个权值,让你选择m个点(点0不算),让权值之和最大,前提是要选择一个点,他的父亲节点必选。思路: 首先将点0的权值看成0,那么就是选m+1个点出来,并且必选0。然后考虑做背包。因为每个根节点的子树中,你可以选择选/不选这棵子树,并且如果选择这棵子树,这棵子树中只有一种方案可以被拿去做背包。所以我们考虑是分组背包。用f[x][cnt][y]f[x][cnt][y]f[x][cnt][y]表示以x为根节点的子树中,在x的前cnt个子树中,共合法地选择了y个

2021-01-22 02:08:21 435

原创 P3574 [POI2014]FAR-FarmCraft(树形dp)

题目传送门题意: 有一颗树,你在根节点1,从1出发经过每个点恰好一次,经过每条边的时间为1,每个点有一个权值a[i],每个点在第一次经过的时候就开始计时,a[i]秒之后结束。特殊的:点1的计时是最后开始。问:你最短需要多长时间让所有点都计时结束。思路: f[x]f[x]f[x]表示以x为根节点的子树需要的最短时间。假设y是x的一颗子树,那么就有:f[x]=a[x]f[x]=a[x]f[x]=a[x]f[x]=max(f[x],f[y]+siz[x]y+1)f[x]=max(f[x],f[y]+s

2021-01-22 00:15:13 171 1

原创 POJ 1463 Strategic game(树形dp)

题目传送门题意: 给你一颗树,问你至少选出多少个点来放置哨兵,才能让这棵树上所有的边都被哨兵监管到。一个哨兵可以监管到所有与他放置点有关的边。思路: 考虑用f[i][0/1]f[i][0/1]f[i][0/1]表示点iii作为根的子树全部能监管到的时候,点iii放/不放哨兵,这颗子树需要放置的最少哨兵数量。那么就有状态转移方程:f[i][0]=∑f[sonj][1]f[i][0]=\sum f[son_j][1]f[i][0]=∑f[sonj​][1]f[i][1]=∑min(f[sonj][0],

2021-01-19 21:01:50 96

原创 HDU 2196 Computer(树形dp)

题目传送门题意: 有n个点,保证可以组成一颗树,每两个点之间有一个距离s,现在让你求出,对于每个点,与其距离最远的点的距离是多少?思路: 用f[i]f[i]f[i]表示与点i距离最远的点与点i之间的距离,先两边dfs求出树的直径,直径两个端点的答案肯定是树的直径,然后我们dfs把直径两个端点的这条树链上的点的f[i]都可以更新出来,最后dfs一遍求出其他点的距离即可,其他点的距离肯定是其前驱节点的距离加上前驱结点与这个点的距离。代码:#include<bits/stdc++.h>#de

2020-12-24 23:54:50 144

原创 P1352 没有上司的舞会(树形dp)

题目传送门题意: 在一个学校里,有n个人,他们之间的关系可以描述成一颗树,树上的父节点是其子节点的直属上司。现在学校要举办一个聚会,每个人来参加聚会,会产生a[i]的贡献,但是如果一个人的直系上司来参加聚会,那么这个人无论如何都不会来参加。问你能够产生的最大贡献是多少?思路: 我们先找到入度为0的根节点,由根节点向下dfs,用f[i][0/1]f[i][0/1]f[i][0/1]表示第i个人 不来/来 的时候,他的子树能够产生的最大贡献。那么状态转移就有两种:f[x][1]+=max(0,f[x][

2020-12-24 22:57:43 135

原创 UVA - 437 The Tower of Babylon(基于DAG的dp)

题目传送门题意: 有n(n<=30)种长方体方块,给定他们的长宽高,每一种长方体有无限个,现在要把这些长方体堆积成一个高塔,要求是下面的长方体的长和宽要严格大于上面的长方体,每个长方体你可以任意旋转。问你能够堆积成的高塔的最高高度是多少?思路: 既然我们可以随意旋转长方体,那么我们每一种长方体就有6种(3的排列),我们最多可以获得180个方块,然后我们可以根据长和宽的关系对这个问题进行建图,建成一个有向无环图(DAG),这时候我们就可以拓扑排序求得结果。代码:#include<bits/

2020-12-24 22:07:55 119

空空如也

空空如也

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

TA关注的人

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