自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HDU 5829 快速数论变换

题目链接题意:给你nn个数和一个kk,对于这nn 个数组成的集合的值,定义它的值为所有子集的和,而一个子集的值是该子集前kk大元素的值(若k>|S|k>|S|,则为SS集合中所有元素的值),问对于k=1k=1 ~ nn,输出每个kk值对应的集合的值。思路: 如果我们知道了每一个子集的第kk大元素的和,那么对于任意的kk,所需要求的集合的值就是11~kk的前缀和。设该集合每一个子集的第kk大元素加起

2017-09-30 18:38:04 422

原创 HDU 6209 二分分数

题目链接思路: 简单转化之后,此题就是给你一个小数,叫你输出值最接近的分数,划成最简形式。考虑二分分数。若不知道起始范围,则可以从:01−10(+oo)\frac{0}{1} - \frac{1}{0}(+oo) 进行二分。出于效率和最简分数的考虑,我们每次二分的值不是求端点的平均数。比如对于[ab,cd][\frac{a}{b},\frac{c}{d}],我们二分的新的分数为: a+cb

2017-09-21 23:12:13 965

原创 51Nod 1487 思维+线段树

题目链接题意: 有一个NN行MM列的网格,每个格子有一个价值。 我们可以选择不多于两个格子建立一个塔,若塔的坐标为(x,y)(x,y) 则我们可以收获(x+dx[1],y+dy[1]),(x+dx[2],y+dy[2])....(x+dx[k],y+dy[k])(x+dx[1],y+dy[1]),(x+dx[2],y+dy[2])....(x+dx[k],y+dy[k])这些格子的价值。 同

2017-09-21 20:03:23 313

原创 BZOJ 4004 实数线性基

题目链接题意:给你nn个装备,每个装备有mm个属性,问是否能在花最少的钱,买最多的装备的情况下,其他没有买的装备的属性都可以由若干个已买装备的属性线性组合出来。输出买的装备数量和花的钱。思路: 很明显的线性基的题。先按价格从小到大排序。然后类似异或线性基的处理,每插入一个装备,都判断能否被其他的装备线性组合出来,若不能,则加入线性基。代码:#include<cmath>#include<iost

2017-09-08 10:01:11 640

原创 BZOJ 2844 异或线性基(HDU3949 升级版

题目链接题意:给出nn个数和一个询问,询问为一个数xx,问nn个数任意组合异或后排序得到的结果中(不去重),数xx最先出现在第几位?思路: 类似于HDU 3949不过这是不去重,故难度大大增加。不过从样例的解释上来看,我们可以试着大胆猜想,每一个结果出现的次数都是一样的。然后推导一番可发现,每个数的出现次数cntcnt恰好是nn个数中不参与构成线性基的数任意组合的次数,即假设线性基的个数为tott

2017-09-07 22:30:19 398

原创 BZOJ 2115 异或线性基+DFS找环

题目链接题意:给定一个nn个点,mm条边的无向图,求出一条1−>n1->n节点的路径,使得路径上经过的边的权值的异或和最大。思路: 解决此题只需要基于一个事实: 任意一条1−>n1->n的路径的异或和都可以由任意一条1−>n1->n的路径和与图中一些环的异或和组合而成。为什么呢?简单画个图,举个例子~:考虑下面的这个图,n=8 m=9n=8 \ m = 9,存在33个环,标号1,2,31,2,3

2017-09-07 21:22:59 593 1

原创 HDU 3949 异或线性基

题目链接题意: 有nn个数和qq个询问,每个询问给出一个正整数kk,问这nn个数异或组合出的所有数中第kk小的是什么数,若不存在则输出−1-1。思路: 首先构建出这nn个数的异或线性基。假设非零线性基共有tottot个,从小到大排列后,对于第xx个线性基,前1−(x−1)1-(x-1)个线性基无论怎样线性组合,其结果一定小于第xx个线性基。因为第xx个线性基假设最高位的11在第kk位,因为异或不

2017-09-07 18:08:16 625

原创 SGU 275 异或线性基

题目链接题意:给你nn个数,求这些数能够异或出的最大值是多少?思路: 异或线性基的入门题。推荐:优秀的学习资料求这nn个数的异或线性基,由性质,线性基里所有的数的异或和就是所需要求的最大值。至于构建线性基的方法,类似于高斯消元的思想,还是很好理解的~代码:#include<cstdio>#include<cstring>#include<algorithm>using namespace s

2017-09-07 17:04:38 1212

原创 HDU 4992 求一个数的所有原根

题目链接题意:给一个正整数n(n>=2)n(n>=2),求她的所有原根,若不存在输出−1-1思路: 由定义1:一个数mm存在原根的充要条件为:m=2,4,pa,2∗pam=2,4,p^a,2*p^a(pp为奇素数) 可以特判输出−1-1的情况。又由定义2:若GG为nn的原根,则当gcd(i,φ(n))==1gcd(i,\varphi(n)) == 1,GiG^i也为nn的原根 可以通过先求出n

2017-09-06 23:46:07 2484

原创 51Nod 1135 求一个奇质数的最小原根

题目链接因为最小原根都不大,可以考虑暴力枚举去验证。对于一个奇质数PP,可以先对(P−1)(P-1)质因数分解为(P−1)=pa11pa22pa33....patt(P-1) = p_1^{a_1}p_2^{a_2}p_3^{a_3}....p_t^{a_t}对于枚举的数GG,若恒有G(P−1)/pi≠1(mod P)G^{(P-1)/p_i} \neq 1(mod\ P) 则GG为PP的原根。代

2017-09-06 20:57:30 577

原创 HDU 6191 DFS序+可持久化字典树

题目链接思路: 推荐两个前置的入门题:题目1 题目2理解上面两题之后此题就变得很套路了。先用DFSDFS序转树形结构为线性结构,然后按DFSDFS序的顺序向字典树中插值,维护一个前缀字典树,然后利用可持久化保留每一个插值前的字典树历史版本。因为一个以uu节点为根的子树的所有节点在DFSDFS序中连续,且为in[u]−out[u]in[u]-out[u]。故利用差分的思想,可实现高效查询。 注意

2017-09-05 20:40:18 654

原创 HDU 4757 树链剖分+可持久化字典树

题目链接思路: 对于这种询问树的路径的题,第一反应就是树链剖分,但与多个给定值异或后的最大值却没有办法去高效维护。考虑另外的思路。有关异或的数据结构,自然会想到01字典树,联系一个经典问题: 求一个数与一个数集中的某个数异或的最大值 而对于此题,每一个询问相当于给定了一个数集,只不过其中的数是一条路径上所有顶点的值。故可以从根出发,对于每一个节点,都维护一个从根到它自己所经过的所有顶点值的前缀

2017-09-05 17:05:11 682

原创 HDU 6059 01字典树

题目链接思路: 好题!对于这类题,一个通用的切入口是枚举一个量,然后丢到01字典树里去匹配。此题做法不止一种,可以枚举a[j]a[j],然后1−(j−1)1-(j-1)建立一棵前缀字典树,(j+1)−n(j+1)-n 建立一棵后缀字典树,然后分情况匹配即可。但个人认为最简单和最容易理解的还是枚举a[k]a[k],因为i<j<ki<j<k,故可以将1−(k−1)1-(k-1) 的数丢进字典树,然后用

2017-09-05 11:30:21 392

原创 HDU 5536 01字典树

题目链接题意:从nn个数s1,s2...sns_1,s_2...s_n中选出33个下标不同的数,求:max(i,j,k)((si+sj)⨁sk)max_{(i,j,k)}((s_i+s_j)\bigoplus s_k)思路: 考虑将所有数插入字典树,然后枚举i,ji,j,从字典树从删去si,sjs_i,s_j后拿(si+sj)(s_i+s_j)去匹配最大值即可。代码:#include<cstdio

2017-09-04 14:59:50 326

原创 Codeforces Round #367 (Div. 2) D题 01字典树

题目链接思路: 维护一个数组cntcnt,代表经过TrieTrie每一个节点的数的数量,插入加11,删除减11。询问时判断节点的cntcnt是否为0来决定该节点是否可走,然后尽量走与查询的数每一个二进制位相反的数。代码:#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long l

2017-09-04 11:22:02 297

原创 HDU 4825 01字典树

题目链接题意:给定一个集合和多个询问,每个询问为一个数,输出集合中的一个数使得该数与询问的异或和最大。思路: 经典题。对于集合中的每一个数从高位到低位插入一棵01字典树,然后对于每一个询问的数xx,将x二进制分解后从高位进行匹配,尽量匹配相反的数(0匹配1,1匹配0),使异或后高位尽量出现1。代码:#include<cstdio>#include<cstring>#include<algori

2017-09-04 10:35:40 511

原创 BZOJ 3932 CQOI2015 主席树

题目链接思路: 观察询问的格式:在第xix_i的时间点的前kk个任务的优先度总和。易想到我们可以对于每一个时间点都维护一个权值线段树,其权值为当前存在任务的优先度。可以利用差分的思想,对于任务[S,E,P][S,E,P],可以将SS点+P+P,而E+1E+1点−P-P,则可以维护出每一个时间点的权值线段树。但这样的话内存是爆炸的。故可以考虑只保存有修改的时间点的权值线段树。 比如两个有两个任务,

2017-09-03 18:04:53 305

原创 HDU 2665 / POJ 2104 静态区间第k小 主席树

HDU题目链接 POJ题目链接很早就开始接触主席树,但一直没有真正理解其维护方式。后来了解了权值线段树和zkw线段树后,再回头学习主席树,发现其实理解起来也是很简单的。对于主席树的每一个节点,分别维护其左儿子节点的标号和右儿子节点的标号加上其维护区间的数的个数。对于区间[1,n][1,n]中的每一个[1,i](1<=i<=n)[1,i] (1<=i<=n),维护权值线段树的前缀和。然后利用差分思想

2017-09-03 10:46:41 353

原创 BZOJ 3685 zkw线段树 || 权值线段树

题目链接思路: 七个操作显然都可以用TreapTreap来维护,但编程复杂度很高,而且似乎此题数据也故意卡TreapTreap。前几个操作都很简单,主要复杂于前驱和后继的高效维护。考虑建立一棵权值线段树,对于值valval的前驱和线段树当前节点rtrt 若valval在rtrt的左儿子区间,则直接递归到左儿子去找前驱。 若valval在rtrt的右儿子区间,则前驱有两种可能,一是在右儿子区间中

2017-09-02 22:44:58 460

空空如也

空空如也

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

TA关注的人

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