自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

HbFS-

Would you like?

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

原创 [UVALive]7344 数位dp+状态压缩dp

诶写了几天终于写过去了 看了网上无数的模板,发现都不好用,最后还是用了自己的办法写出来 细节多而且复杂状态压缩DP,F[mask]表示mask状态下的答案方案数,G[mask]表示取一个状态为mask的数的方案数 F[S]=∑(G[p]∗F[S异或p]) F[S] = \sum (G[p] * F[S异或p]) 其中p包含了lowbit(S)至于G[]数组怎么求,那就是另外一个数位DP了

2016-12-12 20:25:14 569 2

原创 [UVALive]7338 树链剖分+线段树

诶秒出正解的题目写起来就是爽有一个结论:在生成树上添加一条新边E{a,b,v}使得新图的最小生成树改变,充要条件是E和生成树形成的环中,v不是权值最大的边。对最小生成树进行树链剖分,按树链剖分序建线段树对于第n~m条边E{a,b,v},将a,b路径上的最短边求出来e{a0,b0,v0},v-v0即为该边能减小最多的值,增加最多的值为INF对于前1~n-1条边E{a,b,v}

2016-12-07 19:04:01 549

原创 网络流与线性规划24题

留坑待填最大流模板:#include #include #include #include #include #define N 10050#define INF 1<<30using namespace std;struct Node{int u,cap,rec; };vector e[N];int p[N],S,T;void add_Node(int

2016-12-06 11:55:09 1177

原创 [BZOJ1251]序列终结者 Splay

好累,一天写了三棵树splay区间翻转、区间加法、区间求最大值还是要记得注意边界条件,tr[0] = a[0] = mx[0] = -INF诶下午物理考龊了估计要被老师切死#include #include #include #define ls s[t][0]#define rs s[t][1]#define INF (1<<30)#define N 2

2016-12-05 19:25:41 441

原创 [BZOJ3224]普通平衡树 SPlay

诶一个中午种了两棵树写平衡树之前一定要明确数组的定义,想好每个过程怎么写之后再开始动手写想清楚每个操作返回的是结点的编号还是结点的值诶又是wall编译救了我#include #include #define INF 1<<30#define N 200050using namespace std;int tr[N],siz[N],fa[N],s[N][2];in

2016-12-05 13:58:40 309

原创 [BZOJ3223]文艺平衡树 splay

区间反转模板题好像最后输出换行符会被判错(?)#include #include #include #define N 200050#define INF (1<<30) using namespace std; int siz[N],rev[N],s[N][2],a[N],fa[N],tr[N];int ans[N],n,m,cnt,tot,rt; in

2016-12-05 12:44:43 335

原创 [BZOJ1552]robotic sort SPlay区间翻转

SPlay区间翻转模板题对于翻转区间[L,R],将R+1旋转到根,L-1旋转到根节点的左儿子,此时L-1的右子树便是需要翻转的区间打上标记即可为了防止SPlay一个不存在的节点,可以在头尾加一个空节点(不加也行写起来蛋疼)还不是很清楚SPlay(x)之前是否一定要access(x),感觉一定要先下放标记再操作改了好久最后要了数据才过,发现题目给的读入不是一个全排列诶

2016-12-01 22:20:19 321

原创 [BZOJ1112]砖块klo Treap

诶算是一次想出来解法了考虑枚举连续的k个元素,最后统一高度为x,ans = sigma( abs( xi - x ) )用一点数学知识就能知道,当x为xi的中位数的时候答案最优Treap维护枚举的连续k个元素(需要记录每个子树的和),求中位数(第k/2大)#include #include #include #define N 400050#define

2016-11-30 14:17:05 366

原创 [BZOJ1861]书架 Treap

TreapTreap的从左到右比较关键字为位置将一本书拿到 第一个/最后一个 相当于给这本书一个 大于/小于 所有书的优先值,删除后重新插入即可交换两本书可以直接交换他们的优先值剩下的是查询第k大以及一个值的名次注意明确数组的定义#include #include #include #include #define N 1000500 using

2016-11-30 14:12:19 334

原创 code[VS]1743反转卡片 SPlay

弟弟救我。原本想今晚不来机房的,结果硬生生写了个平衡树再回去。SPlay区间翻转,为了防止越界可以在最后面增加一个虚拟节点。#include #include #include #include #define INF 1<<30#define N 600050using namespace std;int siz[N],tr[N],s[N][2],tag[

2016-11-29 20:21:40 307

原创 BZOJ2111

推公式+Lucas定理F[i]表示以i为根节点的堆的方案数F[i] = F[2*i] * F[i*2+1] * C( d[i]-1 , d[2*i])当n>=p的时候需要lucas定理#include #include #define N 5000050 using namespace std;typedef long long LL;LL d[N],F[N],jc[N

2016-11-23 14:10:37 351

原创 BZOJ3122 推公式+逆元+BSGS

xn=axn−1+b x_n = ax_{n-1} + b设 xn−k=a(xn−1−k) x_n - k = a (x_{n-1} - k) 解得k=b1−a k = \frac{b}{1-a} 即 xn−k=(x1−k)×an−1 x_n - k = (x_1 - k) \times a ^ {n-1} 将k代入,整理式子 问题转变为求最小的n满足等式 (1−a)xn−b=((1−a

2016-11-02 22:52:14 441

原创 [BZOJ2738]矩阵乘法(梁盾)CDQ分治+二维树状数组

将矩阵内所有数字从小到大排序依次加入判断询问集合S内的matrix中数字个数是否大于等于k,如果是,修改该matrix的ans同时将询问集合二分时间代价q logq logn logn第一次拿viante的名字开变量名,第一次1ACDQ分治#include #include #include #include #define N 1000050using

2016-10-26 21:31:45 444

原创 【BOI2007】BZOJ1176 CDQ分治

啊最近准备初赛,这星期再进机房一步,直播吃屎CDQ分治,就是对询问和修改离线后分治解答这道题就是一道很简单的CDQ分治,大概思路就是下面这段代码inline void solve (int l,int r) {if ( l == r ) return ;solve(l,mid);solve(mid+1,r);merge(l,r);}做法:1、将一

2016-10-16 23:12:45 350

原创 HDU5898 oddeven 数位DP

啊好菜啊知道是数位DP但是不会做最后交了暴力上去改了一年改出来了数位DP:F[ i ][ j ][ mask ]:用来表示第i个数字,j是记录的其他信息,mask是这一位的选择是否受到限制#include #include #include #define N 20using namespace std;typedef long long LL;

2016-09-28 21:04:49 322

原创 BZOJ4012 点分治+排序

点分治:记录每个分支根到它管辖所有节点的距离和颜色,按颜色排序后求前缀和。#include #include #include #include #include #define zw for (int i=head[u];i;i=e[i].next)#define y e[i].b#define INF 2147483647#define N 150050

2016-09-27 11:55:27 460

原创 BZOJ4537 [ HNOI2016 ] 最小公倍数 (按轶合并带权并查集+分块离线)

太弱啦,看了题解才知道怎么做 离线算法: 对于单组询问x , y , a , b,我们可以将边权小于a的点全部加入带权并查集,然后判断x,y所在的并查集里面最大的权值是否为b。 对于多组询问,我们采用分块离线的算法。将边权按a为第一关键字升序排序,每k个分一组,总共有m/k组。 对于在这个分组之前的所有分组和当前分组内的边,按b为第一关键字升序排序,记录下在这个块内需要被统计的答案。对块内询

2016-09-26 19:37:17 577 1

原创 HDU5828 区间开根加法求和 线段树

先需要想到一个结论:对于线段树上的一块,进行整体开根和加法(加法不影响结果)的次数越多,区间的最大值与最小值的差越小。利用这个性质,我们维护一棵线段树,线段树上维护区间最大值、最小值、和、元素个数。对于建树、区间加法(修改)、区间查询,写法就是朴素的线段树对于区间开根:1、若区间最大值和最小值的差为0,即整个区间的所有元素相等。此时开根相当于区间覆盖同一个值。2、若区间最大

2016-09-19 13:27:37 909

原创 BZOJ1188 SG函数学习小记

SG函数用来求博弈过程中某一情况下是先手必败(P-position)还是先手必胜(N-position)性质:所有的先手必败(P-position)当且仅当 SG = 0所有的先手必胜(N-position)当且仅当 SG != 0结束局面(T-position)SG = 0 ,可以理解为无法继续操作了所以先手必败SG(x) = mex{ SG(y) | y是x的后继 } (m

2016-09-15 10:21:50 380

原创 BZOJ2064状态压缩动态规划

n1和n2都小于等于10,考虑状态压缩动态规划预处理:d[ i ][ j ]表示开始状态的子集i,变成结束状态的子集j所需要的步数。(这里需要i的面积和与j的面积和相等,所需要的步数是暴力合并i和暴力拆分j的步数)DP:F[ i ][ j ]表示当前剩余状态开始状态的i,和结束状态的j。枚举i的子集p , j ^ (1         主动递推:F[ i ^ p ][

2016-09-12 13:59:32 421

原创 BZOJ1090记忆化搜索

F[ i ][ j ]表示将字符串压缩 i , j所需要的最小代价枚举转移#include #include #include #define N 105using namespace std;bool vis[N][N];int F[N][N],n;char s[N];bool check(int l,int r,int i) { int t = 0; for

2016-09-12 09:19:15 292

原创 BZOJ1079

http://hzwer.com/1884.html解释得很清楚注意F数组的定义这么多维的DP写记忆化搜索会更好写#include #include #define mod 1000000007LL#define N 16using namespace std;typedef long long LL;int x[10],n;LL F[N][N][N][N][

2016-09-11 23:00:04 369

原创 BZOJ2741分块+字典树

分块+字典树走起F[i][j]表示在第i,j个块间选l,r的答案A[j][i]表示第j个单点到第i个块的答案两边的散点暴力合并加入字典树统计答案注意数组的定义:明确数组的内涵#include #include #include #include #define N 12050#define sizTrie 12050#define sqrtN 500#define dm 30

2016-09-09 21:25:14 325

原创 BZOJ1018堵塞的交通traffic 线段树维护连通性

在地图上建线段树[ l , r ] 区间上的线段树节点维护区域间四个顶点的连通性随手画图差不多就是这四个顶点六条边的连通性在查询的时候要判断一下左上和左下的点会不会经过左边区域而变得联通起来,右边也是一样细节很多,挺难写的#include #include #include #define N 1000500using namespace std;stru

2016-08-27 22:42:16 579

原创 BZOJ2982Lucas定理

学了这么久Lucas定理,终于见到有用的时候啦Lucas定理是处理计算组合数取模的一种算法只有当模的数很小的时候才适用!!此外要求模的数是质数(这么看看好像只有10007了)具体就是一个公式: C( n , m ) % p =  C ( n % p , m % p ) * C ( n / p , m / p )按照上面的公式递归就好啦注意当n#include #inc

2016-07-24 21:33:10 378

原创 BZOJ2733线段树合并

第一次写线段树合并一开始完全自己yy板子写得特别丑后来看到了别人的板子发现又简洁又好写//Never Say Never until the very end. #include #include #define N 100050using namespace std;int tr[20*N],ls[20*N],rs[20*N],fa[N],root[N],ys[N],h

2016-07-24 20:56:56 378

原创 BZOJ1040环加外向树森林上的动态规划

所有的边是无向的!想一想也知道,只要有一个人讨厌另外一个人,这两个人最后是不会在一起的。n个人n条边(图不保证联通),这就是一个环加外向树森林不能同时取一条边上的两个人,用DP来实现 DFS找环,拆环x,y,分别讨论x不取和y不取#include #include #include #include #define N 2000050 using

2016-07-20 16:25:27 464

原创 BZOJ1044二分答案(第一问)+动态规划(第二问)

第一问:满足二分性质,直接二分答案算答案l第二问:F[ i ][ j ]表示经过 i 此操作将前 j 个木棍分解的方案数(并且在第j个位置分解)      F[ i ][ j ] = Sigma F[ i-1 ][ p ] (满足sum[ j ] - sum[ p ]       发现空间爆了,第一维滚动数组回收垃圾      ans = Sigma F[ i ][ n ]ti

2016-07-19 14:04:18 411

原创 BZOJ1037动态规划

数据范围很小,可以用4维存储下前i个男孩j个女孩,从这一位往前的所有点中男-女的差最大为x,女-男为y的方案数主动递推:F[ i+1 ][ j ][ x+1 ][ max( y-1 , 0 )] += F[ i ][ j ][ x ][ y ];F[ i ][ j+1 ][ max( x-1 , 0) ][ y+1 ] += F[ i ][ j ][ x ][ y ];最后答案为

2016-07-19 10:46:07 329

原创 HDU5699 2016"百度之星" - 初赛(Astar Round2B)货物运输

二分答案判定四条不等式简单推一下吧#include #include #include #define INF 2147483647#define N 1000050using namespace std;int l[N],r[N],n,m;bool check(int x){ int mi1 = INF , mi2 = INF , ma1 = -INF ,

2016-06-21 17:23:39 505

原创 HDU5713 2016"百度之星" - 复赛(Astar Round3)K个联通块

一道状态压缩动态规划题题目描述:众所周知,度度熊喜欢图,尤其是联通的图。今天,它在图上又玩出了新花样,新高度。有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有K个连通块。 (k题解:状态压缩DP一个简单的结论:删除边集的个数 = 选择边集的个数 , 这样我们就可以把问题转化为选取若干条边使得图里面恰好有K个联通块。问题可以转化成三个状态压缩DP来完成

2016-06-17 14:08:54 1532

原创 HDU5697 2016百度之星初赛Astar Round2B 刷题计划

这是一道求最小的sum( x ) * sum( y )的题目可以切掉BZOJ2395做为这道题的预备知识将BZOJ2395的Kruskal换成DP大概就是这道题的解法问题描述:大赛将至,摆在你面前的是n道题目,第 i(1≤i≤n) 道题目能提升 ai 点智力值,代码量为 bi KB,无聊值为 ci ,求至少提升m点智力值的情况下,所做题目代码量之和**无聊值之和最小为多少。题解

2016-06-16 22:23:16 1309

原创 HDU5700 2016百度之星初赛Astar Round1A 区间交

简单的数据结构题由于所有的数都是非负整数,所以对于一个确定的左端点,区间交最大时右端点尽可能向右取;先将所有的区间按照左端点 从小到大 排序;枚举区间交的左端点,那么该区间交最大时的右端点 是 所有区间中 左端点在枚举端点的左侧的那些区间中 从右往左数第k个右端点;因为是从左往右枚举,所以符合条件的区间会越来越多,已经符合条件的区间会一直符合条件;维护一个 大小为k 的

2016-06-14 13:25:44 556

原创 HDU5696 2016百度之星初赛Astar Round2B 区间的价值

HDU5696:定义一个区间的价值为区间的最大数*最小数。现给了n(1≤n≤100000)个数,问1~n长度的最大价值分别是多少。解法:实际上是水法。题目里说所有的数字是随机的,利用这一点可以想到解法。枚举第 i 个数作为最大值,以这个点为中心向两边扩展并更新答案。扩展进来的数字需要小于我们枚举的最大值。30行程序AC细节:注意lon

2016-06-08 19:55:04 1022

空空如也

空空如也

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

TA关注的人

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