- 博客(20)
- 收藏
- 关注
原创 2670: Almost|分块|三分
先处理出前缀和sumisum_i 区间[l..r][l..r]的几乎平均数为sumr−suml−1r−l\frac{sum_r-sum_{l-1}}{r-l} 也就是求一个斜率的最大值,假如左端点确定,找一个右端点使得几乎平均数最大的话,可以求出凸包,然后再凸包上3分找到最大值 然后就可以分块设立TT个关键点求出每个点到关键点这个区间的最大的几乎平均数 询问的时候可以先拽出跨过关键点的答案,
2016-04-26 16:17:39 1098
原创 4521: [Cqoi2016]手机号码|数位DP
数据范围这么小..感觉暴力可过啊.. DP也是随便设计状态 F[i][j][k][s][l]F[i][j][k][s][l] 表示前ii位,最后一位是jj 最后一位连续出现kk次(如果k已经等于3那么就一直不变)ss表示4,84,8的出现状态 ll表示前缀是否和原数的前缀相同 转移就是枚举下一位转移,也很简单..#include<algorithm>#include<iostream>#i
2016-04-24 16:36:32 3608
原创 4537: [Hnoi2016]最小公倍数|分块
暴力的做法就是直接找到所有a,ba,b都小于等于某个询问的边然后并查集合并,维护每个集合的a,ba,b得最大值看是否等于询问的a,ba,b 然后就可以考虑分块,把边按照aa排序,每隔n−√\sqrt{n}分为一块 块前的按照bb值排序按顺序插入,块内的暴力判断,并查集合并,每次都把块内合并的记录下来,处理完某个询问时就撤回并查集的操作 块的大小为n−√\sqrt n可能会TT 改成n∗log
2016-04-24 14:36:54 1430
原创 4542: [Hnoi2016]大数|莫队
HN一天考两个莫队是什么鬼..或者说莫队不是正确的姿势..? 考虑已经知道了l..rl..r的答案新添入r+1r+1如何更新当前答案 需要先预处理出后缀modpmod p的值bib_i,假设子序列l..rl..r模pp的值为xx 那么x∗10r−l+b[r]=b[l]x*10^{r-l}+b[r]=b[l] 然后就可以直接莫队统计了 模数为2或5的时候要特判一下#include<algori
2016-04-23 19:16:03 3208 3
原创 4540: [Hnoi2016]序列|莫队+ST表
考虑现在已经知道了[l,r][l,r]的答案新添入一个r+1r+1如何更新答案 也就是右端点在r+1r+1处左端点在l..r+1l..r+1之间的所有的子序列的答案 可以找出l..rl..r中最小的数的位置pp,然后pp以及pp左侧作为左端点的答案就可以直接计算了 考虑左端点在p+1....r+1p+1....r+1时对答案的贡献,可以与处理一个前缀和SiS_i表示以ii为右端点的所有子序列的
2016-04-23 09:06:57 2677 1
原创 2959: 长跑|LCT+并查集
慎入…此人代码自带5倍常数。。 静态的话就是随便搞出一棵生成树来,然后把环缩起来,询问的答案就是路径上的权值和 动态的就需要LCT来维护生成树,每遇到连起边来就形成环的情况时,就把这个环缩成一个点 动态的查询一条链上的权值和。 为什么我的代码的常数这么大…….后几个点在本地跑5s#include<algorithm>#include<iostream>#include<cstdlib>
2016-04-21 10:00:49 958
原创 3073: [Pa2011]Journeys|线段树|BFS
一种比较暴力的方法就是直接线段树优化建图,跑dijkstradijkstra 但是这题的边权都是11可以考虑BFS的方法 首先按照yy将所有的边排序,然后按照xx的大小插入到线段树中 这样每次询问一个点pp下一步能走到哪些点可以直接在线段树中找到x<=px<=p并且y>=py>=p的点 因为已经按照yy排序,所以最终线段树中的连边的yy是递减的,这样就可以做到线性的BFSBFS#includ
2016-04-18 15:30:41 1007
原创 3589: 动态树|树链剖分|线段树
直接树链剖分,然后查询一段路径的时候顺便在线段树中打上标记,如果再查到这个地方的时候就直接忽略掉这部分对答案的贡献#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#in
2016-04-18 15:16:48 849
原创 4456: [Zjoi2016]旅行者|分治+最短路
每次将矩形划分成两个部分,枚举中间点跑最短路更新答案,不断递归分治#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#include<ctime>#include<se
2016-04-18 15:13:50 1340 2
原创 4455: [Zjoi2016]小星星|状压DP|容斥原理
OrzSDOIR1ak的晨神 可以考虑状压DP枚举子集,求出只保证连通性不保证一一对应的状态下的方案数,然后容斥一下就是最终的答案#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<q
2016-04-18 15:08:49 1520 1
原创 1808: [Ioi2007]training 训练路径|树形DP
http://adn.botao.hu/?p=80胡波涛的题解说的很详细,这里就不赘述了#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#include<ctime>
2016-04-18 15:04:40 1116 2
原创 2164: 采矿|树链剖分|DP
DP比较显然,但是直接DP会Tle,这时需要树链剖分用线段树维护dp值同时维护链上的和子树的dp值#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<
2016-04-18 14:58:55 790 1
原创 4518: [Sdoi2016]征途|斜率优化
裸的斜率优化。。我考场上SB#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#include<ctime>#include<set
2016-04-15 08:33:59 1657
原创 4514: [Sdoi2016]数字配对|费用流
这道题只要看出是个二分图就可以直接费用流搞一搞了#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#include<ctime>#i
2016-04-15 08:27:39 1316
原创 4516: [Sdoi2016]生成魔咒|后缀数组|线段树|ST表
将原串倒过来,每次添加一个字符相当于增加一个后缀。 问题转化为向集合中动态添加后缀求本质不同的字串的个数,离线求出SASA 找出当前添加的串与集合中的串的最大的LCPLCP,就是重复出现的子串的个数,线段树维护集合中rank的前驱和后继, 考场上的原代码(SDOI唯一A掉的一道题QAQ)#include<algorithm>#include<iostream>#include<cstdli
2016-04-15 08:22:43 1429 1
原创 3160: 万径人踪灭|FFT|manacher
答案可以转化为所有的回文子序列减去回文子串 回文子串的个数可以用manachermanacher来求出 回文子序列的个数可以这样求: 先求出以每个点为中心左右对称的点的个数xx,那么以这个点为中心的回文子序列的个数就是2x−12^x-1,然后现在只需要求出以每个点为中心左右对称的点的个数,就是a[i+p]==a[i−p]a[i+p]==a[i-p]这种情况的个数,发现和卷积非常类似。。。然后还
2016-04-07 17:19:48 2970 1
原创 2194: 快速傅立叶之二|快速傅里叶变换
很容易发现就是把bb序列反过来直接FFT搞一下#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<ctime>#include<cmath>#in
2016-04-07 14:14:29 2634
原创 2179: FFT快速傅立叶|快速傅里叶变换
背板子大法吼#include<algorithm>#include<iostream>#include<complex>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<ctime>#include<cmath>#include<map>#inclu
2016-04-07 07:37:17 1434 2
原创 2124: 等差子序列|线段树维护哈希值
集训队的题是厉害啊 从左到右枚举每一个数作为等差序列的中间项,判断是否存在等差子序列 考虑枚举到一个位置ii,假设a[i]−xa[i]-x在前面出现过,那么如果不存在等差子序列,a[i]+xa[i]+x肯定也在前面出现,同理a[i]−xa[i]-x若在前面没出现过,那么a[i]+xa[i]+x也不能在前面出现,否则就存在了等差子序列。 从前向后枚举,如果出现了某个数,就为11否则就为00,这样
2016-04-06 11:34:55 2078 1
原创 2006: [NOI2010]超级钢琴|ST表|堆
由于K很小,所以就直接取出最大的K个值加起来即可 考虑一个(i,l,r)(i,l,r)表示以i开始以[l,r][l,r]中的某个位置结束的区间和的最大值,假设这个位置为pp,然后把这些东西都存起来一起扔到堆中,每次取出区间和最大的一个元素,然后继续向堆中添加新的元素,直接对(i,l,p−1)(i,l,p-1),(i,p+1,r)(i,p+1,r)这两个组合再分别找出最大的区间和再扔到堆中,然后重复
2016-04-06 10:08:40 1593
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人