自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Hdu 5469 Antonidas(只需要判断可不可行的树分治)

传送门:Hdu 5469 Antonidas 题意:给你一棵树,有n个结点,每个结点有一个字母,找出一条链,它的字母组成为s,问有没有这样的链(n<=1e5) 思路: 对于一条链(u->v),可以分成u>lca(u,v),lca(u,v)->v,又因为对于树只能处理出lca(u,v)->u或者v的Hash值,所以我们刚开始对于s字符串的Hash要分成正向和反向 刚开始的时候用了map

2016-08-31 17:44:44 345

原创 Hdu 4918 Query on the subtree(一棵树,两种操作,一种是将某个点的权值修改为v,另一种是查询距离点u不超过d的点的权值和。)

传送门:Hdu 4918 Query on the subtree 题意:给出一颗n个点的树,每个点有一个权值,有两种操作,一种是将某个点的权值修改为v,另一种是查询距离点u不超过d的点的权值和。 思路: 最多有logn层的子树 对于每个点,最多属于logn个子树,那么我们可以预处理出每个点属于哪些重心以及到这些重心的距离,以每个重心建立树状数组, 每个点按照到不同重心的距离插

2016-08-30 20:59:19 1077

原创 Hdu 5664 Lady CA and the graph(有n个点的树,给定根,叫你找第k大的特殊链)

传送门:Hdu 5664 Lady CA and the graph 题意: 给你一个有n个点的树,给定根,叫你找第k大的特殊链 特殊的链的定义:u,v之间的路径,且lca(u,v)!=u&&lca(u,v)!=v,且路径第k大 思路:转自http://bestcoder.split.hdu.edu.cn/solutions.php?page=2 对于求第k大的问题,我们可以通

2016-08-30 14:35:06 847

原创 Hdu 5314 Happy King(求树上多少个点对(u,v)满足u到v的路径上点权值最大值减最小值不大于给定的K)

传送门:Hdu 5314 Happy King 题意: 给定N个点的树,点有权值,求多少个点对(u,v)满足u到v的路径上点权值最大值减最小值不大于给定的K 思路: 将点对分成经过根的和不经过根的,进行分治 每一次分治都维护点到根的最大值和最小值就可以了, 处理完一个子树的时候,利用容斥+二分查找左右范围就可以了 (路径上两点的较小值是两点到根较小的那个,较大值为两

2016-08-28 15:42:06 1743

原创 poj 1741 Tree(给定一棵树,对于两个不同的节点a,b,满足dist(a,b,)<=k的点对数)

参考:树分治论文 传送门:poj 1741 Tree 题意:给你一棵N(N<=10000)个节点的带权数,定义dist(u,v)为u,v两点之间的距离,再给定一个K (1<=K<=10^9),如果对于两个不同的节点a,b,如果满足dist(a,b,)<=k,则称(a,b)为合法点对, 求合法点对数目 思路:我们知道一条路径要么过根节点,要么在一棵子树中,所以我们可以利用分治

2016-08-28 11:09:07 1999

原创 Splay操作总结

Splay中有一些常用的操作和一些很容易犯的bug先来记录一下容易写错的地方新建结点(或者连续一段)或者删除结点(或者连续一段)的时候需要pushup(ch[root][1]),pushup(root)申请一个新的结点的时候注意更新与这个点所有相关的变量,比如是维护最小值,不仅要更新val[now],还要更新minv[now]如果有区间加的时候,你需要查询Splay上某个点的值,你不能直接输出

2016-08-26 21:31:17 2307

原创 Hdu 3436 Queue-jumpers(把第x个人放到队伍的前面,查询第x个人的位置,查询第x个位置是哪个人)

传送门:Hdu 3436 Queue-jumpers 题意:有一个n的序列(n<=1e8),有三操作,操作Q次 1.把第x个人放到队伍的前面 2.查询第x个人的位置 3.查询第x个位置是哪个人 思路:因为n比较大,Q比较小,所以选择记录一次啊出现了哪些数,Splay中每个位置记录一下之前有多少个数是不会被用到的 对于操作1,我们标记一下x在Splay中的下标的位置,

2016-08-26 20:45:58 499

原创 Hdu 4453 Looploop(环上的Splay操作)

传送门:Hdu 4453 Looploop 题意:给你序列(形成一个环),有六种操作 1.指定一个元素,这个元素之后的k2个元素加上x 2.指定一个元素,这个元素之后的k2个元素翻转 3.在指定元素的右端插入一个数 4.删除这个元素,然后把指针移到下一个 5.把指针往左或者往右移动(x=1移到左边,x=2移到右边) 6.输出现在指针所指的数

2016-08-25 18:59:52 363

原创 Hdu 4441 Queue Sequence(给定一个数确定它在Splay中的下标)

传送门:Hdu 4441 Queue Sequence 题意:刚开始有一个空的序列,有三种操作 1.insert p 在p位置插入最小的未被使用的正整数,然后找到另外一个位置插入一个负数, 该负数左边负数的个数和该数的相反数的左边的正数的个数一样多且最为靠右 2.query x 查询-x所在位置到x所在位置之间的和 3.remove x 删除x和-x 思路:最小的正整数我

2016-08-25 18:41:20 584

原创 Hdu 3726 Graph and Queries(删边,查询第k大,修改点值)

传送门:[http://acm.split.hdu.edu.cn/showproblem.php?pid=3726](Hdu 3726 Graph and Queries) 题意:给你n个点,m条边,有下面三种操作 1:D X :删掉第X条边。 2:Q X K :查询和X相连的点中第K大的点的值 3:C X V :将点X的权值修改为V 思路:逆向处理,利用并查集+Spla

2016-08-25 14:20:50 318

原创 Hdu 1890 Robotic Sort(Spaly 区间翻转)

传送门:Hdu 1890 Robotic Sort 题意:给你一个序列,每次输出第i小的数所在的位置,并将i-这个位置之间的数翻转 思路:Splay的区间翻转,利用一个lazy标记,按下标的中序遍历建树,然后刚开始的每个a[i]都有一个对应的下标,把这个下标存下来, 然后对a[i]排序,第i大的数刚开始对应的下标就是a[i].id,只要找出现在这个a[i].id在Splay中对应的位置就好

2016-08-24 13:02:23 539

原创 Bzoj 1588: [HNOI2002]营业额统计(Splay 单点更新)

传送门:Bzoj 1588: [HNOI2002]营业额统计 题意:求每个点之前离它差最小的数(两个相减的绝对值) 思路:Splay模板 如果父结点是根结点,那么只需要作一次左旋或者右旋即可。 如果父结点P,P的父结点G,如果二者转向相同,那么连续两次左旋或者右旋即可。 如果二者转向不同,那么向左旋后右旋或者先右旋后左旋。#include<bits/stdc++.h>usi

2016-08-21 22:03:10 317

原创 Codeforces Round #368 (Div. 2) D. Persistent Bookcase(n层m个的书架的四种操作)

传送门:Codeforces Round #368 (Div. 2) D. Persistent Bookcase 题意:给你一个有n层,每个有m个的书架,有四种操作 1 i j 表示在第i层j位置放入一本书(原来不存在) 2 i j表示在第i层j位置拿出一本书(原来存在) 3 i 表示将第i层的每个位置的书相反一下,原来不存在,现在存在 4 i 表示回到第i次操作的状态

2016-08-21 18:44:02 325

原创 Codeforces Round #368 (Div. 2) (勾股数)

传送门:Codeforces Round #368 (Div. 2) 题意:给你一条边L,求输出另外两条能与它构成直角三角形的边。如不存在输出-1 (L<=1e9) 思路: 当L为大于1的奇数,令这条边为直角边,则另外两条边为b,c则当L为大于1的奇数,令这条边为直角边,则另外两条边为b,c则,(c−b)(c+b)=L∗L−>令c−b=1−>c=(L∗L+1)/2(c-b)

2016-08-21 16:08:19 265

原创 Codeforces Round #368 (Div. 2) E. Garlands(查询矩形内的和)

传送门:Codeforces Round #368 (Div. 2) 题意:2000*2000的棋盘 有k个不相交集合,每个集合点数<=2000,然后10^6次操作,要么是一个集合从出现变成消失,消失变成出现 要么查询一个矩形内点数,查询数不超过2000,集合数<=2000,q<=1e6 思路:因为集合的个数比较少,所以我们可以暴力找到哪些集合是开的,然后对于每个集合查询(x1,y1)-(

2016-08-21 15:53:05 283

原创 Hdu 5862 Counting Intersections(有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点)

传送门:Hdu 5862 Counting Intersections 题意:有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点 思路:按x排序,只统计竖直的与水平相交的情况, 比如竖直的(x1,y1)-(x1,y2),就是统计sum(y2)-sum(y1-1) 水平的:(x1,y1),(x2,y1),就是在x1这个位置add(y1,1),在x2这个位置add(y1,-1)

2016-08-20 12:32:51 1040

原创 Hdu 5857 Median(给你一个有序的序列,取出连续的两段l1,l2,r1,r2,求这两段合并之后的中位数)

传送门:Hdu 5857 Median 题意:给你一个有序的序列,取出连续的两段l1,l2,r1,r2,求这两段合并之后的中位数。 思路:比赛的时候没有看到有序,用了主席树求第k大#include<bits/stdc++.h>using namespace std;const int maxn=101000;int root[maxn],sz;long long t[2*maxn],a

2016-08-20 11:59:54 748 1

转载 Hdu 5866 Lucky E(树上点期望的最大值)

传送门:Hdu 5866 Lucky E 题意:给你一棵树,有n个节点,m种操作,树上的每个点相当于一个士兵,有一个伤值, m中操作,每种操作都有一个点的标号和一个概率,表示可以对这个点的子树造成1点伤害, 求受伤最高的士兵的伤值的期望 题解:摘自http://www.cnblogs.com/duoxiao/p/5784466.html 考虑到操作数M较小而树较大,所以可以

2016-08-20 10:08:13 756

原创 spoj 1693 Coconuts( 违背自己意愿的票数与持不同意见的朋友对数的总和最小)

参考:http://wenku.baidu.com/link?url=E5J_eujJ5h0P08UFEWi6PCp9ZX97MM-1NMxUfbdAEx48yLQWqZk4LlMwrG8Wt6Ks1V5hzoWDurZcvRSjCZ1OQ9ZmMmvEkbqP8Fuz489h3PS 传送门:spoj 1693 Coconuts 题意: N 个城堡守卫正在就非洲的燕子能否搬运椰子而进行投

2016-08-19 16:58:29 380

原创 uva 1277 Cops and Thieves(完成阻击所需要的最少人数)

传送门:uva 1277 Cops and Thieves 题意:一个犯罪团伙打算去偷一家美术馆。 警察决定派 K 个人堵住所有从匪窝通向美术 馆的道路,不过他们只能驻守在沿途顶点处而不能在匪窝或美术馆,且每个点都 有一个需要警察驻守的最低人数 Ri。 问警察能否完成任务。 (2 < N <= 100, 1 < M <=10000) 思路:我们所要做的就是割掉一些边使得不能

2016-08-19 14:03:49 310

原创 Hdu 5834 Magic boy Bi Luo with his excited tree(从树上每个点出发,获得的最大的利润为多少)

传送门:Hdu 5834 Magic boy Bi Luo with his excited tree 题意:给你一棵树,有n个点,每个点都有一个利润,每条边都有一个花费,问从每个点出发, 获得的最大的利润为多少(每个点上的利润只能取一次,每条边每走一次就要花费) 思路:我们任意选取一个根,每个点都保存四个值,down[i][0],down[i][1]分别表示向下不回到这个点和回到这个点

2016-08-18 10:59:46 547

原创 最小割总结

重新阅读了一下《最小割模型在信息学竞赛中的应用》,写一下自己的理解割[T,S]和割[S,T]是不同的在一个流网络G=(V,E)G=(V,E)中,设其中任意一个流为ff,任意一个割为c[S,T]c[S,T],必有|f|<=c[S,T]|f|<=c[S,T]找寻最小割SS中的点集:先求最大流,再在最大流ff后的残留网络GfG_f中,从SS进行DFS,遍历到的点便是SS中的集合 需要注意的一点是最小割[

2016-08-13 10:55:13 500

原创 Codeforces Round #358 (Div. 2) D. Alyona and Strings(两个字符串中找出k段相同的,且总长度最大)

—-传送门:Codeforces Round #358 (Div. 2) D. Alyona and Strings 题意: 给你两个字符串,长度分别为n,m,然后分别在两个字符串中找出k段,而且这k段在两个字符串中出现的顺序是相同的 求这k串长度之和最大为多少 思路一: dp[i][j][x]表示第一个字符串处理到了i位,第二个字符串处理到了j位,选择出了x个字符串,而且i

2016-08-12 23:07:32 388

原创 Codeforces Round #358 (Div. 2) C. Alyona and the Tree(如果这棵树合法有一个条件:对于树上任意一个点,它的祖先到它的距离小于等于它自己的值)

传送门:Codeforces Round #358 (Div. 2) C. Alyona and the Tree 题意:给你一棵树,树上每个点和每条边的长度都已经知道, 如果这棵树合法有一个条件:对于树上任意一个点,它的祖先到它的距离小于等于它自己的值 问至少删除多少个点使得这棵树合法 思路: 其实如果一棵树合法,那么它所删除的点的数目其实是固定的,而如果一个点要删除,

2016-08-12 22:16:26 278

原创 Hihocoder 1259 :A Math Problem(2015 北京区域赛 K,二进制的数位dp)

提交传送门:Hihocoder 1259 :A Math Problem题意传送门:UVA Live 7271 A Math Problem 题意:f[1]=1,3∗f[n]∗(f[2∗n]+1)=f[2∗n]∗(1+3∗f[n]),f[2∗n]<6∗f[n],题意:f[1]=1,3*f[n]*(f[2*n]+1)=f[2*n]*(1+3*f[n]),f[2*n]<6*f[n], 定

2016-08-12 19:59:44 935

原创 Codeforces Round #353 (Div. 2) C. Money Transfers(相邻银行之间转账,求最少的转账次数)

传送门:Codeforces Round #353 (Div. 2) C. Money Transfers 题意: 有n个银行(n<=1e5),你在每个银行都存了或者欠他们一定数量的钱,但总和为0,你只能在相邻两个银行之间进行转账操作,比如和1相邻的两个银行是2和n。求最少的转账次数。 思路: 因为要使转账次数最少,所以我们应该要把这n个人划分成若干个圈,使得每个圈的值的和为0,圈

2016-08-11 23:33:58 576

原创 Codeforces Round #353 (Div. 2) D. Tree Construction(每个点按照二叉树排序树的插入插入到树中,问最后每个点的父亲节点的值是多少)

传送门:Codeforces Round #353 (Div. 2) D. Tree Construction 题意:每个点按照二叉树排序树的插入插入到树中,问最后每个点的父亲节点的值是多少 思路: 根据二叉排序树的性质可以知道,一个数插入到二叉排序树中,要么是插入到正好比它大的数的左边,要么是正好比它小的数的右边,利用一个set维护一下就可以了#include<bits/stdc++

2016-08-11 22:52:33 352

原创 Hdu 5811 Colosseo(给你一个n*n的矩阵,分成两部分,记为T1,T2,T2最多能给T1多少个点,使得给完之后的两个图仍然是竞赛图)

传送门:Hdu 5811 Colosseo 题意:给你一个n*n的矩阵,分成两部分,记为T1,T2, 如果两部分都是一个竞赛图,那么T2最多能给T1多少个点,使得给完之后的两个图仍然是竞赛图 思路:首先可以根据拓扑排序分别判断每一个图是不是一个合法的图,即为T1,T2 如果都是合法的话,把T2中的每个点都尝试插入到T1中,如果能成功,显然位置是唯一的, 那么我们只要对T2中的

2016-08-10 20:26:28 585

原创 Hdu 5819 Knights(前缀相同,骑士决斗,最后剩下第n个骑士)

传送门: Hdu 5819 Knights 题意:给你n个骑士,n+1个格子,刚开始第i个骑士站在第i个格子上,然后每个骑士都有一个初始的方向(向左或者向右,碰到格子的终点会反向),然后两个骑士相遇会进行决斗,每个骑士胜利的概率都是1/2,问最后剩下第n个骑士的概率 思路:因为最后一个骑士肯定是往左走击败之前剩余的所有骑士,所以只要考虑前面i−1个格子之后向右的骑士有j个的概率,考虑利用dp思

2016-08-10 16:37:18 734

原创 Hdu 5812 Distance(三种操作. 1.插入x 2.删除x 3.在集合中找到一个数y,使得y->x,每次能除以一个素数或者乘上一个素数,问最少的操作次数)

传送门:Hdu 5812 Distance 维护一个集合,有三种操作. 1.插入x 2.删除x 3.在集合中找到一个数y,使得y->x,每次能除以一个素数或者乘上一个素数,问最少的操作次数 思路:记f(x)为从1变到x所需要使用的最小的次数(可在线性筛的时候预处理) 要使y->x,即相当于对于每个x的因子z,从集合中找出一个y使得f[y/z]+f[x/z]最小,对于f[x/z]很好

2016-08-10 14:58:28 677

原创 Hdu 5820 Lights(矩形中有多少个点)

传送门:Hdu 5820 Lights 题意:给你n个点,如果这是一条好的路径的话,任意两个点之间能到达且拐歪处一定有点,且走的距离为|x1-x2|+|y1-y2| 思路:我们对一个点找出它上下左右分别离它最近的是哪一个点,然后就组成了一个矩形,这要判断这个矩形里面是不是还有其它的点就可以了#include<bits/stdc++.h>using namespace std;const

2016-08-10 10:47:16 924

原创 Hdu 5807 Keep In Touch(有三个人分别在三个位置,每一秒各走一步,三个城市可以联络的要求是两两权值差小于等于K。 问有多少种不同的方案,让这三个人可以联络。)

传送门:Hdu 5807 Keep In Touch 题意:有三个人分别在三个位置,每一秒各走一步,三个城市可以联络的要求是两两权值差小于等于K。问有多少种不同的方案,让这三个人可以联络。思路:考虑dp,设dp[i][j][k]表示三个人分别在i,j,ki,j,k时的方案数,直接转移是O(n^6)的。 于是考虑加维,设dp[i][j][k][now]表示三个人分别在i,j,k时,目前准备走n

2016-08-08 15:36:06 539

原创 Hdu 5808 Price List Strike Back(分治,BestCoder Round #86 E)

传送门:Hdu 5808 Price List Strike Back 题意:一共有n家商店,编号依次为1到n。每家商店只会卖一种物品,其中第i家商店的物品单价为v,且它到Byteasar的家的距离为di 有m组询问(1≤n≤20000,1≤m≤100000,1≤vi<=100,1<=di<=10^9),第i天他会选择一个区间[li,ri]并给自己设定一个距离上限ci, 然后他会在编

2016-08-08 15:25:06 552

原创 Hdu 4804 Campus Design(给定一个图,0是不能放的,然后现在有1X1和1X2方块,要求铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法)

传送门:Hdu 4804 Campus Design 题意:给定一个图,0是不能放的,然后现在有1X1和1X2方块,要求铺满该图,使得1X1使用次数在C到D之间,1X2次数随便,问有几种放法思路:我们可以将那些’0’的位置默认成已经放了1×1,那么就是在原来的基础上增加一维数组,表示已经放了的的1x1的方格的数目#include<bits/stdc++.h>using namespace s

2016-08-08 11:18:53 812

原创 UVA 11270 Tiling Dominoes(用1×2骨牌覆盖n×m棋盘,有多少种方法)

传送门:UVA 11270 Tiling Dominoes 题意:用1×2骨牌覆盖n×m棋盘,有多少种方法(n×m<=100)思路:n×m<=100->min(n,m)<=10 我们按照从上到下,从左到右的顺序呢将棋盘划分成若干个阶段,每个阶段有2^m个节点,其中每个节点用一个m为二进制整数表示阶段决策是”以当前格子为右下角,要不要放骨牌以及放哪种骨牌”#include<bits/stdc+

2016-08-08 10:28:02 1906

原创 Educational Codeforces Round 8 E. Zbazi in Zeydabad(给你一个n*m矩阵,每个点可能是'.'或者'z',问有多少种Z子型(Z为一个正方形))

传送门:Educational Codeforces Round 8 E. Zbazi in Zeydabad 题意:给你一个n*m矩阵,每个点可能是’.’或者’z’,问有多少种Z子型(Z为一个正方形)思路:我们先预处理出每个点向左和向左下能延伸的最大长度,那么以这个点为左上角的能组成的最大长度的Z字型便确定了 zzzz ..z. .zzz 比如这个图中的(1,4)为左上角的点,那么它

2016-08-06 15:44:59 780

原创 Educational Codeforces Round 15 E. Analysis of Pathes in Functio(每个点走k步会到达哪个点,经过的边中的最小值是多少,经过的边的权值和)

传送门:Educational Codeforces Round 15 E. Analysis of Pathes in Functio 题意:给你一个n和k,然后每个点连出去一条边,接下来的每条边的权值,问每个点走k步会到达哪个点,经过的边中的最小值是多少,经过的边的权值和思路:因为每个点连出去一条边,所以肯定会有环,而且每个点走k步一定能走到某个点,而且这个点是唯一确定的, 那么利用倍增

2016-08-06 13:30:55 595

原创 Hdu 5782 Cycle(给你两个长度相同的字符串,对于长度为i的前缀,如果这两个字符串的前缀是循环相等的,那么输出1,否则输出0)

传送门:Hdu 5782 Cycle题意:给你两个长度相同的字符串,对于长度为i的前缀,如果这两个字符串的前缀是循环相等的,那么输出1,否则输出0思路:两个子串循环相同->第一个子串可以被分为a1,b1,第二个子串可以被分为a2,b2,且a1=b2,b1=a2 先用一个biset处理出对于每一个字符,它在B这个字符串中出现的位置可能是哪些 然后bitset处理出a中的0-i可以和b中的那些匹配(

2016-08-05 18:57:15 962

原创 Hdu 5782 Cycle(改变一个人的能力值(变为100000),使得整个公司的能力值的和最大)

传送门:Hdu 5782 Cycle题意:给你一个公司的架构,为一棵树,每个人的能力值是它子树的中位数(包括这个点),你现在可以改变一个人的能力值(变为100000),使得整个公司的能力值的和最大思路:如果一个节点的能力值改变,那么它的子树中有一个能力值小于等于现在的当前节点的能力值改变 那么我们只要从根到叶子进行dfs(先求出每个节点的能力值和其中位数变化之后增大的值), 如果访问到了这个节点

2016-08-05 18:23:15 630

原创 Hdu 5790 Prefix(每次查询问你第L个字符串和第R个字符串之间的公共前缀有多少个)

传送门:Hdu 5790 Prefix题意:给你n个字符串(1≤N≤100000),字符串的总长度小于等于100000 接下来有q个查询(1<=q<=100000),每次查询问你第L个字符串和第R个字符串之间的公共前缀有多少个思路:将每个前缀都表示成在字典树上的值,然后插入到主席树中->主席树区间内有多少个不同的值#include<bits/stdc++.h>using namespace st

2016-08-05 14:20:54 730

空空如也

空空如也

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

TA关注的人

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