自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lambda QAQ

fmap :: (q -> a) -> f q -> f a

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

原创 sdut 3254 stars

给出平面坐标的n(n≤400)n(n\le 400)个整数点(坐标为(x,y)(0≤x,y≤n)(x,y)(0\le x,y\le n),求最小的边长为整数的能至少覆盖kk个点的矩形的面积考虑到n只有400,我们可以枚举矩形的平行于x轴的两条边的坐标,这样的话就退化为了给出一个数组求一个最小的区间并且区间内的数的和大于等于k,这部分可以用双指针来做为了方便起见,我们可以预处理一下二维前缀和其它的细节

2016-05-30 17:42:35 460

原创 poj 1015 Jury Compromise

poj 1015 Jury Compromise有n(n≤200)n(n\le 200)个人,每个人有两个权值D,P(0≤D,P≤20)D,P(0\le D,P\le20),从中挑选出m(m≤20)m(m\le 20)个,最小化|∑D−∑P||\sum D-\sum P|,如果有多解的话,最大化∑D+∑P\sum D + \sum P这个题的状态也是很奇特差的绝对值最小这个显然是不满足最优子结构的我

2016-05-27 21:03:15 293

原创 hdu 1074 Doing Homework

给出n(n≤15)n(n\le 15)个作业的需要完成的时间和deadline,求一个作业的排列,使得最后被扣的分最少,对于每个作业,如果在deadline之后完成,超过deadline的时间就是被扣的分数,当然在deadline之前完成就不扣分了因为是要求一个排列,而且O(2n)O(2^n)的复杂度看起来很科学的样子,所以想到状压dpdpmaskdp_{mask}代表已经完成maskmask中的作

2016-05-26 17:03:55 266

原创 Hdu 1024 Max Sum Plus Plus

给你nn个数的序列,在这个序列中取mm个不相交的区间,使得这些区间的数的和最大题中没有给mm的范围。。。我以为是O(n×m)O(n \times m)会TLE的。。结果过了。。定义状态就是dpi,jdp_{i,j}为前i个数分成了j段且最后一段的最后一个数就是第i个数的最优解然后就可以转移了dpi,j=max(dpi,j−1,dpi−1,k)+valj(k≤j)dp_{i,j}= max(dp_{i

2016-05-26 16:32:43 249

原创 poj 3666  Making the Grade

这个题刚看到的时候也是没有什么想法然后注意到了只有20002000个位置然后有了一个O(n3)O(n^3)的做法(为了简化问题我们只考虑把点填成单调递减的,因为对于递增的,我们把输入反过来再做一遍就好了)首先我们把给出的路的长度离散化一下,因为对于一个位置,要么不动,要么就填到一个已经有的高度定义dplen,posdp_{len,pos}为把第lenlen个点填到离散化之后的第pospos高度的时候

2016-05-25 21:08:16 419

原创 hdu 1069 Monkey and Banana

有n种形状的长方体,每种都有无限个,要把这些长方体叠起来,使得上层的长方体的底面被完全包含在下次的底面上,问最高能叠出来的高度是多少对于每一个给出的形状,我们枚举那一面是底面把它存起来然后按照长方体的底面面积进行排序定义一个长方体A小于长方体B当且仅当A的底面能被B包含(也就是A可以按照题目要求垒在B上然后这就是一个LISLIS了#include<cstdio>#include<cstring>

2016-05-25 19:43:28 211

原创 hdu 1176 免费馅饼

定义cookx,Tcook_{x,T}为在TT时刻掉在xx位置的馅饼的数量定义dpx,Tdp_{x,T}为在TT时刻站在xx位置的时候能拿到的最多的馅饼数量那么有转移方程dpx,T=cookx,T+max(dpx−1,T−1,dpx,T−1,dpx+1,T−1)dp_{x,T} = cook_{x,T} + max(dp_{x-1,T-1},dp_{x,T-1},dp_{x+1,T-1})#incl

2016-05-25 18:49:04 206

原创 hdu 1078  FatMouse and Cheese

给出一个n×nn \times n的矩阵,找出从左上角开始的点的值严格递增路径并且路径上的任何一对相邻点满足横坐标相等并且纵标差的绝对值小于k(或者纵坐标相等并且横坐标的差的绝对值小于k),并且要求点的值的和最大对于矩阵的每一个点对,如果xx能走到yy,就在xx到yy之间连一个边的话,我们最后可以获得的是一个DAGDAG。然后就是很经典的题目了这题不用建图,直接用记忆化搜索就好,至于为什么记忆化搜索

2016-05-25 16:45:35 464

原创 poj 3616 Milking Time

给出mm个区间,每个区间有一个权值选出若干个区间,使得区间两两不重合并且区间的距离大于rr,区间的权值和最大求权值和注意到区间只有10001000个,所以离散化一下就可以O(m2)O(m^2)的做了代码也很短#include<vector>#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#inclu

2016-05-25 15:57:08 234

原创 hdu 1160 FatMouse's Speed

给你不超过1000个老鼠的体重和速度,要求找出最长的老鼠序列使得体重严格递增,速度严格递减首先按照体重从大到小排序,然后就是裸的LISLIS了代码也很短#include<vector>#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<stack>using namespace st

2016-05-25 15:19:02 244

原创 Ural 1117 Hierarchy

这个题说的是给一个满二叉树,按照中序遍历的顺序给二叉树的节点从1开始编号从一个点到另一个点传送所花费的时间定义为这两个点之间路径的节点个数并且一个点只能直接传送到和这个点编号相邻的点,比如xx直接传送到x−1x-1或x+1x+1问需要多少时间才能从给出的起点传送到终点ural的题真长啊。。。又臭又长。。。然后怎么做呢?我们注意到有一半的节点是叶子节点(满二叉树の性质由题中给出的要求,其实每一步是从叶

2016-05-25 08:33:18 397

原创 poj 2486 Apple Tree

给出一个树,每次跨过一条边记做走一步,可以往回走,每个点有一些苹果,问从根出发在kk步之内最多能拿到多少苹果对于每一个节点,我们记VgoxVgo_x为从这个点出发走x步不回到这个点最多能拿到的苹果数VbackxVback_x为从这个点出发走x步回到这个点最多能拿到的苹果数ValVal为这个点上的苹果数对于每个点,能不走就拿到的苹果数目其实就是这个点的苹果数也就是Vgo0=Vback0=ValVgo_

2016-05-24 18:19:40 282

原创 Ural 1658 Sum of Digits

求最小的,各个数位的和为S1S_1,各个数位的平方和为S2S_2的数一眼看下来只会求方案数啊GG,最小的该怎么办呢然后可以想到如果一个数的位数少,他肯定是短的所以我们要找到最短位的那个数应该就是答案了dp的时候顺便维护一下是用哪个数字转移过来的,回溯过去记录答案最后再把拥有的数从小到大排一下,应该就是最优的了但是这样空间复杂度是1e10啊QAQ,还是要GG啊你或许注意到了,要是数位大于100,也是无

2016-05-23 21:19:42 371

原创 Ural 1081 Binary Lexicographic Sequence

数位dp+二分找出第k个二进制表示中没有相邻的1的数看起来很不好做是不是,但是作为数位dp,我们还是可以处理小于x的二进制表示没有相邻1的数个数这部分还是挺简单的?然后我们就可以二分去找答案了~感觉这个都是套路,还是见代码吧o(` • ~ • ′。)o #include<bits/stdc++.h>using namespace std;#define LL long longconst in

2016-05-23 17:24:11 302

原创 Astar Round2A 1003 Snacks

将树按照dfs序映射到区间上,每个点的值代表这个点到根的路径上的点权和因为子树的dfs序连续,所以查询其实就是查询区间最大值更新的话就是给区间加一个数(因为更新了x的点权的时候会对它的子树中的所有点有影响这一些都可以用线段树维护具体见代码#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<qu

2016-05-22 20:51:56 237

原创 Astar Round2A 1002

状压dp因为nn比较小,我们可以考虑O(2n)O(2^n)的算法(也就是状态压缩具体的,dpmask,ed,lendp_{mask,ed,len}表示填了第00到lenlen个数,最后一个数是第eded个,前面用的数在maskmask里面的最优解因为题目中有限制某一些位必须是某一些数,所以在转移过程中如果有当前的ed!=musted!=must的时候,直接返回一个不可能的值其它的直接去dfsdfs过

2016-05-21 18:10:44 310

原创 Ural 1036 Lucky Tickets

简单的dpss为奇数时答案为00ss为偶数时答案为长nn的各位之和为s/2s/2的方案数的平方状态其实就是长度和位和,然后转移一下就好了dpn,s=∑k=09[n≥1][s≥k]dpn−1,s−kdp_{n,s}=\sum\limits_{k=0}^9[n \ge 1][s\ge k]dp_{n-1,s-k}因为方案数会超过longlonglong\;long 的表示范围,而且这个题不取模,所以需要

2016-05-21 12:06:12 580

原创 hdu 5238 Calculator

某线段树打模拟赛的时候不知道区间该维护什么东西使其变得可合并,然后就放着了赛后看了题解才知道这个题维护的是映射关系,感觉也是十分的厉害考虑一个算式a+4(mod7)=ba + 4 \pmod{7} = b我们发现来(mod7)\pmod{7}的同余系中,会有以下对应关系其实这就是一个映射具体的,保存这个映射可以直接开一个数组a[7],其中a[i]=(i+4)(mod7)a[7],其中a[i] =

2016-05-19 20:09:54 384

原创 hdu 4288 Coder

线段树单点更新,查询总的区间下标(mod5)=3\pmod{5}=3的数的和先离散化一下然后每个区间存一下这个区间下标(mod5)=k(0≤k≤5)\pmod{5}=k(0\le k\le5)的数的和,这个区间数的个数区间合并的时候考虑左区间数的个数然后怼起来就好了,具体见代码 #include<bits/stdc++.h>using namespace std;#define LL long

2016-05-18 15:47:11 257

原创 hdu 4578 Transformation

线段树支持给区间加cc,区间乘cc,区间的数都变成cc询问∑i=lrxi\sum\limits_{i=l}^rx_i,∑i=lrx2i\sum\limits_{i=l}^rx_i^2,∑i=lrx3i\sum\limits_{i=l}^rx_i^3写了4K的线段树。。区间节点维护区间和,区间平方和,区间立方和,顺便记录一下区间内数字的个数sizsiz然后对于给区间加cc和给区间乘cc的两个操作,我们

2016-05-18 13:44:24 396

原创 bzoj 1858 序列操作

有毒的线段树一个01序列,支持以下操作 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0 3 a b 询问[a, b]区间内总共有多少个 1 4 a b 询问[a, b]区间内最多有多少个连续的 1 先不考虑操作3线段树的节点要维护从左端点开

2016-05-17 00:06:13 330

原创 poj 2114 Boatherds

和上一个题几乎一致的树分治题(判断树上是否有权值和等于k的路径一样的树分治具体见代码#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn = 11234;vector<pair<int,int> >edge[maxn];void init(

2016-05-16 17:43:17 236

原创 bzoj 2243 染色

一个比较裸的树剖题先考虑区间处理的情况,我们维护区间颜色段数,区间左右端点的颜色之后这就可以满足区间合并了然后用树剖的方法处理一下就好ps:用结构体保存区间值重载加号表示区间合并不能更方便#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn

2016-05-15 11:44:04 266

原创 Poj 1741 Tree

树分治入门题如果你要学习树分治,请按照以下步骤首先你要知道什么是树的重心,并且能在dfs过程中找到树的重心然后你要理解树分治的分治过程,能知道每一次分治的时候对于每一个子树都要找一次重心,并且能写出每次找重心的代码最后是具体题面具体分析,知道如何在分治过程中统计答案对于这个这个题来说,要统计的是树上路径和小于k的点对我们考虑过重心的路径,记录belxbel_x为xx所在的子树编号,lenerxlen

2016-05-14 13:51:25 318

原创 bzoj 2152 聪聪可可

简单的树dp记录到该节点的路径权值xx ,x(mod3)=vx\pmod{3} = v的点的个数,然后就可以轻松的转移了#include<bits/stdc++.h>using namespace std;const int maxn = 21234;vector<pair<int,int> >edge[maxn];void init(int n){ for(int i=0;i<=n;i

2016-05-13 17:16:43 364

原创 HDU 5259 弹吉他

去年做的时候因为不知道如何设计状态卡了很久,现在回过头来做感觉好简单每一个和弦其实就是平面上的四个点,每个状态其实就是某个手指对应某个点,这样的对应关系一共有4!=244!=24种,当然其中会有一些不合法的状态,对于不合法的状态我们特判一下就好然后状态之间的转移也不难,就是同一个指头在不同的状态间对应点的曼哈顿距离因为状态数目不多,所以转移和判断状态是否合法暴力即可具体见代码#include<bit

2016-05-11 22:44:58 339

原创 SDUT 3257 Cube Number

SDUT 3257 Cube Number和上一题类似的一个题 给出n(n≤1e6)n(n\le1e6)个数ai≤1e6a_i\le1e6,问其中有多少个数对满足这个数对的乘积是立方数对于一个数x=∏i=1npeiix = \prod\limits_{i=1}^np_i^{e_i}我们记sim(x)=∏i=1npeimod3i,sym(x)=∏i=1np3−eimod3isim(x) = \prod

2016-05-09 18:24:19 438

原创 SDUT 3258 Square Number

给出n,n≤1e6n,n\le1e6个数ai≤1e6a_i\le1e6,问其中有多少个数对满足这个数对的乘积是平方数对于一个数x=∏i=1npeiix = \prod\limits_{i=1}^np_i^{e_i}我们记sim(x)=∏i=1npeimod2isim(x) = \prod\limits_{i=1}^np_i^{e_i mod\;2}那么其实一个数对(x,y)(x,y)能满足他们的乘积

2016-05-09 17:54:56 558

原创 bzoj 4513 储能表

一句话题面∑x=0n−1∑y=0m−1min(x⊕y−k,0)(modp)\sum\limits_{x=0}^{n-1}\sum\limits_{y=0}^{m-1}min(x\oplus y-k,0) \pmod{p}好的题面就到这里数位dp一下就好记忆话搜索的时候其实用不着很多的分类讨论,具体的看代码吧#include<bits/stdc++.h>using namespace std;#de

2016-05-07 23:08:05 1366

原创 HDU 4734 F(x)

一个简单的数位dp这题的时间卡的有点紧,因为T比较大刚开始每组输入都重新计算dp数组,然后喜闻乐见的T了好久重新设计状态让计算出来的dp数组和A无关,这样就可以多次利用了 #include<bits/stdc++.h>using namespace std;#define LL long longconst int maxn = 20;int tw[maxn],num[maxn];int dp

2016-05-07 10:43:42 384

原创 莫比乌斯反演(入门)

细细算来,看反演已经有一两个星期了 刚开始的时候也是走了不少的弯路 和其他的算法一样,只要你懂了,就会有一种不过如此的感觉(误 感觉反演还是刚入门,不过还是先写一篇不完全的总结吧,不然过段时间就要忘记了虽说看反演看了好久才懂,但是现在回头看看,其实很多时间还是花费在弯路上,真正的输出时间不过是最近的一两天建议的前置技能:容斥的简单应用唯一分解定理欧拉函数的定义积性函数的定义然后就可以看反演啦反

2016-05-06 18:44:44 2973 4

原创 poj 2104 K-th Number

静态区间第k大,裸的主席树直接上代码吧#include<algorithm>#include<cstdio>using namespace std;const int INF = 0x3f3f3f3f;struct node{ int v; int l,r; void init(){ v = 0; l = r = -1; }};

2016-05-04 18:42:37 352

原创 hdu 1698 Just a Hook

hdu 1698 Just a Hook一个简单的线段树支持把某个区间内的点都改为z,求所有操作之后的区间和#include<bits/stdc++.h>using namespace std;const int maxn = 112345;int arr[maxn * 4];int lazy[maxn * 4];#define root 1,1,n#define lson o<<1,l,m

2016-05-03 15:37:18 252

原创 SDUT 2170 The Largest SCC

一句话题意:​ 给出一个点数n≤1000n \le 1000 边数m≤20000m\le20000 的有向图,一共Q≤20000Q \le 20000次询问,询问相互独立,每次询问如果将第x(1≤x≤m)x (1\le x \le m)条边变为无向边时,图中最大的强连通分量所包含的点数为多少首先做一次强连通分量的缩点肯定是不吃亏的(笑 如果第xx条边的两个端点在同一个强连通分量内,其实这一次的更

2016-05-03 14:43:34 367

原创 hdoj 2063 过山车

一个简单的二分图匹配#include<bits/stdc++.h>using namespace std;const int maxn = 2200;vector<int>edge[maxn];void init(int n){ for(int i=0;i<=n;i++){ edge[i].clear(); }}int mat[maxn];bool vis[ma

2016-05-02 19:15:05 313

原创 Poj 1655 Balancing Act

求树的重心

2016-05-02 11:21:12 319

原创 NOI2014起床困难综合症

按二进制位考虑,每一个位在做了那些操作之后,最后的结果是唯一的,那么从高位到低位开始贪心就好

2016-05-02 10:20:40 320

原创 Hdu 5676 ztr loves lucky numbers

定义幸运数字为十进制表示下只有44和77,并且44和77的个数一样多的数。求不小于nn的最小幸运数字n≤1018n\le10^{18}(这是我称为数位贪心的一个题首先显然的是一个幸运数字的位数一定是偶数所以如果给出的nn的位数是奇数的话,可以直接构造一个444...777444...777作为答案如果是偶数的话依然是从高位到低位考虑记录当前的位置pospos,剩下的44的个数,剩下的77的个数,是否

2016-05-01 10:46:49 412

空空如也

空空如也

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

TA关注的人

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