首先,这是一道坑题,我拍了几百组数据都是对的,交上去就WA,原因下面会讲。。。一开始我觉得要链剖,后来ZYH说。。。只要dfs序就可以解题。然后,解法嘛。。。就是每个点到根的链都建成一棵线段树,然后发现会MLE,于是就可持久化了所有线段树。在查询的时候呢,先找出两个点a, b的LCA,不妨叫c,然后...
分类:
其他好文 时间:
2014-10-04 17:38:16
阅读次数:
178
题意:
有三种操作:将区间中的所有数置为x;将区间中的所有数加上x;求区间内所有数的平方和。
分析:
先考虑如果不需要求平方和,只是求和,我们需要维护这些数据:addv-区间内的数共同加上的值;setv-区间内的数都置为的值(setv=INF表示不设置);sumv-区间内的数加上addv之前的值。
但这题求的是平方和,似乎不是很好维护。如果只是set操作,还是很好维护的,那么难点就在于add操作了。考虑如下等式:(x+v)^2=x^2+2xv+v^2,x是add操作之前的数,v是add的数,这是一个数的情况...
分类:
其他好文 时间:
2014-10-03 19:23:05
阅读次数:
250
这次求的是三维的。如上篇一样,使用那个特殊的莫比乌斯反演来做。需要注意的是,求得的只是从(1,1,1)到(n,n,n)的互质的个数,还要注意墙壁三面如(0,1,1)~(0,n,n)等。最后+3。因为是(0,0,1);#include #include #include #include #defin...
分类:
其他好文 时间:
2014-10-03 12:58:24
阅读次数:
279
SPOJ Problem Set (classical)
375. Query on a tree
Problem code: QTREE
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered
1, 2, 3...N-1.
We wi...
分类:
其他好文 时间:
2014-10-02 12:56:22
阅读次数:
232
题意:
给k(1
比如 1就是5 ,3就是55 ,4就是56
思路:
首先我们可以发现,一位数有2个这的数,两位数有4个,三位数有8个。。
那么我们可以通过统计确定出第k大的数是几位的。
通过累和,一位数以下0个,两位数以下2,三位数以下6
n位数以下就是2^n-2
然后给k,从大到下搜索第一个小于k的bit[i],那么就有i位数。
然后就是对于i位数,它是第几个数。
比如说k...
分类:
其他好文 时间:
2014-10-01 18:42:11
阅读次数:
137
题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值。解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个。询问的时候,在从u找到v的过程中顺便查询到此为止的最大值即可。代码:#include #include #in...
分类:
其他好文 时间:
2014-10-01 12:00:11
阅读次数:
254
后缀数组求不同子序列数量的简单题。对于一个已经处理好的后缀数组,对于每一个suffix(i),必然会产生len - sa[i]个前缀(假设从0开始), 然后这len - sa[i]个前缀里面有height[i]个是和前面那个前缀相同的,所以是len - sa[i] - height[i]个,求一下和...
分类:
其他好文 时间:
2014-09-26 19:20:58
阅读次数:
128
题意:给定x、y,为[x,y]之间有多少个数的偶数位和减去奇数位和等于一。
个位是第一位。
例子: 10=1-0=1 所以10是这样的数
思路:数位dp[i][sum][ok] i位和为sum 是否含有前导0.
然后就是因为有负数 所以根据范围把0设置为100 然后最后和等于101则为所求的数。
代码:
[cpp]
view plaincopyprint?
#...
分类:
其他好文 时间:
2014-09-26 05:06:08
阅读次数:
228
题意:
对于一个数的每个位上的数。
对于每个奇数,如果出现必须出现偶数次。
对于每个偶数,如果出现必须出现奇数次。
思路:
用三进制存储每个数出现的状态,0没出现,1出现奇数次,2出现偶数次。
然后其他和普通数位dp就一样了。
代码:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#incl...
分类:
其他好文 时间:
2014-09-25 13:08:28
阅读次数:
240
题意:给定x、y,为[x,y]之间有多少个数的偶数位和减去奇数位和等于一。
个位是第一位。
例子: 10=1-0=1 所以10是这样的数
思路:数位dp[i][sum][ok] i位和为sum 是否含有前导0.
然后就是因为有负数 所以根据范围把0设置为100 然后最后和等于101则为所求的数。
代码:
#include"cstdlib"
#include"cstdio"
#inclu...
分类:
其他好文 时间:
2014-09-19 17:43:29
阅读次数:
186