- 博客(449)
- 收藏
- 关注
原创 nerrc 2015 J.Jump (神构造)
分析:先随机出一个n/2n/2的情况出来,期望步数是2nCn/2n\frac{2 ^n}{C_{n}^{n/2}}. 把其中一个位翻转,相同的个数要么为n / 2 + 1,要么为n/2 -1,显示结果都是0.如果把其中两位翻转结果就有n/2 + 2, n/2, n/2-2三种情况,第二种是可以鉴别的。 利用这个关系可以枚举其中任意一个是0或者1,找其它n -1个位和它的二元组的情况来求得关系即可
2016-10-24 09:53:52 589
原创 hihocoder 第120周 后缀数组 + 单调队列
分析:求出高度数组,用单调队列维护区间最小值。高度数组的区间最小值的意义就是这些排名相邻的后缀的最长公共前缀。实际上是把所有字符串划分为后缀。这里的是可重叠子串。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout <<
2016-10-19 11:04:38 488
原创 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D. Dense Subsequence 贪心 + RMQ
分析:固定长度为mm的区间不断右移动,只要这个区间内没有一个被选的元素就选择其中一个最小的,利用ST表的RMQ来做到。 这样求出必须要选择的最大的字母的次数,然后比它小的都要选。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue
2016-10-09 17:50:37 458
原创 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) C. Ray Tracing 模拟
分析:把所有的点按照他们所在地斜线分类,斜线形如y=x+b,y=−x+by=x+b,y=-x+b。然后模拟整个运动过程,每次都是一个斜线到另一个斜线的变换,最多有O(max(n,m))O(max(n, m))的复杂度。 比赛的时候快速想出了整个思路,并且紫色渡劫成功。欢迎读者关注Codeforces id:JIBANCANYANG。#include <cstdio>#include <cstri
2016-10-09 13:30:43 528
原创 hdu 4135 容斥
分析:互质的经典容斥,没啥可说的。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ": " << x
2016-10-04 15:29:40 543
原创 hdu 2204 容斥原理
分析:根据指数乘法原理:xab=xabx^{ab}={x^a}^b 所以指数必须是质数,切质数显然应该小于等于2632^{63}。 但是这些质数并不是完全互质的,所以要用容斥原理来做。 这里计算一个指数有多少个可行的数使用的开根号运算符pow(n,1.0/x)+1e−8pow(n, 1.0 / x) + 1e-8加上浮点误差避免。#include <cstdio>#include <cstr
2016-10-04 14:59:07 429
原创 Codeforces Round #374 (Div. 2) C. Journey dp
分析:dp[i][j]表示在i点已经经过j个点最小花费时间是多少。 这里wa了整场,因为j应该是外层循环而不是i#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>#include <string>#include <cmath>#include <vect
2016-10-03 09:19:35 327
原创 hdu 1796容斥原理
分析:就是区间不互质的个数,但是这里注意mm个数不一定都是素数,所以用lcm扩展增加,保证每次增加是素数。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #d
2016-09-26 22:33:26 360
原创 hdu2841 容斥
分析:整数平面坐标系在原点连线上的点,第一对互质,其它都是倍数。 所以就是[1,n][1,n]和[1,m][1,m]间互质的数的个数。 枚举[1,n][1,n]的数,分解质因数,容斥不互质的求反即可。复杂度O(n2phi(n))O(n2^{phi(n)})#include <cstdio>#include <cstring>#include <iostream>#include <algo
2016-09-26 00:16:06 333
原创 poj2836 状态压缩dp
分析:两个点形成矩形可定时连接对角线的顶点。 预处理所有可能矩形的面积和他们能覆盖的点O(n3)O(n^3)。 dp[s]dp[s]表示当前覆盖情况的最小面积和,枚举加入每个矩形即可O(n22n)O(n^22^n)。 注意两点连线平行坐标轴的情况和矩形顶点必须是整数这个条件。#include <cstdio>#include <cstring>#include <iostream>#in
2016-09-25 16:19:42 294
原创 hdu 1695 欧拉函数 + 容斥原理
分析:本质是求区间内与某个数互质的数的个数,如果区间比这个数小用欧拉函数。比这个数大用全集减去不互质的个数。不互质的个数的计算方法是对当前数进行因数分解,然后求能被p1∪p2∪......∪pnp_1 \cup p_2 \cup ......\cup p_n整除的数的个数,显然用容斥。#include <cstdio>#include <cstring>#include <iostream>#
2016-09-23 17:22:47 356
原创 hdu3929 容斥+扩展Lucas定理
分析:根据扩展lucas定理,(1+x)n(1+x)^n含有的奇数项的个数是nn的二进制表达中数字1的个数。 i & -i得到的是ii的二进制表达最右边的11的位置代表的十进制值。我们每次都减去它一个1,这样就有个函数可以算1的个数。 函数实现如下:int get1(int x) { return x ? get(x - (x & -x)) + 1 : 0;}接下来容斥。#includ
2016-09-23 00:11:45 473
原创 hdu5072 数论 + 容斥
分析:求同色三角形的个数,我们用的是逆转换成求不同色三角形的个数,对于每个顶点,只要和它相连的两个边不同色,它就一定可以组成一个不同色三角形,而且一个三角形会被两次计算。所以一个顶点对不同色三角形的贡献是:prime∗(n−1−unprime)/2prime * (n - 1 - unprime) / 2 问题就转化成了求与一个数不互为质数的数的个数。可以对这个数质因数分解,然后容斥的减去所有含有
2016-09-21 11:42:18 353
原创 poj 3254 状压dp
分析:对于一个序列dp的惯用套路是一个元素一个元素的添加,而对于一个二维数组是一行一行的添加,而且要用一个二进制压缩来记录当前行的各种状态。 这里dp[i][s]dp[i][s]表示前ii行,第ii行状态为ss时一共有多少种方法。ss不是任意的而是有很多生成条件,我先预处理除了所有满足不相邻的状态,然后要满足限制使用位运算高效满足的。#include <cstdio>#include <cstr
2016-09-20 10:01:27 276
原创 hdu5073 贪心 + 公式拆解
分析:我来就大胆猜了一个很有道理的结论,一定是连续的n−kn - k个不变,然后扫一遍计算。很巧的一个贪心。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#inc
2016-09-19 22:54:07 313
原创 poj 2441 状压dp
分析dp[i][s]dp[i][s]表示前ii头牛,已经选了ss状态的仓库的方案数,显然dp[i][s]dp[i][s],是由dp[i−1][s−t]dp[i - 1][s - t]转移而来,这时候可以优化成一维的。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace
2016-09-19 14:59:57 275
原创 Codeforces Round #371 (Div. 2) E. Sonya and Problem Wihtout a Legend(技巧 + 离散化dp)
分析:首先,如果只是改变成非严格递增子序列,我们可以用离散化dp来做。 dp[i][j]dp[i][j]表示:前ii个数,第ii个数以原序列中第jj大的数结尾的最小花费。转移的时候维护一个前缀最小值,就可以实现O(1)O(1)转移,O(n2)O(n^2)状态的dp。 但是这里是严格单调递增。我们看看序列严格单调递增的充要条件:对于任意Ai−Aj≥i−j对于任意A_i-A_j \ge i - j
2016-09-18 20:49:44 475
原创 hdu 5884 二分 + 前k优化
分析:大多数人都可以直接想到二分, 然后用优先队列维护每次取前kk大的合并。 但是这样复杂度多了一个lognlogn会TLE。这里想到一个很好的性质,就是合并之后的数,一定比之前合并的数大,所有就把合并之后的数加入一个队列。对原数组也排序处理,这样就得到了两个有序数组,每次在头尾取前kk大即可。#include <cstdio>#include <cstring>#include <iostr
2016-09-18 11:26:14 410
原创 Codeforces Round #371 (Div. 2) C. Sonya and Queries (01trie树)
分析:一看奇偶相互间隔,01trie树直接上,然后调试了整场…….最后Xcode单步调试才查出一个语句顺序错误,还是思维模型不真实。调试好之后只有30s提交wa5,然后发现数据是long long急忙改,还是没来得及,赛后把改了long long的交了就过了。。。 还有本场终于上紫色了JIBANCANYANGJIBANCANYANG 其实可以直接丢数组,因为2182^{18}种不多。。。。
2016-09-14 12:48:25 390
原创 poj 3276 开关反转
分析:通过性质分析,把本来很复杂的问题简化了。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ": "
2016-09-14 00:14:23 394
原创 SCU2016-05 K题 (模拟水)
水。。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 三 7/13 10:21:19 2016**Problem**:**Analyse**:**Get**:**Code**:*******************
2016-09-10 16:45:57 370
原创 SCU2016-04 F题 (大模拟)
颇有难度的代码题。。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 二 7/12 14:49:04 2016**Problem**:**Analyse**:**Get**:**Code**:************
2016-09-10 16:40:52 411
原创 SCU2016-04 A题
/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 一 7/11 16:03:03 2016**Problem**:**Analyse**:**Get**:**Code**:**********************
2016-09-10 16:38:30 317
原创 SCU2016-03 A题 trie树 + dp
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#inc
2016-09-10 16:33:27 278
原创 SCU2016-02 T题 (LIS)
水#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ": " << x << endl;struct n
2016-09-10 16:28:58 384
原创 SCU2016-02 J题 (开关反转)
分析:先确保最左上角的正确,然后确保第一行,最后一次递推接下来的行。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout <<
2016-09-10 16:23:44 281
原创 SCU2016-02 I题 (反转技巧)
分析:挑战上的精选技巧。 由于区间翻转具有以下性质: - 一个区间要么翻转一次要么不翻转 - 最左边的必须翻转 如此递推。。。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " <<
2016-09-10 16:18:06 248
原创 SCU2016-02 P题 (凸包)
分析:内部图案虽然可以凹下去,但是外壳是凸的,这样就才会更节省材料,然后发现就是求凸包周长即可。#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <vector>#include <iostream>#include <algorithm>using namespace std;
2016-09-09 17:18:07 263
原创 SCU2016-02 M题 (dp)
水dp无话可说#include <cstdio>#include <cstring>#include <vector>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ":
2016-09-09 17:09:20 238
原创 SCU2016-02 B题 (缩点+LCA)
分析:把强联通分支全部缩成点,变成一颗树,然后跑一下LCA,每一次加边都会在树上形成一个环,环上所有的边都将不再是桥,并且把环缩成点。#include <cstdio>#include <cstring>#include <vector>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cou
2016-09-09 16:57:32 224
原创 SCU2016-02 A题(LCA)
分析:求树上最短距离,Tarjan算法处理出距离根节点的距离,然后两个相加减去二倍距离根节点的距离即可。#include <cstdio>#include <cstring>#include <vector>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": "
2016-09-09 16:48:59 209
原创 SCU2016-02 G题 (技巧)
分析:蚂蚁相撞的时候位置可以看做互相通过。 所有蚂蚁的相对位置不变。 初始位置排序,计算出T时间之后初始位置处于的位置和运动方向。 根据原来的相对位置套进去,位置和方向皆得到。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(
2016-09-05 20:57:59 279
原创 SCU2016-01 J 题 欧拉路径
分析只有七中数字,那么图中的边数也不会太多。直接dfs去找一条欧拉路径就可以了。。。 欧拉回路和欧拉路径都可以直接dfs找#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x <<
2016-09-04 23:21:15 356
原创 SCU2016-01 I题 二分 + 斜率优化dp
分析: 套路题。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ": " << x << endl;
2016-09-04 16:07:18 427
原创 SCU2016-01 H题 (二分图带权匹配 KM算法)
分析:裸的求最大匹配和。 如果是求最大配积的话,可以先求权值的自然对数的最大匹配和,最后的最大匹配和再取e的幂次就可,当然有精度问题。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " <
2016-08-30 11:16:52 514
原创 hiho一下 第113周 Fibonacci (dp)
分析:dp[i][j]dp[i][j]表示前i个数,以第jj个斐波那契数为结尾的前缀子序列有多少个。转移好想。 这里主要是在10510^5范围以内,斐波那契数只有25个,可以加维度dp。 #include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;#define
2016-08-29 15:38:28 511
原创 SCU2016-01 G题(最大流 + floyd_warshall)
分析:其实就是经典的限制终点的容量的最大流。建立超级源点和汇点。最小化最大路径,二分一下。对于任意最短路Floyd_warshall一下。 code:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>using namesp
2016-08-26 19:25:24 517
原创 hiho一下 第112周 Total Highway Distance (树的所有路径)
分析:很套路的一个树的题,经过一条边的所有路径的数目。 遍历以每个节点为根节点的子树的节点的个数即可求出路径数。 对树进行dfs,要记录父亲节点,防止方向边出现。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;#
2016-08-21 03:31:42 322
原创 Codeforces Round #367 (Div. 2) E. Working routine (十字链表,二维高效交换)
分析链表和数组是两对极端,链表定位慢,增删交换快。而块状链表是二者的综合体 这里大概是一维链表高效交换的二维版本。 维护一个十字链表即可。 十字链表没有必要记录每个元素上下左右的所有元素,只需要记录下和右即可,维持要增加第0行和0列。 对于矩阵交换,暴力的更新整个矩阵周长两边的节点的值即可,复杂度O(q×(m+n)O(q \times (m + n)#include <cstdio>#in
2016-08-15 19:05:54 318
原创 Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (01trie树)
分析:01trie树经典应用,找异或最大值。这里只是多了一个删除操作,只需要记录前缀数,然后增删就可以了。 可以在每一个叶子节点记录当前数是多少。#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>using namespace std;#define pr(
2016-08-13 12:38:03 308
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人