- 博客(31)
- 收藏
- 关注
原创 浅谈基于随机性算法的素数判定
引:考虑这样的一个问题判断一个long long范围内的数是否是素数。引理1-1: ap≡a(modp)|(a,p)=1 a^p \equiv a \pmod p | (a, p) = 1 其实这就是熟悉的Fermat小定理了~~引理1-2: 对于 a2≡1(modn)|n为素数a^2 \equiv 1 \pmod n | n 为素数 的解仅有 a = 1 或 a = n - 1
2016-09-12 22:13:39
660
2
原创 Radix-2 Iterative-FFT
#include<bits/stdc++.h>using namespace std;const double PI = acos(-1.0);const int maxn = 300000 + 10;int n, m, base;int c[maxn], rev[maxn];complex<double> a[maxn], b[maxn], p[maxn];int read() {
2016-08-24 17:25:42
690
1
原创 Radix-2 Recursive-FFT
#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;const int maxl = 300000 + 10;const double PI = acos(-1.0);int base, c[maxl];complex<double> a[maxl], b[maxl], p[maxl];int read
2016-08-18 14:14:41
589
原创 POJ 3580 较复杂的Splay区间维护题解题报告
一、浅谈Splay:在做完这道题后,我对Splay又有了一些新的理解,先简单的介绍一下:1. 在完成最普通的插入和查询时,Splay的时间复杂度可能会高于Treap等平衡树,但是只用它来维护点的信息是大材小用了的。2. Splay的核心操作就是伸展(将某个点旋转到某个点的下方),它不仅维护了一颗平衡树,还支持许多十分“高级”的功能(例如区间维护和动态树上的Preferred Path维护等),
2016-08-13 21:03:49
816
1
原创 POJ 3468 A simple problem with integers Splay 区间维护模板题
题意: 给你n个数字,m组修改或者询问操作,修改为区间修改,询问也是区间和的询问。 分析: 很简单的一道线段树Lazy练习题,用来练习Splay的区间维护也是一个不错的选择,使用标记来加快速度,最后注意答案要开long long即可Ac 代码:#include<iostream>#include<cstring>#include<cstdio>using namespace std;
2016-08-13 11:03:47
438
原创 Manacher算法求最长回文串
#include<bits/stdc++.h>#define REP(i, a, b) for(int i = (a); i < (b); ++i)#define DREP(i, a, b) for(int i = (a); i >= (b); --i)#define debug(...) fprintf(stderr, __VA_ARGS__)using namespace std;cons
2016-08-11 19:41:33
330
原创 函数式线段树
#include<algorithm>#include<iostream>#include<cstdio>using namespace std;const int maxn = 100000 + 10;struct node { int l, r, w; node(int l=0, int r=0, int w=0): l(l), r(r), w(w) {}}T[maxn
2016-08-11 19:34:31
651
原创 拓展Lucas定理求C(n, m) % p
#include<bits/stdc++.h>using namespace std;const int maxn = 100000 + 10;typedef long long LL;LL Pow(LL n, LL m, LL mod) { LL ans = 1; while(m > 0) { if(m & 1) ans = (LL)ans * n % mod
2016-08-11 15:47:48
848
原创 Splay 区间信息的维护与查询 静态模板
Splay树除了被用作平衡二叉树之外,还有许多更高级但我们不常用的功能,比如:用Splay的旋转操作来维护区间信息,这里的旋转优先级我们可以用一个Rank来表示,则Rank[i]就代表了第i个点的优先级(对应的就是原来的序列中的位置标号),通过依据对位置标号的旋转操作,我们可以更加方便直观的维护一个区间的总和、最值等信息,并且理论复杂度与线段树相当。#include<iostream>#inclu
2016-08-10 08:44:53
371
原创 Spoj375 Query on a tree 裸·树链剖分
题意: 边修改,树上最值查询 分析: 又裸又水,略 代码:#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 100000 + 10;void read(int &n) { int f = 1; n = 0; char ch = g
2016-08-08 20:36:32
292
原创 noi2015 软件包管理器 树链剖分 + 线段树维护
题目意思: 给你n个节点,n-1条边构造一棵树,接着有两种类型的询问和操作: 1.求某个点到根的链上的所有值为0的点的总个数,然后将所有为0的节点改为为1的节点。 2.求某个点的子树中的所有值为1的点的总个数,然后将所有值为1的节点改为为0的节点。分析: 很简单的树剖思想:将所有的点按照dfs序编号后,利用一颗线段树来维护树剖则可以加速这个过程,使得整体时间复杂度降为
2016-08-07 21:25:38
356
2
原创 石子合并 四边形不等式优化
四边形不等式能够将动态规划中的许多问题时间复杂度简化,利用四边形不等式,我们可以更好的理解动态规划中的一些例子,下面是一个典型的题目:#include<bits/stdc++.h>using namespace std;const int maxn = 1000 + 10;const int INF = 0x3f3f3f3f;int n;int c[maxn], v[maxn], f[2][
2016-08-06 16:05:55
798
原创 HDU 4010 Query on the tree LCT模板题
#include<bits/stdc++.h>using namespace std;const int INF = 0x7fffffff;const int maxn = 100000 + 10;int n, m;struct LinkCutTree { bool rt[maxn]; int rev[maxn], add[maxn]; int Val[maxn],
2016-08-04 13:59:13
412
原创 La 4128 Steam Roller 状态图上的Dijkstra
题目大意: 给定一个R行C列的网格图和图上的边权(0表示两点之间无法连通), 并已知起点,终点,每次转弯或者启动、停止时需要耗费双倍时间(从上一条边到这一条边的转向和从这条边到下一条边的转向最多计算一次), 求到终点的最短路径。 分析: 我们可以用一个大的状态图来存储整个复杂的图,利用(r, c, dir, doubled)这个状态来表示从上一个点沿着dir的方向到达当前点(r, c)的这条边
2016-08-01 21:04:23
623
原创 Sbt 带查找、查询、删除操作
#include<bits/stdc++.h>using namespace std;const int maxn = 200000 + 10;struct SBT { int cnt; int c[maxn][2], key[maxn], size[maxn]; void init() { cnt = 0; memset(c, 0, si
2016-07-31 20:45:56
638
原创 Size Balanced Tree Sbt模板
#include<bits/stdc++.h>using namespace std;const int maxn = 200000 + 10;struct SBT { int cnt; int c[maxn][2], key[maxn], size[maxn]; void init() { cnt = 0; memset(c, 0, si
2016-07-31 17:20:10
340
原创 Hnoi2010 bounce Link-Cut Tree
#include<bits/stdc++.h>using namespace std;const int maxn = 200000 + 10;int n, m;void read(int &x) { char ch = getchar(); int f = 1; x = 0; while(ch < '0' || ch > '9') { if(ch == '-') f = -1
2016-07-31 15:31:37
377
原创 静态LCT标准模板
#include<bits/st6dc++.h>using namespace std;const int maxn = 100000 + 10;struct Link_Cut_Tree { int c[maxn][2], fa[maxn]; void rotate(int u) { int v = fa[u], t = c[v][1] == u;
2016-07-30 21:19:43
456
原创 UVa 11478 Halum BellmanFord判负权环
题目大意: 给定一个有向图, 每条边都有一个权值, 每次你可以选择一个点v和一个整数d, 使得所有以v为终点的边权值减少d, 以v为起点的边权值增加d, 要使得边权最小的的边尽量大且非负。 代码:#include<bits/stdc++.h>using namespace std;const int maxn = 500 + 10; const int maxm = 2700 + 10;s
2016-07-25 10:52:36
295
原创 UVa 11090 Going in Cycle! BellmanFord 判负权环
题目大意: 给你一个由n个点,m条边组成的有向图,求图中最小环的平均长度。 分析: 根据最小环的条件,我们可以通过二分的方法来实现,对于每个当前二分出来的答案,要使得环上的每一条边的平均值小于当前答案,就等价于 ∑w(i,j)|(i,j)∈E<mid∗size(E) \sum w(i,j) | (i, j) \in E < mid * size(E) 进一步可以推导出: ∑(w(i,j
2016-07-22 16:55:09
285
原创 UVa 10537 The Toll! Revisited! Dijkstra最短路
题目大意: 告诉你n条边构成的村庄和城镇构成的图,每到达一个村庄减少1个单位的货物,到达一个城镇要减少[(wi+19)/20][(wi+19)/20]个货物,问到达终点时要有p个货物,从起点起应至少携带多少货物,并求字典序最小的的路径。 分析: 我们可以从终点出发,计算到起点时的最短路径,这样起点的距离就代表了从起点出发需要的货物数量,则我们的主要任务就是求出字典序最小的路径。这很好解决,根据
2016-07-22 15:10:55
378
原创 La 4080 Warfare and logistics Dijkstra
题目大意: 给定n个点,m条边的无向图, 定义c为任意两点间的最短路之和, 即 c=∑w(i,j)|i∈V,j∈Vc = \sum w(i, j)|i \in V, j \in V 求初始时的c与删去任意一条边后的c’的最大值。 分析: 对于最初始时的c, 我们可以通过每次计算以某个点为源点的最短路径,不难发现,每次计算后的距离和就是初始值c。 每一次进行删边操作时,就可以枚举每一条边
2016-07-21 21:01:56
378
原创 UVa 10917 A Walk through the forest
题目大意: 给你n个点m条边的无向图, 问从起点(1号点)到达终点(2号点)的总路径数量(要求从每个点u走到下一个点v时满足:v到终点的距离小于u到终点的距离。 分析: 从起点出发到每个点的最短路径可以用一次Dijkstra算法求出,那么原问题就转化成了在一个Dag上求路径数目,可以直接DP或者利用Dijkstra计算出的虽短路树来求解 代码:#include<bits/stdc++.h>
2016-07-21 19:33:44
394
原创 UVa 11374 Airport Express
题目大意: 给你n个点和起点终点,再告诉你m条经济线路和k条商业线路,经济线路可以无限制经过,但商业线路只能乘坐一次,问从起点到达终点的最短距离和路径,并输出在什么位置换成商业线路。 分析: 枚举每一条商业线路, 计算在当前线路换乘的最小费用, 并更新距离即可,注意在这之前要预处理两次,分别从起点和终点出发计算距离和路径。 代码:#include<bits/stdc++.h>using n
2016-07-21 08:09:10
533
原创 La3713 Astronauts 2-Sat
题目大意: 有A, B, C三个任务分配给n个宇航员, 其中每个宇航员要被分配一个任务。所有年龄大于平均年龄的宇航员可以选择A, C两种任务,其余人只能选择B, C两种任务, 同时这n个宇航员中有m组矛盾, i 和 j 之间矛盾表示 i 与 j 不能参与同一项任务。 问每个宇航员应如何分配任务。 分析: 本题是一个典型的2-Sat类型的题目,宇航员之间的矛盾有两种情况, 分别表示两个宇航员属
2016-07-20 20:11:06
394
原创 La3211 Now or later 2-Sat
题目大意: 有n架飞机需要着陆,每架飞机有早着陆和晚着陆两种选择,你要为这些飞机安排着陆计划,使得任意两架飞机的着陆时间间隔的最小值尽量大。 分析: 首先,对于这种最小值最大化大问题,我们很自然的会想到二分答案的方法,对于每一个二分出来的答案,如果存在任意两架飞机的某两种着陆方式时间间隔小于当前二分出来的答案,则说明这两架飞机不能同时选择当前方案,则整个问题就转化为一个经典的2-Sat问题模型
2016-07-20 16:57:11
349
原创 Uva 11324 The Largest Clique
题意: 给你一张有向图G, 求一个最大的节点集,使得该节点集中任意两个点u, v,满足:u可以到达v, 或者v可以到达u(u、v相互到达也可以)。 分析: 在最优的方案中,每一个强连通分量中的点要么都选,要么都不选,那么我们就可以先把所有的强连通分量计算出来,然后再将不同的强连通分量建一个新图,则最优解就是一个Dag上的DP了 代码如下:#include<iostream>#include
2016-07-18 21:51:54
359
原创 La4287 Proving Equivalences
题目大意: 给你n个命题和m组推导(单向推导), 问至少需要再做几次推导能够使得任意两个命题之间等价。 分析: n个命题全部等价,即如果将每个命题抽象成点,那么已知的推导就是在两点之间连了一条有向边,要使得所有的命题全部等价,则所有的点应该在同一个强连通分量上,我们可以先求出整个图中原有的强连通分量,再将强连通分量视为一个点构造新的图,可以证明这个图中是没有正向的环的(若有正向环的话,则可以构
2016-07-18 20:59:30
548
原创 La5135 Mining your own Business
题目大意: 给你n条边,让你添加逃生通道,使得不论删除某一个点之后,任何一个点都能到达至少一个逃生通道。 分析: 若任意一个双连通分量中有两个割顶,因为割顶是与其他双连通分量的交点,所以我们只需要考虑只有一个割顶的双连通分量。对于最坏的情况显然是将割顶删去,所以逃生通道不能建在割顶上,可以证明:若逃生通道不在割顶上,即使它被删去,也仍然可以通过割顶到达另一个双连通分量的逃生通道,所以只需特判整
2016-07-18 20:10:40
430
原创 La3523 Knights of the round table
题目大意: 给你n个人和m组关系,每组关系表示两个人相互憎恨,而且相互憎恨的人不能在参加一场会议相邻着坐,而且每次会议参加的人数必须为奇数,问最多有多少人不能同时参加一场会议。 分析: 对于每一个人而言,他两边坐的人只能是与他不相互憎恨的,所以我们可以把不相互憎恨的两个人之间连一条边,那么每一次参加会议的人就必须在同一个双连通分量上,这样才能形成过一个环形图,关键是如何判断这个环是不是一个奇环
2016-07-17 21:30:39
679
原创 USACO 4.2.1 iSap + gap优化
关于网络流的增广路系列算法有很多种,其中dinic和iSap是时间效率和代码复杂度平衡上比较优秀的两种算法,而两种算法在增广时的思路基本一致并且iSap算法具有更优的时间效率和程序竞赛上的应用范围为更广,同时相比于预流推进代码实现更加简单,所以这里我们介绍iSap算法在网络流问题当中的应用。 iSap的思想是基于层数这个特别的关键字来进行操作的,主要过程是每一次之寻找最短增广路,然后每次利用残量网
2016-07-16 08:08:24
969
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人