自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 P2577 [ZJOI2004]午餐(动态规划)

//这真的是绿题嘛。。。比之前做过的蓝紫都不好理解啊感觉。传送门显然,感性理解,我们知道吃饭慢的先打饭,所以先排个序如果现在开三维,dp【i】【j】【k】,第一维表示前i个人,j表示一队排队时间,k表示二队排队时间。val表示排完的最小值。因为时间空间不够,所以考虑降到二维,因为前i个人j+k的排队时间是固定的。所以可以减去一维。dp【i】【j】代表前i个人,第一队排队时间为j的最小值。当到第i个人,这个人可以选择去第一队或者第二队。如果在第一队,如果前i-1个人吃完饭的时间比第i个吃完饭的

2021-04-26 23:38:22 216

原创 区间dp

HDU - 4283 看注释。。。#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#define LL long longusing namespace std;const int maxn=110;const int inf=0x3f3f3f3f;int a[maxn],sum[maxn];int dp[maxn][maxn];int m

2021-04-15 00:11:39 122

原创 P1220 关路灯(区间dp)

传送门定义状态为dp[i][j][0/1],表示把i到j关灯后消耗的最小功率,0代表在位置i,1代表在位置j,因为关灯时间不计,所以最后位置要么在0要么在1。假设要到当前位置 i,可以从前面一段枚举的区间 【i+1,j】的左或右端点转移过来,以为枚举的区间已经都灭灯了,所以我们计算这段区间以外的消耗,再乘以走这段的时间就行。那么算当前位置也可能是从前面一直走过来的,即区间【i,j-1】,然后再加上这段区间以外的消耗。看看从i还是j-1,同上。。#define _CRT_SECURE_NO_WARNI

2021-04-14 14:56:14 147

原创 P1450 [HAOI2008]硬币购物(背包,容斥)

传送门我们可以先预处理出完全背包时的方案数现在考虑不合法的方案数,如果超过了d[i]个,那么就减去(d[i]+1)*c[i]个,那么意思就是现在从dp[0]开始,无论我怎么选,他都是不合法的。#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#define LL long longusing namespace std;const int maxn=

2021-04-12 23:32:07 101

原创 P4071 [SDOI2016]排列计数(全错排)

传送门全错排递推为D[x]=(x-1)*(D[x-1]+D[x-2])B站推导#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<vector>#include<queue>#include<sta

2021-04-12 17:04:36 97

原创 Codeforces Round #714 (Div. 2)

B. AND Sequences传送门因为要每一个子区间与的结果相同。所以我们可以先求所有数与的结果。如果这个数的数量小于2,那说明没有。如果大于等于2,就相当于选2个放头尾,中间部分全排列,注意头尾是A(x,2)注意开 long long#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>

2021-04-12 15:37:42 99

原创 HDU - 6397(容斥,组合数)

传送门如果只有k个整数,使a1+a2+a3+…+am=k这种情况可以看成有k个小球放进n个盒子里。盒子允许为空。使用隔板法我们可以知道总共的方案数C(k+m-1,m-1),相当于把m-1个隔板放进球里面,然后我们选出m-1个变成隔板,其他就是球了。现在题目还有条件,要求ai<=n.现在我们假设有i个数大于等于n,那我们就把式子转换为a1+a2+…am=k-in,怎么理解呢,因为ax>=0,现在有减去in,说明至少有i个位置是大于等于n的,所以减去,但这样我们又减多了,这不就是容斥了嘛。

2021-04-12 15:26:25 109

原创 1089. 烽火传递(单调队列优化dp)

传送门dp【i】表示以i为结尾的合法方案最小值。转移方程为,要么选当前值,即dp【i-1】+a【i】要么选i-k+1到i-1中的最小值。即f【i】=dp【i-1】+a【i】然后单调队列维护即可。做了两题能自己推了qaq#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include&lt

2021-04-11 00:16:16 76

原创 1087. 修剪草坪(单调队列优化dp)

传送门dp[i]表示以i为结尾的合法方案的最大值不如i不选,那么最大就是dp[i-1].如果选,那么就是i-k到i中选一个最大的j (不选 j 的最大值),然后再答案就是dp[j-1]+sum[i]-sum[j]#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<strin

2021-04-10 23:24:33 147

原创 135. 最大子序和(单调队列)

传送门先预处理出前缀和,然后就相当于找i-m到i的最小值,所以用单调队列维护。#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<vector>#include<queue>#include<stac

2021-04-10 16:21:39 79

原创 CF1349B Orac and Medians (思维)

传送门我们记比k大为1,小于为-1,所以当连续三个数和大于0时说明可以~。然后就还有一些特判。。看代码。。#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<vector>#include<queue>#

2021-04-10 00:31:29 164

原创 CF1304E 1-Trees and Queries(lca,思维)

传送门因为每个可以重复走,所以当dist <= k 时并且奇偶性相同,则可以到达。现在增加 x 到 y 的一条路,问你能不能满足条件。给你的路要么走要么不走,不走 tmp1= dist (a,b)走时要么从先走x,要么先走y所以就是 tmp2 = dist(a,x) + dist(b,y) +1 //1为x走到y。tmp3 = dist(a,y) + dist(b,x) +1,然后判断有没有满足的要求就行了。#define _CRT_SECURE_NO_WARNINGS#inclu

2021-04-08 01:01:11 186 2

原创 CF1304C Air Conditioner(贪心)

传送门每次都可以调温度,调高或者调低,所以到当前温度就会有一个区间。也就是每次都求出一个温度变化区间,然后与当前客人的温度区间求一个交集。当没有交集则说明无法满足。#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#define P pair<int,int>#define LL long lon

2021-04-08 00:52:03 108

原创 HDU - 6333(莫队,组合数)

传送门要求C (n,0) + C (n,1) + C (n,2) + … + C (n,m)即S (n,m)很明显,S (n,m) = S (n,m-1) + C (n,m)由杨辉三角可以得到,S (n,m) = 2 * S (n-1,m) - C (n-1, m)然后就用莫队,暴力(优雅…)地求出每个答案#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algo

2021-04-08 00:46:26 89

原创 Stone Games(icpc昆明,主席树)

传送门没怎么做过主席树的题,感觉思路好难想。。。假设[1,x]中每个数都可以被表示出来,如果现在加个y,y属于[1, x],那么[1, x+y]这段区间也可以被表示出来,如果[1 ,x+y]这段区间又有新的数,那么这段区间又会增加。所以我们s从0开始,每次查询[1,s+1]这段区间的和,如果不变说明答案就是s+1,否则就继续找。为什么是到s+1呢,因为你1到s都可以表示出来,那么如果有值为s+1,那么s+1就可以表示出来,否则就不能,也就找到答案了。我们用主席树维护第i棵树在[x,y]这个值域的和

2021-04-08 00:38:19 179

原创 Parallel Sort(icpc昆明站,思维,构造)

//qaq打铁人传送门每个不在属于自己的数都是串成一些环我们可以找到x个环,把这个环转一次就能得到有序序列。//从图中的1转到2很明显,如果这些环中最大的只有两个,那么我们只要一次操作就可以得到有序序列了。如果大于2,那我们把图1变成图3,然后由图三就是变成有序序列了,所以答案最多为2。图1变图3,其实就是把第一归位,然后倒数第一个放在第二位,第二位放在倒数第一,以此类推,所以第二次从第二位开始交换就能得到有序序列了。#include<stdio.h>#include<i

2021-04-08 00:24:20 249

原创 1312. 序列统计(组合数)

传送门当L <= a1 < a2 < a3 < … < ak <= R,在这段区间中选m个,答案为C (R-L+1,m)现在是L <= a1 <= a2 <= a3 … <= ak <=R,现在要在这段区间选m个,我们要想办法转成上面那种情况。于是我们可以把它映射成 b1=a1+0,b2=a2+1,… bk=ak+k-1所以这段区间变成L <= b1 < b2 < b3 < … < bk <=R+k

2021-04-08 00:05:49 105

原创 AcWing 1310. 数三角形(组合数)

数三角形简单容斥。先算所有任取3点的方案数。难的是求出不合法的方案数。第一种是三点都在同一条横线。第二是三点都在同一条竖线上。第三种是在同一条斜线上。我们先求出斜率大于0的情况,小于的和大于0的一样。我们可以来枚举这条斜线的宽和高。gcd(i,j)-1求出这条斜线中间的点数#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#inc

2021-03-31 23:26:36 254

原创 CodeCraft-21 and Codeforces Round #711 (Div. 2)

CF1498B Box Fitting从大到小二进制枚举。。。。#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<vector>#include<queue>#include<stack>#

2021-03-30 22:39:47 92

原创 单调栈的题~

Early Orders题目大意,找出字典序最小的一个子序列感觉像单调栈却不知道怎么写~用一个数组记录这个数字出现的最远位置,然后就维护一个单调栈,如果当前要加入的数比栈顶小,并且栈顶的数出现是位置比当前远,那么就让它出栈。就这样。。#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<iostream>#include<algorithm>#include<string>#inclu

2021-03-29 23:13:43 72

原创 acwing1081. 度的数量(数位dp)

传送门分析题意我们可以发现,我先最后就是看b进制下放k个1的合法方案数,详细看代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<string>#include<vector>#include<queue>#include<c

2021-03-16 13:14:25 101

原创 Devu和鲜花(组合数学(隔板法,容斥)

传送门首先我们知道,把m个小球放进n个桶里,桶可以为空的问题,答案是cal (m+n-1,n-1)在实际中有x1<=A1,x2<=A2,x3<=A3……xn<=An等条件,此时就需要同时满足这N个条件,也就是有的桶里面的球超出了他的容量,所以就考虑容斥。也就是至少不满足其中一个条件的方案。就可以用总方案减去这些方案就可以得出答案。二进制枚举,如果枚举到当前x,那么这个不合法的方案数有cal (m+n-1-(a[x]+1),n-1)种。。。。。然后就能算出答案了#defi

2021-03-15 17:08:56 131

原创 多校HDU6299(贪心)

传送门化简到最后就三种类型,一种是全是),一直是全是(,一种是))((。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<string>#include<vector>#include<queue>#include<cmath&

2021-03-12 15:22:47 60

原创 Berland Crossword(枚举)

传送门考虑到问题其实最难处理的就是公共点的情况,所以想到最后我们可以二进制来枚举四个角,无非就是2的四次方。。。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<string>#include<vector>#include<queue&gt

2021-03-03 14:52:55 197 1

原创 博弈论基础

巴什博弈。题目:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取完者得胜。结论,如果n%(m+1)==0,则后手赢,否则先手赢。斐波那契博弈。题目:有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:(1)先手不能在第一次把所有的石子取完,至少取1颗;(2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。约定取走最后一个石子的人为赢家,求必败态。结论:如果n是一个斐波那契数,那么必败。威佐夫博弈。有两堆各若干个物品,两个

2021-02-18 22:02:33 80

原创 牛客第三场

B -内卷传送门把他们都放在e等级,如果我们要让当前值变大,那我们就把当前最小值提升一级,然后再做判断,贪心暴力判断,条件不符合就结束。因为在这个过程中我们要不断地取出一个最小值,所以用优先队列。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>

2021-02-07 00:12:13 83 1

原创 重力坠击

传送门牛客第三场,为什么要记录这题呢,唉,明明都想出来,但就算实现方式不好,以至于到结束还没做出来。。看了榜一的方法,真的觉得我一开始写的代码跟shi一样。。。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<queue&g

2021-02-05 18:59:17 166

原创 No More Inversions(找规律)

传送门我们可以发现,1 2 3 4 3 2的逆序数等于1 4 3 2 3 4的逆序数,其中有贡献部分是2 3 4 3 2。1 2 3 4 3 2 1 == 4 3 2 1 2 3 4,全部都有贡献。所以p数组,就是无贡献部分+有贡献部分。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#

2021-01-15 22:20:46 385

原创 CodeForces - 1467C(枚举,思维)

Three Bags我们假设a对b数组进行操作,那就是a-b,此时b是负贡献,如果他们此时是再与c合并,那么b就是正贡献了,而a就是负的。所以,我们可以看出,如果对一个数进行奇数次操作,那么这个数就是负贡献,如果是偶数就是正贡献。假设最后一个数在a数组,对于a中n-1个数,我们可以在最后先与其他数组合并,然后再转回来与a合并,就相当于做了两次操作,所以a中的数都是正数。那么对于b,c,我们可以都留一个数,然后b中nb-1个数转到c,c中nc-1个数转到b,最后再转到a,就相当于b,c中只有一个数的负贡献

2021-01-09 16:01:45 210

原创 CodeForces - 1471F

Strange Housing 如果不连通,自然是no如果是连通,我们就需要构造出一种合理的方法,我们假设老师在的点为标记1,那么与他连接的点都是0,我们用一个队列存标记为0的点,然后我们每次就把当前0能到的点标记为1,然后更新1的周围,这样我们可以保证不会有相邻两个点都是1,比如1->2, 1->3, 2->3, 假设现在1标记为0,那么我们先遍历到2,2就为1,然后就把2周围未更新的点更新为0。 所以每次我们遍历标记点为0能到点,把它标记为1,就不怕冲突了,因为如果冲突它在

2021-01-08 15:47:28 112

原创 CodeForces - 1471D(思维,推导)

Strange Definition在第一秒操作后:如果同一类的数量是奇数,那么经过操作后,y依旧不变,它的y幂增加,但仍为奇数幂,所以数量不变。如果是偶数,那么y都变成偶数幂,那么此时y就变成了1。最后在统计时经过1秒后所有偶数数量的类都要加一起,如果y=1的类是奇数项,那么就还要加上这个奇数项。最后两项取最大值就好。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include

2021-01-07 17:21:00 174 1

原创 CodeForces - 1272E(bfs,思维)

题目首先建反向边。然后奇偶分成两派,进行两次bfs,更新能到的点的步数 。因为偶数点要由奇数来更新,所以最后更新的时候奇数点在偶数的距离里找,偶数在奇数里面找。为什么bfs可以呢,以跑奇数为例,第一遍时,我们把一步可以到的偶数点都更新了,那后面的偶数点要更新时只能通过前面能到的偶数点去更新,路径也就是奇偶偶偶偶…#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<

2020-12-29 23:26:51 152

原创 洛谷P4782 【模板】2-SAT 问题(强连通分量)

原题比如a为1或者b为1,那我们可以建两条确定边,就是!a -> b,!b -> a。。然后就缩点,如果a和 !a 在同一个强连通分量中,那说明不可能。如果答案存在呢,该怎么找布尔值呢。!来自洛谷的截图。。当结论记住?。。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<stack>#in

2020-12-26 00:07:47 193

原创 POJ - 2942(点双连通分量,二分图判奇环)

Knights of the Round Table首先理解题意很重要。。。题意看得我云里雾里,意思是有多个会议,每个会议都要满足要求,如果一个人他是什么会议都参加不了,那他就要被踢出了。关系不好的不坐一起,那么反向建边,把那些能坐一起的建一条边,然后找点双连通分量。在一个点双连通分量中,如果存在奇环,如果有点x在这个环外,那么一定存在x与这个奇环上的点形成简单环,因为奇环两个点间一定存在一奇一偶,所以类似缩点后,就用染色法判断存在奇环没,类似判定二分图,有奇环就不是二分图。tarjan这种多组输入

2020-12-25 22:45:08 290

原创 CodeForces - 1288C(简单dp,思维)

题目a数组非严格单调递增,b数组非严格单调递减,我们可以把这两个数组看了一个2*m大小的非严格单调递减数组,即b数组加上a反过来的数组,然后dp求个数就好了。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<stack>#include<map>using namespace std;#defi

2020-12-23 22:32:38 165

原创 HDU - 4596(扩展欧几里得)

Yet another end of the world#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;#define LL long longconst int maxn=1e3+10;LL x[maxn],y[maxn],z[maxn];LL gcd(LL a,LL b){ if(b==0)return a; return gcd(b,a%b);

2020-12-23 22:22:49 128 1

原创 POJ - 1741(点分治入门)

tree其实关于时间复杂度我也似懂非懂,大概就是把一颗树分层,然后每一层的操作大概是(n log N),然后我们每次找树的重心,就可以分logN层,所以总时间复杂度大概是就是N log² N关于路径,我们先算出到根的距离,然后分成两种,一种关于经过n节点,这是合法的,一种是不经过根节点,就是在一根子树下的,我们可以先算根节点的所有情况,再计算孩子节点的情况,然后减掉就好了。然后计算路径用尺取就好了。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h

2020-12-18 23:33:16 246 1

原创 CodeForces - 1313C2(单调栈,贪心)

Skyscrapers (hard version)预处理出每个点作为顶点时左右两边的贡献。然后找出那个最大值,再根据那个点往左右修改就好了。。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<vector>#include<queue>using namespace std;#define L

2020-12-16 13:14:52 128

原创 P3384 【模板】轻重链剖分

#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;const int maxn=2e5+10;int arr[maxn],w[maxn],n,p;struct node{ int v,nxt;}e[maxn<<1];int head[maxn],cnt;int dep[maxn],fa[maxn],siz[maxn],son[maxn],id

2020-12-15 23:53:02 66

原创 CodeForces - 1313B(思维,贪心)

题目最小值是容易算的,让比你前面的人分尽可能和你一样多,答案是min(n,x前面的人加y前面的人+1//自己)。我推出来的,但怎么说明他是对的,不会描述。。最大值的话,我们让前面的排名尽量和我们x+2排名的人搭配,刚好比我们多1,就这样贪心就好了,代码可读性感觉很差。qaq。。。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#inclu

2020-12-15 23:46:01 180

空空如也

空空如也

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

TA关注的人

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