自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WJSZMRX

为什么要去攀登珠穆朗玛峰?因为她就在那里啊。

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

原创 2017吉林省赛 C题 线段树

题意:10w的RGB序列,每次把区间设为一个字母 或者把序列中的R换成B G换成R B变成G  一种询问 问区间中 每个字母各多少个。简单的线段树区间打标记,要注意操作间的影响。#include using namespace std; #define maxn 410000 #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #defin

2017-09-24 20:04:31 632

原创 FFT快一些的模板

10w个火柴 问随机取三个能拼成三角形的概率#include #include #include #include #include using namespace std; const double pi = acos(-1.0); struct complex { double r,i; complex(double _r = 0,double _i = 0)

2017-07-10 11:45:44 422

原创 hdu 1402 A * B Problem Plus FFT模板

FFT的实现..涉及大量的数学知识..搞不来..更玄学了..... 反正FFT就是能够在O(nlogb)时间内将系数表示法转化为点值表示法,相乘后再将点值表示法转为系数表示法,然后实现卷积。 FFT过程: 两个次数界为n的多项式A(x)和B(x)相乘,输入输出均采用系数表示法。(假定n为2的幂) 1)使次数界增加一倍:A(x)和B(x)扩充为次数界为2n的多项式,并构造起系数表示。 2)

2017-07-08 16:16:01 473

原创 spoj-QTREE3 LCT

题目大意:一棵树分为黑点和白点,可以改变一个点的颜色,问从1到v的路径上第一个黑点是哪个点 LCT做法:把黑点col记作1,sum[x]记录x点子树右多少个黑点,我们可以用LCT把1到x路径上所有的点组成一个splay,然后在splay上找关键字最小的点就可以了,不难发现这个题就算找路径上第k个点也是很容易实现的。#include using namespace std; #define ma

2017-07-08 10:08:46 386

原创 LCT介绍

偶然看到了LCT,发现好多东西都忘了,今天就来写写LCT总结吧。 LCT=link-cut-tree 在树链剖分里我们把树按dfs序换成连续序列,再来解决树上两点间路径操作的问题。很明显,假如树的结构变了,那么原来的树链剖分就GG了。为了解决可以增边的问题我们引进LCT。 LCT的基本思想就是把树链剖分里的重块都存到一颗splay里,以splay的灵活性来解决删边加边的问题(无论原图怎么删都得

2017-07-07 20:08:59 1190

原创 主席树总结

主席树在多校里越来越多,本文对主席树做一下阶段性总结。 主席树类似于线段树,由于点更新每次只会更新logn个节点,我们可以申请内存(用数组模拟) ,当然一开始可以把整棵原始树要建立起来,更新的时候要用root数组记录当前版本树根的标号。这样点询问的时间和空间复杂度都是logn。 主席树支持还原历史版本(因为每个版本的树都已经存下来了) 数在区间第一次出现 区间有多少不同数 树套树的操作 关键

2017-07-01 08:18:18 925

原创 线段树总结(三) 终极篇

本文的题。。。说实话博主第一次看得时候都不知道是线段树。。。。而且代码调起来很刺激。。。。建议看一看知道有这么个东西。。。。 http://blog.csdn.net/ied98/article/details/43823073 维护区间置换 http://blog.csdn.net/eod_realize/article/details/39239361  很多题目找不到了,以后博

2017-07-01 07:54:24 399

原创 线段树总结(二) 进阶篇

看了总结(一) (假装你看了),那么对于线段树的基本操作就有个了解了,进阶篇一般是源自网络赛,多校里面难度适中,时间上应尽量控制在1个半小时内弄完。 一:优化类问题。线段树很多时候都是在推dp方程或者公式的时候发现有个以前所有状态取最大或最小,如果直接递推一遍就是O(N)的复杂度,而线段树在操作上可以把一遍操作降到logn。 http://blog.csdn.net/ied98/article

2017-07-01 07:48:38 1437

原创 线段树总结(一) 入门篇

今天写写总结,线段树作为一个常考常新,每次看到了都会有:"还有这种操作?"的谜之数据结构,我们要记住,线段树是序列元素个数确定的(某些特殊的题是可以离线支持删除操作),操作支持区间的封闭性,翻转操作只支持01序列的翻转,整数序列的翻转是不支持的。本篇博客主要介绍线段树的基本操作,也就是那些典型的线段树题目,由于博主较懒,而且大部分题目都是博主之前写过的博客,这里博主就直接粘博客链接了。

2017-06-06 15:15:55 669

原创 Magic Number LCA求路径点集的并

题意:给n个数(n 你可以根据n个数(题目中的a数组) 得到b数组。规则如下: PS:可以看出b[i]第i位一定为1 i+1 ~ n位一定为0 若b[i]的第j位为1,则满足条件的b[k]第j位都为1 再回给你一个询问数q,和另一个01串T(1的数量,输入会告诉哪些位置是1,将T分为q段,每一段长度为c[i] 让你得到d[i],每次输出d[i]中有多少个1. d[i]的规则如下:

2017-06-04 10:55:46 614

原创 hdu5820 询问简单路径 主席树

题意:在一个大小为50000*50000的矩形中,有n个路灯。(n 询问是否每一对路灯之间存在一条道路,使得长度为|x1 – x2| + |y1 – y2|且每个拐弯点都是路灯。 ps注意 实现的时候下方y要+1(边界问题) 主席树root维是记录的x棵树的前缀的树根,每棵树记录的是y的分布情况#include using namespace std; #define m

2017-06-02 22:41:23 427

原创 校赛H题 tree 树链剖分维护区间平方的和

题意:20w个节点的树,有边权。一个操作:把某个点的子树的边权都加一个给定的值。一个询问,问树上两点间边权的平方和。 题解:裸的树链剖分,很久没有先线段树了,lazy标记已经忘得差不多了,回忆一下,lazy记录的是当前区间未向子区间传递的信息,本区间的信息和本区间的lazy一点关系都没有。对于树边,我们把值赋到深度更大的那个点上,最后讨论一下边界就好了 本题要维护三个数组,区间平方和,区间所有

2017-05-27 20:29:33 430

原创 2017东北地区赛D题 splay

题意:25W个序列 支持三个操作: 1 给你一个长度为偶数的区间 交换区间相邻的元素 区间里 第1个和第2个换 第3个和第4个换 第5个和第6个换 2 给你一个长度为奇数的区间 将区间翻转 3 求区间的和 题解:将区间元素按下标奇偶分成2个splay 对于第1个操作直接交换区间 第2个操作由于是奇数长度的区间 所以把范围两个splay内的区间直接翻转就好了 PS:场上没有想到按奇偶分组

2017-05-17 23:29:06 530

原创 zoj3966 Domino Tiling dp

题目大意:给你一个n*m的棋盘 你只能用1x2的格子拼接 且不能同时有4个不同格子的角汇聚在同一处。200组左右的输入 输出任意方案。 题解:由于限制条件太强所以最优方法是确定的 首先假设n#include using namespace std; #define orz printf("orz\n"); #define pf printf #define ss system("pause")

2017-05-09 18:27:30 879

原创 hdu5782

给定两个长度相等的字符串  问他们的第 i个前缀是否循环相等  循环相等的定义是,两个长度相等的字符串  其中一个字符串能通过循环移位得到另一个 Bp[i][j]表示以B串中1~i为子串,和A中以j开头的子串是否匹配#include using namespace std; typedef pair Pii; typedef long long LL; typedef unsigne

2017-05-03 18:45:29 393

原创 zoj3965 由2个dfs序还原二叉树

题意:给定两个二叉树的dfs序,输出每个节点的父节点,根的父节点为0,保证有解 题解:当前节点在两个串中后面的节点假如不同则能确认两个子树,如果相同则把下个点作当前点的一个儿子。如果子树中还有未连根的点则接到当前点下。son数组表示每个点的子树有多少个点。pos数组记录每个数在每个序列中的位置。dfs中p1,p2指向同一个数 lim1,lim2表示当前点子树可能最大的子树范围。 ps:比赛的

2017-04-24 19:03:23 903

原创 ZOJ-3953-Intervals 贪心

题目大意: A:三个区间两两重合 给你n个区间,让你从中删除几个区间,使得A不成立 题目思路:贪心。首先将区间以 左值从小到大排序 然后遍历三个区间,记x为p[0],y为p[1],从p[2]开始遍历 1. 首先判断这三个区间是否两两相交 2. 如果两两相交:则删去y值最大的那个区间(对后面影响尽量小)#include using namespace std; struct node

2017-04-10 20:06:26 363

原创 zoj3949 Edge to the Root树形dp

题意:给一棵树,从1点任意连一边到其他点,使得所有点到1点的 最短距离之和 最小。 题解:先求出某点子树到其距离之和,以及某点除子树外所有点到其距离之和。考虑连到某点时,不能确定的就是当前点和1点的这条链上每个点和其子树的归属问题,很明显应该从链中间点切开这样就可以得到最优解。#include using namespace std; #define maxn 210000 int n; ve

2017-04-09 20:35:57 742

原创 2333

#include using namespace std; template class que {     private:     T x;     que *next;     public:         que *head;     int siz;     que(T a, que *b)     {         x=a;next=b;  

2017-03-31 18:24:16 794

原创 codeforces 791D 树形dp 所有点对

题意:20w个点的树,边长都为1,每个点可以往距离不超过k 题解:树形dp,A#include using namespace std; typedef long long int ll; ll dp[250000][5]; vectorg[250000]; int k; ll dists[220000],ans,sons[220000]; void dfs(int x,int fa) {

2017-03-24 21:28:15 681

原创 poj 2449 K 短路(不严格)

#include #include #include #define M 100010 #define N 1005 const int inf = 0x3f3f3f3f; using namespace std; struct E //邻接表建边,to是下个结点,w 是权值 nxt 是下条边的位置 { int to,w,nxt; }edge[2*M]; struc

2017-03-17 21:53:24 423

原创 hdu4347 kd-tree询问k近点

亲测直接写暴力是过不了的,必须得加上神秘的剪枝技巧。 #include #include #include #include #include #include #include #include #include #define ll long long using namespace std; const int N=50007; const int K=6; int

2017-03-14 20:30:17 554

原创 hdu5726 GCD ST表+离线

给定一个序列,每次询问一个区间  输出这个区间上所有数的GCD,以及GCD与其相同的区间个数(整个序列) 一个连续区间的GCD,用倍增法预处理一下,就能做到 O(1)查询  对于相同区间计数,就把询问先离线一下  枚举区间左端点,区间GCD是随右端点递减的,并且是阶梯式的  并且由于GCD递减的很快,这样一个阶梯只有几层,可以当作log的  所以对于每一个GCD,二分右端点,就能求

2017-03-14 10:51:39 414

原创 hdu5869 Different GCD Subarray Query 线段树

题意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 题解:考虑固定左端点的不同GCD值,只有不超过logA种, 所以事件点只有nlogA个. 那么离线处理, 按照区间右端点排序从小到大处理询问, 用一个树状数组维护每个GCD值的最大左端点位置即可. 复杂度是O(nlogAlogn).#include using namespace std; #

2017-03-14 10:44:38 444

原创 bzoj 1941 kd-tree求最大最小曼哈顿距离

给出平面上n个点,求距离每个点最大距离减最小距离(不算自己)的最小值;(曼哈顿距离) n#include #include #include #include #include using namespace std; #define ll long long #define maxn 600000 #define inf 2100000000 in

2017-03-14 10:38:48 938 1

原创 hdu5809 Ants KD-tree+并查集

初次接触kd树,其实kd树就是将空间上的点分块,然后暴力查找,查找的时候用估价函数判断最值。主要还是靠模板。 题意:二维平面上有n(10W)个点,蚂蚁一开始只会出现在某个点上,然后向着直线距离最近的点走。有10W个询问,每次询问两个点,询问从这两个点出发的蚂蚁是否会相遇。 题解:因为每个点的蚂蚁的行动路线是固定的,所以只需要把所有路线相连的点放入一个并查集里就好了,为了找到最近点可以使用kd树

2017-03-14 10:33:04 480

原创 hdu5919 主席树求区间不同数

题目大意:有长度为n的序列,强制在线询问[l,r] 这段区间中所有不同数出现的第一个位置,按照位置从小到大排完序以后的中间(向上取整)的那个位置是多少? 解题思路:把n个元素倒着插进主席树中,把上次出现的同一个值的元素的贡献值-1,新的这个值的贡献值+1,这样就可以把这个元素最左侧的位置的贡献保留。查询区间[L,R]时只要查询第L个版本的主席树就好了。 ps:前一篇博客由于

2017-03-09 22:15:10 547

原创 hdu 5790 prefix 主席树在线维护区间不同数的个数

题意:给n个串,m次询问,每次给你L,R 要统计第L~R个串中有多少个不同的前缀。n m 题解:由于是前缀,可以用trie树处理,剩下的问题就是在线访问区间内有多少个不同的数了。 我们可以记录trie上每个节点上次出现的位置。对于每个根节点i我们可以记录 前缀上次出现的位置 #include using namespace std; #define maxn 110000 int a[ma

2017-03-07 17:03:22 448

原创 hdu5758 Explorer Bo 树形dp 最小链覆盖

题目:给你一棵树,用最少的链去覆盖这棵树,求链的最小总长度。 解析:num为叶子节点数,显然链数是(num+1)/2。如果是偶数,就是叶子节点到叶子节点,如果是奇数,那么就是在奇数-1情况下的树下加一条叶子到其祖先的链。 偶数的情况:从一个非叶子节点出发,如果其子节点的叶子节点是偶数,则ans+=2,如果是奇数,ans+=1。 奇数的情况:枚举一下那条单链所在的子树。 设d

2017-03-05 19:19:48 1307

原创 hdu5760 Palindrome Bo 经典dp

Description  给出n个数,要找到一个合法的最长子序列s,输出其长度,并且输出不同的s的个数。s序列必须是回文的,并且中间最小,往两边依次不减。s1与s2不同当且仅当长度不同或者存在某位s1[i]!=s2[i]  Input  多组用例,每组用例首先输入序列长度n,之后输入n个整数ai表示该序列,以文件尾结束输入(1 Output  对于每组用例,输出两个整数,第一个表示最长的

2017-03-05 19:13:26 396

原创 hdu5773 The All-purpose Zero 贪心+最长上升子序列

题目大意:可以将0替换成任意interger(包括负数),在此基础上求最长递增子序列。 解题思路:无疑LIS,将所有的0全部提取出来,求出此时序列的LIS(不含0的),这是针对0在子序列的外面的情况,如0,1,2,3,0.那么如果0在子序列中间怎么办? 很简单,把读入的非0的数的值减去这个数前面0的个数即可, 如1,2,0,3,4。在提取出0后序列其实为1

2017-03-05 19:02:15 420

原创 hdu5781 ATM Mechine 概率dp

题意:  有不超过k元钱,若取钱大于剩余,atm会报错,问在不超过w次报错下,取出所有钱的最小期望。 题解:  设当前状态dp[i][j],i为最大钱数,j为剩余报错数,  若i > 0、 j > 0,  则dp[i][j] = minik=1(i−k+1i+1∗dp[i−k][j]+ki+1∗dp[k−1][j−1]+1),  前一项为k不超过剩余的情况,后一项为超过,1为当前操

2017-03-05 18:58:48 436

原创 hdu5826Rikka with Sequence 线段树

题意:三种操作,一种是区间增加,一种是区间开方,一种是区间求和。 1 很快能想到,如果一个100000的数字,最多开方个四五次以后,就变成1了,而且sqrt(1)=1,那么我们就可以在更新的时候想到一个很方便的剪枝,就是,如果这个区间的最大值是1,也就是这个区间全部是1的时候,就可以不继续递归下去了 但是还有一个思路可以剪枝。就是一段区间如果全部开根号到1以后,那么如果这段区间再增加值,整

2017-02-10 22:07:18 373

原创 hdu5845 Best Division (xor-trie+dp)

题意:给定一段数列,将其划分成最多的段 并且每段长度不超过 L且异或和不超过 X 有一个很显然的 O(N2)的dp做法  dp[i]表示到 i为止最多能分成多少段  然后从前面最多 L个 dp值转移出来  但是对前面 L个 dp可以用 xor-trie维护一下  这样一来时间复杂度就是 O(Nlog(A)) 每次将当前位置的前缀异或和插入trie,  并且在叶子节

2017-02-08 18:44:53 402

原创 hdu5860 Death Sequence

题目:n个士兵站成一列,第一个开始每m个人死一个 q次询问,问每次死的是谁 题解:直接线段树暴力就不赘述了,我以前的博客里有。对于dp做法,要记录第i个是第几个轮回死,是此轮回的第几个死。 如果此轮编号为i(并不是原始编号,而是新序列里的编号),那么下一轮此人的编号为i-k/i (由于编号是0~n-1 代码里写的是i-k/i-1 )  那么递推关系就确立了,第i个人代替编号为i-k/i的人 进

2017-02-04 17:36:04 522

原创 hdu5930 GCD线段树

题目大意:给一个序列,每次换一个位置的值,求每次更新后任意连续的序列的gcd,有几个不同的。序列长度和数字大小 题解:一开始求出整个每个不同gcd的值可以出现多少次,更新的话对左端所有相同gcd的段求出来,和右端的的段直接暴力更新,由于两端都最多只有logn段,所以复杂度是可以承受的。 #include using namespace std ; #define maxn 51000 #de

2017-01-26 22:03:52 1084

原创 codeforces710F AC自动机

题意:维护一个字符串集合,支持插入一个串,删除一个串,询问集合中的串在给出的串中出现多少次,一个串出现多次算多次。并且不会有两次插入的串相同。强制在线。 考虑没有删除的情况,将插入串的个数二进制拆分,对于每2k 个串维护一个ac自动机。  这样共有log个ac自动机  。插入时如果当前ac自动机中串的个数和上一个个数相同,那么合并两个自动机。每个字符串只会被合并log 次。 有删除

2016-11-17 14:06:34 405

原创 HDU5955 Guessing the Dice Roll AC自动机+高斯消元

10个人围在一起丢色子,每个人给一个长度为l的序列,色子可以丢无限次,谁的序列先出现谁就胜利,游戏结束。 先说个暴力Y解,先建立AC自动机,然后很容易想到dp[I][J] 第i步走到状态j的概率,然后很明显次数可以用矩阵优化,然而我的姿势怎么也卡不过去。。。。 正解是喜闻乐见的高斯消元,和 游走 一样,先对每个状态建立方程组,然后把初始状态的概率设为1(初始状态即为失配状态)由于一开始由0出发

2016-11-17 14:02:02 1538

原创 hdu1542 扫描线+线段树

给n个矩形(边平行于坐标轴) 求围起来的面积 裸的扫描线+线段树#include #include #include #include #include #include using namespace std; #define ss printf("orz\n"); #define maxn 2000 #define lson l,mid,rt<<1 #define rson mid

2016-11-05 15:15:26 529

原创 codeforces 713D 二维ST表维护最大值

题意:给一个01表格 多次询问某矩形范围内全是1的正方形的边长是多少。 题解:dp[0][0][i][j]表示以i,j为右下角,最大的正方形的边长。 dp[k][t][i][j] 表示以i,j为左下角,x方向上边长为1 #include #include #include using namespace std; int n,m,dp[10][10][1010][1010]; int

2016-10-31 21:20:34 840

空空如也

空空如也

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

TA关注的人

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