08 2018 档案

摘要:我们十分抱歉,博主由于文化课作业过于繁多,他滚去大力肝作业了(主要是那操蛋的语文,在这里恕我骂一句, 语文),因此他的博客将会暂时停止更新几天。 阅读全文
posted @ 2018-08-19 21:02 Patrickpwq 阅读(246) 评论(2) 推荐(2)
摘要:"传送门" 很新颖的一个布尔dp,我们用dp[i][j]表示选i个人 能否 构成j的血量 注意,是“能否”,也就是说dp存的是一个逻辑变量。 首先考虑一些细节,对于偶数的n,那么两个部队人数肯定是i/2,对于奇数,为i/2(向下取整)和i/2+1 考虑如何进行状态转移,dp[i][j]=dp[i][ 阅读全文
posted @ 2018-08-17 23:25 Patrickpwq 阅读(269) 评论(0) 推荐(0)
摘要:" 传送门 " 哎。。。心累。。。这道题改了好久 做法很好理解,就是运用dp的思想,设cnt[i]为到第i个点的最短路数量。 那么对于i的每条出边,如果zdl[i]+val=zdl[vis],说明还有另外若干条可以从i到达vis的路径,因此cnt[vis]+=cnt[i] 大概是下图这样的一个意思 阅读全文
posted @ 2018-08-16 22:42 Patrickpwq 阅读(257) 评论(0) 推荐(1)
摘要:"传送门" 本题要倒着推 即从大的时间往小的时间转移 因为 如果正着 在i的时候 i+t显然还没转移 求啥设啥 要求最大的空暇时间 那么设dp[i]为i~n分钟之内可以获得的最大空暇时间 方程显然: 如果没有任务是从当前时间开始的 则dp[now]=dp[now+1]+1; 否则 dp[now]=m 阅读全文
posted @ 2018-08-16 10:33 Patrickpwq 阅读(108) 评论(0) 推荐(0)
摘要:" 传送门 " dp方程很简单啊,dp[i]=max{dp[i r],dp[i r+1]...dp[i l]}+val[i]; 暴力找最大值只有60分,考虑优化,很明显,用单调队列维护一个滑动窗口即可。 起点至少是l,答案的来源最多是n l。 话说单调队列写起来好恶心啊。。。每次都写不对。。。还是要 阅读全文
posted @ 2018-08-16 00:24 Patrickpwq 阅读(129) 评论(0) 推荐(0)
摘要:"传送门" 这个题意描述的狗屁不通。。。其实大概就是 然后思路就很简单啊,我们枚举最短路的边,依次断掉每一条同时再跑一遍最短路,统计一下最大值即可。 通过一个pre数组可以实现枚举最短路的边,原理很简单:最短路上的每一个点,最后被松弛的那一次就是最关键的边。 cpp include define N 阅读全文
posted @ 2018-08-14 22:27 Patrickpwq 阅读(165) 评论(0) 推荐(1)
摘要:"传送门" 不得不承认noip的题出的是真的好 n=300000,m=300000的极限数据不由得想到某种nlogn的做法 这道题乍一看和二分没有一点关系,然而我们仔细想想后发现,对于一个时间t1,如果t1之内可以完成,那么t2肯定也能完成! 满足单调性,因此我们可以二分时间,那么如何check呢? 阅读全文
posted @ 2018-08-14 11:49 Patrickpwq 阅读(196) 评论(0) 推荐(0)
摘要:"传送门" Solution: 就是树链剖分入门题啦~ cpp // luogu judger enable o2 include define N 30005 define M 200005 define lson now 1; build(l,m,lson); build(m+1,r,rson) 阅读全文
posted @ 2018-08-13 13:09 Patrickpwq 阅读(126) 评论(0) 推荐(0)
摘要:"传送门" Solution: 我们只需要采用和树链剖分近似的思想——把整个树的dfs序整理出来,排成线型。 这样一个节点的子树肯定是连续的一段,于是乎就可以用树状数组维护单点修改+区间查询的任务了。 cpp include include define N 100005 using namespa 阅读全文
posted @ 2018-08-13 11:11 Patrickpwq 阅读(119) 评论(0) 推荐(0)
摘要:" 传送门 " Solution: 我们考虑把所有能够互相翻到的牌归到一个集合里去 ,不难想到可以用并查集来维护这些集合。由于前面的骨牌可能太长以至于影响后面骨牌的统计答案,所以我们要离线询问,从后往前做。 并且再维护一个单调栈,用来存并查集的祖先们。 维护后缀和(即到达终点的所需花费)这样的话 对 阅读全文
posted @ 2018-08-11 23:23 Patrickpwq 阅读(210) 评论(0) 推荐(0)
摘要:"传送门" Solution: 既然是删掉k/c个,那么k=mini,那么删除的还是mini,把c+1个划分到上个区间也是无意义的。 但如果长度为2c的话就能删除2个,但一定不如化成2个c长度的区间优秀。假如前c个的最小值是mini1,次小值是mini2,后c个的最小值是mini3,假如mini2m 阅读全文
posted @ 2018-08-11 23:09 Patrickpwq 阅读(225) 评论(0) 推荐(1)
摘要:" 传送门 " Solution: maxn数组用来存储“从终点到某点间的最大卖出价”,而minn数组用来存储“从起点到某点间的最小买入价”。两遍spfa跑完之后枚举每一对maxn与minn找到最大的差值即可 写的时候注意逻辑,思路一定要清晰,不然很久都调不出来 cpp include define 阅读全文
posted @ 2018-08-11 20:39 Patrickpwq 阅读(190) 评论(0) 推荐(1)
摘要:" 传送门 " 对于这道题,我们不难想到,对于两个点,我们可以求出他们的lca,然后顺着链暴力往上修改。 但是这样时间复杂度是很不乐观的,最多可以达到n^2。 这里介绍一种可以用来修改树上路径的方法——子树前缀和。 设定一个修改数组change。如果要对x到y路径上的所有点权值+k,lca为z。那么 阅读全文
posted @ 2018-08-11 10:26 Patrickpwq 阅读(141) 评论(0) 推荐(0)
摘要:夜很深 写着写着题有些感慨 18.8.10,似乎就是在去年的这个时候认识了OI。 那是初一升初二的暑假,有一天妈妈突然告诉我,她打听到有个地方可以教编程,你要去吗? 我当然欣然地接受了,男孩子,或多或少对这方面感兴趣。 然后大概就是特别兴奋地在openjudge上刷了50道水题吧...和许多新手类似 阅读全文
posted @ 2018-08-10 23:25 Patrickpwq 阅读(266) 评论(4) 推荐(0)
摘要:"传送门" 首先,肯定是先把所有满足条件一的点预处理出来,我们采用一遍dfs+一个统计来完成这件事。 然后就是求最短路了,跑一遍spfa即可。 cpp include define N 10005 define M 200005 using namespace std; int n,m,first[ 阅读全文
posted @ 2018-08-10 09:35 Patrickpwq 阅读(176) 评论(0) 推荐(0)
摘要:"传送门" 一开始没在意数据范围...就用一个5行的dfs瞎做,搞了80分。 正解是带权并查集,只需要维护一下到根节点的距离就可以了。。。。 cpp include define N 200005 using namespace std; int n,father[N],to_root[N],ans 阅读全文
posted @ 2018-08-09 22:33 Patrickpwq 阅读(116) 评论(0) 推荐(0)
摘要:"传送门" Solution: 并查集暴力搞。 挺像kruskal找最小生成树的,按边权从小到大排序,枚举最小边,然后不停的加比这条边大的边,直到s,t连通。 cpp include define N 505 define M 5005 using namespace std; int n,m,s, 阅读全文
posted @ 2018-08-08 22:59 Patrickpwq 阅读(93) 评论(0) 推荐(0)
摘要:"传送门" 题目要求任意两点间至少有两条没有公共边的路, 也就是说所要求的图是一张边双连通图。 将一张有桥图通过加边变成边双连通图, 至少要加(leaf+1)/2 条边。 因此对于本题, 我们求出所有桥, 将桥删去后得出所有的边双连通分量, 将它们缩为点后找出叶子数, 进而求出答案 求图的桥: 跟求 阅读全文
posted @ 2018-08-07 23:29 Patrickpwq 阅读(98) 评论(0) 推荐(0)
摘要:" 传送门在这儿 " 讲的真好!我还是写线段树。 阅读全文
posted @ 2018-08-07 21:41 Patrickpwq 阅读(81) 评论(0) 推荐(0)
摘要:" 传送门 " Solution: 图上的点分为两种: 1.隔离后对图的连通性有影响的 2.没有影响的 情况2是很简单的,也就是样例中的1,2,5点,易知答案是(n 1) 2 情况1,其实就是图的 割点 。 我们考虑如何求图的割点—— 先回顾low,dfn的定义 定义 DFN(u)为结点 u 搜索的 阅读全文
posted @ 2018-08-07 11:48 Patrickpwq 阅读(154) 评论(2) 推荐(0)
摘要:"传送门" 就是一个二维树状数组单点修改+区间查询的模板题,代码特别好实现,可以来练练手。 cpp include include include using namespace std; int trash,n,tree[1050][1050]; inline int lowbit(int x) 阅读全文
posted @ 2018-08-05 22:48 Patrickpwq 阅读(147) 评论(0) 推荐(0)
摘要:"传送门" 就是stars的变式。 把e,s当成一个点的横坐标,纵坐标后,经过画图会发现,所要求的点,其实就是一个点的左上方。 按y从大到下排序,然后树状数组维护一下类似桶的东西即可。 cpp include include include include using namespace std; 阅读全文
posted @ 2018-08-05 09:27 Patrickpwq 阅读(83) 评论(0) 推荐(0)
摘要:" 传送门 " Solution: 由于数字的大小可能非常大,而且都是未知的,所以只能采用离散化的方式先将数组离散化。 每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大 然后再查询当前这个数前面位置的数。 cpp include define N 40005 us 阅读全文
posted @ 2018-08-04 21:40 Patrickpwq 阅读(331) 评论(0) 推荐(0)
摘要:" 传送门 " 由于输出中的y还是单调递增,甚至还不用排序了。 我们用树状数组维护一个类似桶的东西即可,在update,注意是i=x;i include include using namespace std; int n,tree[32015],level[32015]; inline int l 阅读全文
posted @ 2018-08-04 20:21 Patrickpwq 阅读(114) 评论(0) 推荐(0)
摘要:"传送门" 每个点最多走一次 因此我们用0,1表示一个点去没去过,这样的话,假如有5个点,10100就可以表示去过第一个点,去过第三个点,其他没有去过。 因此状态转移:dp[state][i]=min(dp[state][i],dp[state'][j]+dis[i][j]) 最短路用floyd搞搞 阅读全文
posted @ 2018-08-04 09:55 Patrickpwq 阅读(103) 评论(0) 推荐(0)
摘要:j " 传送门 " Solution: 类似的,我们首先预处理出一行的 只关系是否会自己炸到自己的 所有合法状态(i&(i 2)) 由于当前行与前两行都有关系 因此我们设dp[i][j][k]为 当前第i行 状态为j i 1行状态为k 所以枚举当前行的状态 上一行的状态 上上行的状态 状态转移方程 阅读全文
posted @ 2018-08-02 21:54 Patrickpwq 阅读(88) 评论(0) 推荐(1)
摘要:去掉最后一位 | (101101 10110) x 1 在最后加一个0 | (101101 1011010) x 1011011) x 101101) x | 1 把最后一位变成0 | (101101 101100) x | 1 1 最后一位取反 | (101101 101100) x^1 把右数第 阅读全文
posted @ 2018-08-01 22:13 Patrickpwq 阅读(269) 评论(0) 推荐(0)
摘要:"传送门" PS:昨天被dalao深深的鄙视了不会状压dp。。。这几天一定要好好练 Solution: 我们发现,当前行的状态,只与上一行,以及自身内部有关,因此我们的dp数组很好确定,dp[i][state]代表第i行,状态为state的方案数。 ans=sigma(dp[m][state]) 因 阅读全文
posted @ 2018-08-01 12:06 Patrickpwq 阅读(96) 评论(0) 推荐(0)
摘要:题目大意:有一个W行H列的广场,需要用1 2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? (w,h 1 如果前一行连续两个位置为0,那么这两个连续位置可以横放 即00 11 如果前一行该位置为1,显然该位置不能再放,于是应该把该位置设置为0 ,即1 0 对于一个当前行的可行状态s,用dfs 阅读全文
posted @ 2018-08-01 10:31 Patrickpwq 阅读(770) 评论(0) 推荐(1)