自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

TA

A Lannister always pays his debts

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

原创 关于树状数组一些有意思的东西

嘛~最近刚刚学会树状数组,写个blog记录一下心得。树状数组呢,核心是一个叫lowbit的东西,lowbit(x)=x&-x=x的最后一位1的大小。 一、一个经典问题 一个初始值为0的k位计数器,要求支持n次+1操作。时间复杂度?经典解法: 法I:考虑第i位的改变次数,可得O(∑k−1i=0n2i)≤O(∑∞i=0n2i)=O(n)O(\sum_{i=0}^{k-1}{n\over 2^

2016-04-28 09:23:32 2249

原创 [ONTAK2010]Highways

想学线段树合并找的一个题。。没想到是个傻逼题。这题题意好像有问题:额外的点对和查询的点对都不会是同一个点。设x的dfs序为dfn(x),x的子树中dfs序最大的节点的dfs序为dr(x)。将额外的边(u,v)看作点(dfn(u),dfn(v))(dfn(u)≤dfn(v))(dfn(u),dfn(v))(dfn(u)\le dfn(v))。对于一次查询(u,v)(dfn(u)≤dfn(v))(u,v

2016-04-27 14:52:16 663

原创 [spoj11414] combat on a tree 解题报告

拿来学了下线段树合并。 注意到当我们对线段树打反转标记,它节点的位置就改变了。那么我们线段树合并复杂度分析的那一套理论还适用么?答案是适用,因为我们可以认为所有节点都是打完所有标记以后的,就是不打标记合并,这样做的话它的合并其实是和打标记之前的合并是对称的,因为这棵树是一棵满二叉树。 代码:#include<cstdio>#include<iostream>using namespace s

2016-04-27 11:04:46 772

原创 [Poi2011]Tree Rotations 解题报告

拿这道题来学了一下线段树合并。 主要是照着这个课件学的,但是他那一句 整个过程的开销不会比向一棵空树顺序插入n个整数来的大我完全没有看明白。。自己想了很久,终于想明白了。 之前有一句话是很关键的: 合并的开销正比于两棵树的公共节点数所以我们考虑线段树中一个节点[l,r],它作为公共节点出现的次数是多少呢?显然是将[l,r]中所有元素合并的代价,就是r-l次!所以总的时间复杂度就是O(

2016-04-27 08:28:04 1036

原创 [Hnoi2016]序列 解题报告

我们考虑从左往右扫右端点和从右往左扫左端点的两遍扫描线。(以下选取从左往右的扫描线来说明)考虑每个点向它左边第一个比它大的点连边形成的树。设i左边第一个比它大的点的坐标是

2016-04-26 10:44:54 1398

原创 [bzoj3744]Gty的妹子序列 解题报告

比较显然的做法是用bit维护做到O(nlog−−−√n)O(n\sqrt \log n)。 但是。。作为一名理论计算机科学家傻逼,我们需要O(nn√)O(n\sqrt n)的做法,注意到如果我们把(i,ai)(i,a_i)看成点,实际上要求O(1)O(1)询问一个矩形内点的个数,这个显然可以用可持久化分块来搞,维护每个块内的前缀和和所有块的前缀和——但是空间复杂度是3nn√3n\sqrt n,ML

2016-04-26 07:22:08 865

原创 [bzoj3489] A simple rmq problem 解题报告

说几种比较傻逼的做法: 考虑一个点i,设它前面第一个和它相等的点的位置是lastilast_i(若没有就是0),设它后面第一个和它相等的点的位置是nextinext_i(如果没有就是n+1),则它会产生贡献的区间[l,r]要求lasti+1≤l≤i,i≤r≤nexti−1last_i+1\le l \le i,i\le r \le next_i-1。所以如果把询问的区间看作平面上的点,这就相当于是

2016-04-26 07:11:39 1408

原创 [bzoj3065]带插入区间K小值 解题报告

喜闻乐见的用的很麻烦很傻逼得搞法。。 先用一个块链维护序列,做到O(n√)O(\sqrt n)插入,O(1)O(1)比较两个点在序列中位置的大小。时间复杂度是O(nn√)O(n\sqrt n)。 再用一个块链维护权值,每个块维护按位置排序的序列。查询的时候从小到大枚举每个块,先在块里二分统计块内在查询区间中的个数,然后如果发现答案在这个块里,就直接暴力找到第k小的是哪个。取块大小等于O(nlog

2016-04-23 14:20:51 1545

原创 [bzoj3720]Gty的妹子树 解题报告

大概看了一眼网上的题解,跟块爷一样都写的会被卡的分块。(反正块爷出的题也不会卡自己。。) 这里说一种比较科学的做法。就是用块链维护dfs序。 维护每个节点按dfs序是在哪个块的哪个位置,对每个块维护块中节点的最浅深度、它的下一个块是哪个块,块中节点按dfs序排序的序列,按权值排序的序列。 一开始的时候每B个分一块,最后一块节点数≤B\le B。查询的时候在两边的块暴力,在中间的块里二分,时间复

2016-04-22 21:55:14 1471

原创 [bzoj4066]简单题 解题报告

也是很久以前奇葩做法搞的题,补个解题报告。大爷的做法:听说是把k-d树写成替罪的或是每n√\sqrt n重建。 傻逼的做法: 我们是理论计算机科学家(当时我弱不会k-d树。。),所以我们需要思考科学的做法。 分块! 考虑将横坐标分成n√\sqrt n份,纵坐标分成n√\sqrt n份,这样会有n个块。内存首先比较科学了。我们显然需要每插入n√\sqrt n个元素重建。我们对每一行维护前缀和,

2016-04-22 17:45:36 1626

原创 [Ahoi2013]作业 解题报告

很久以前用奇葩做法搞的题。。现在补个解题报告。传统做法: 考虑莫队,就需要我们设计一个O(1)O(1)插入,O(n√)O(\sqrt n)查询的数据结构,显然就需要对权值分块,记每个数出现次数和每个块两问的答案(或者第一问另写个主席树也可以,我比较懒)。莫队的块就分成nm√n\over \sqrt m块。时间复杂度O(mn√+nm−−√)O(m\sqrt n+n\sqrt m)。非常好写,跑的飞快

2016-04-22 17:00:09 1161

原创 [Ahoi2008]Rectangle 解题报告

又是喜闻乐见的只会傻逼做法的题。。跟我跑得差不多快的人都写了1K,我写了快4K。。 并不知道他们怎么搞的,说下我的做法: 考虑按x从大到小的扫描线,每次在矩形的左下角(x1,y1)(x_1,y_1)插入一个数y2y_2,判断一个矩形(x1,y1)−(x2,y2)(x_1,y_1)-(x_2,y_2)是否被包含就相当于询问矩形(0,0)−(x1,y1)(0,0)-(x_1,y_1)的最大值是否大于

2016-04-21 21:54:48 652

原创 [poj1741]tree 解题报告

经典的点分做法就不说了(然而我写点分t了。。)线段树/平衡树启发式合并的话,就是维护子树每个节点到子树跟的距离,打一个整棵子树的标记,然后按dfs/bfs序启发式合并,合并之前先查询一下答案即可。 如果用线段树启发式合并的话,时间复杂度是O(TNlog2N)O(TN\log^2N)的,与点分一样;但是如果用splay启发式合并的话,时间复杂度存是O(TNlogN)O(TN\log N),实际跑起来

2016-04-21 17:31:11 1006

原创 [bzoj4527]K-D-Sequence 解题报告

这题一开始傻逼了想了好久笛卡尔树之类的东西,然后一写发现错了。。然后思考了一下又想了个笛卡尔树上的,一写发现又错了。。 考虑扫右端点,设当前扫到了i,那么对于每个j < i,设xj=max{ak}(j≤k≤i),yj=min{ak}(j≤k≤i)x_j=\max \{a_k \} (j\le k\le i),y_j=\min \{ a_k \} (j \le k \le i),就是要求min{j}

2016-04-21 06:58:04 974

原创 [ontak2013]Kapitał 解题报告

令n!=2a5bc,2/|c,5/|cn!=2^a5^bc,2\not| c,5\not |c,这样就CmnC_n^m就便于计算了。a,b很好统计,至于c我们可以先求在mod2k\mod 2^k和mod5k\mod 5^k意义下的,然后扩展欧几里得合并即可。如何求cmod2kc \mod 2^k? 先处理出[0,2k−1)[0,2^k-1)中与2互质的数的阶乘,然后对于n!,与2互质的数就可以直接

2016-04-19 20:49:38 809

原创 [bzoj4544]椭圆上的整点 解题报告

用了很奇怪的暴力。。跑了7s。。出题人跑了2s还有人跑了0.1s不知道他们怎么搞的。。稍微化下式子。 x2+3y2=n23y2=(n+x)(n−x)x^2+3y^2=n^2\\ 3y^2=(n+x)(n-x) 令g=(n+x,n−x)g=(n+x,n-x),则有n+x=ga2,n−x=g3b2n+x=ga^2,n-x=g3b^2或n+x=g3b2,n−x=ga2(a,b∈Z)n+x=g3b^2,

2016-04-19 17:39:19 1901 1

原创 [bzoj3956]Count 解题报告

先来说一下我的傻逼做法: 注意到合法点对只会有2N个,因为一个点作为较小的端点+左/右端点只会有一次,就是和左/右边第一个大于等于它的配对。所以直接上主席树就行。 时间复杂度O(nlogn)O(n\log n)再来膜拜一下morestep大爷的做法(我最近好像每道题都是各种傻逼做法。。): 注意到实际上这道题的点对关系只有相离和包含两种,不会出现abab这种情况。 而且实际上区间最大值会把这

2016-04-19 10:54:20 1004

原创 [pa2015]Fibonacci 解题报告

考虑斐波那契数列模n的循环节,设其长度为L(n)。(这个东西有个学名叫the Pisano period) 显然,若n=pq((p,q)=1),则L(n)=lcm(L(p),L(q))。所以我们就可以将n分解成若干pkp^k的乘积考虑。 对于L(pk)L(p^k)(p是质数,k>1),有一个猜想:L(pk)=L(p)pk−1L(p^k)=L(p)p^{k-1}。(参考资料,据说是一个叫D·D·W

2016-04-19 09:17:34 999

原创 [cqoi2016]伪光滑数 解题报告

这题有点意思。。 考虑对于i个质因子,最大的质因子至多为j能生成的数。我们需要每次在其中取最大值,显然它可以用可持久化左偏树来维护。有leftist(i,j)=leftist(i−1,j)∗j[ji≤n]+leftist(i,j−1)leftist(i,j)=leftist(i-1,j)*j[j^i\le n]+leftist(i,j-1) 然后我们再用一个堆来维护所有可持久化左偏树的根的最小值

2016-04-18 16:10:21 1257

原创 [spoj11482]Count on a trie 解题报告

一开始以为是AC自动机的题,发现一直不会求T的AC自动机。后来想到可以求S的sa,就发现简单多了! 我们可以dfs S,然后对于S中的一个节点处理它的询问。(二分+hash比较大小) 那么问题就在于怎么维护T的hash。本来想用可持久化块链,发现mle了。就只好学了下treap。 treap的话,如果把rank看成下标,把随机的值看成权值的话,其实就是一颗随机数列上的笛卡尔树。树高等于比前面的

2016-04-18 09:49:06 1139

原创 [bzoj4373]算术天才⑨与等差数列 解题报告

先来说一下傻逼的做法。 考虑如何约束等差数列这个条件,如果k=0,就是[最大值=最小值];否则就是区间中[相邻两数差的绝对值的gcd=k][(最大值-最小值)/(r-l)=k][区间中没有相同元素]。 gcd可以在O(log2n)O(\log^2n)的时间复杂度很容易搞出来,所以问题就在于怎么确定区间中没有相同元素。 显然,如果记每个位置下一个和它权值相同的位置在哪,那就转化成了求区间最小值的

2016-04-18 08:36:36 1299

原创 [scoi2005]王室联邦 解题报告

拿来学了一下树分块。 树分块的要求是把树分成⌈NB⌉\lceil {N\over B} \rceil 块,每一块的每个节点到这个块的lca的之间的节点数不超过3B3B. (好像在很久以前听谁讲过。。)做法是按dfs序出栈或bfs倒序考虑,把当前这个子树的剩余块加到它的父亲上,如果它的父亲上的块已经≥b\ge b就把这个块取出来。这样的话出来的就是若干大小在[b,2b)的块加上一个在[0,b)的块

2016-04-15 10:21:14 707

原创 [bzoj2555]substring 解题报告

考虑用splay维护sa,每次比较的时候二分+hash。注意要在两端加-∞和+∞的点。 时间复杂度O((n+q)log2n+m)O((n+q)\log^2n+m)(n是数据总长度,m是询问总长度) 但是普通的hash的话需要用long long+除法运算,一个点需要跑6s。所以改成自然溢出,瞬间只需要2s了。。。(要是被卡了怎么办。。) 听说如果用重量平衡树维护的话可以做到O((n+q)log

2016-04-13 17:36:15 904

原创 SDOI2016Round1

Day1T1做了三个半小时,然后T2写的很急判素数写跪了一句话,T3只剩一个20分暴力的时间了。。于是就这么愉快的滚粗了。发现原来我还不会数位DP。。 Day1T3竟然有log3nlog^3n,不过我卡了很久发现似乎确实卡不掉。。最多卡到1.5s左右。。因为线段下传的log与区间长度有关,如果链剖的log大了的话它就会很小;而如果让在每个重链上的长度比较大就会导致链剖的log变得很小。所以很难卡。

2016-04-12 08:49:56 946

原创 [spoj10707]Count on a tree II 解题报告

一开始不知道这是主席出的神题,不小心点开了。。结果做了1天(想了半天+写了半天)。 我是学莫队的时候在某大神的莫队课件里看到这道题的,他说可以用莫队做。(但这真的算莫队么?) 这道题非常奇怪,就是把 HH的项链 搬到了树上,但是这样就变得好难。。我一开始的想法跟po姐姐的做法差不多,就是把dfs序分成大小为S的块,然后就是O(N3S2+MS)O({N^3\over S^2}+MS),这样显然块越

2016-04-06 16:13:16 2511

原创 [JSOI2009]面试的考验 解题报告

考虑将询问区间按右端点排序。考虑x会与它前面产生贡献的点对,显然,如果i<j<x,ai>aj>axi<j<x,a_i>a_j>a_x,那么(i,x)就是无用的。也就是说我们要求位置 < x且权值大于axa_x的点和小于axa_x的点的两个类似笛卡尔树的序列的东西,而这个在随机数据中显然是O(logn)O(\log n)的。 但是问题是怎么求这个东西呢?一个比较脑残的想法是线段树!就是我们存一棵权值

2016-04-05 14:41:55 1152

原创 [Apio2009]CONVENTION会议中心 解题报告

这题并不会做。。 这道题的主要问题是如何求一个区间的最大不相交线段覆盖,思路是可以用倍增来加速贪心。就是说我们本来是求一个区间里最多有多少条线段,我们把它转换成二分/倍增线段数,求其最短的区间是多少。 代码:#include<cstdio>#include<iostream>using namespace std;#include<algorithm>#include<cstring>

2016-04-05 09:56:29 2335

原创 [beijing2013]禁忌 解题报告

这题非常奇怪。。先说做法。 首先我们考虑一个字符串受到的伤害的最大值,实际上我们把这个字符串中能匹配上的子串看作线段,那就成了经典的线段覆盖问题:选若干个不相交的子串,最多能选多少个? 这样就可以贪心了,表现在ac自动机上的话就是如果到了一个节点,它或它在fail树上的祖先有一个节点是一个子串的末尾,那么到它就等价于直接回根。 然后根据期望的线性性质,期望就是每一步到这种节点的概率和。奇怪的精

2016-04-05 08:15:06 701

原创 群论学习笔记

一、群的定义 群定义在二元组(S,⊕\oplus)上,S是一个集合,⊕\oplus是一个运算。要求二元组满足群公理: 1、封闭性:∀x,y∈S,x⊕y∈S\forall x,y \in S,x \oplus y \in S(x,y可以相等) 2、结合律:∀a,b,c∈S,a⊕b⊕c=a⊕(b⊕c)\forall a,b,c \in S,a\oplus b \oplus c=a \oplus (

2016-04-03 16:32:27 4084

原创 [spoj244]Transposing is Even More Fun 解题报告

拿这题学了一下Burnside’s引理。 模型转换:考虑坐标二进制,转置其实就是将其旋转b位,那么求圈数就转换为了求轨道数。 然后就直接裸上Burnside’s引理即可。 但是。。一个巨大的hack是——注意到数据范围:0≤a+b≤1060\le a+b \le 10^6,a+b为0时除(a,b)可能就re了。所以要特判a==0||b==0时的情况,这时答案为0.#include<cstdio

2016-04-01 09:13:54 1015

空空如也

空空如也

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

TA关注的人

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