- 博客(21)
- 收藏
- 关注
原创 CF534
终于写了一篇div2的题解..我还是很弱 A. Exam 题意就是构造一个排列使得相邻两项的差值大于1。 n n >= 4 的情况可以按如下的方式构造 ① n为偶数时我们可以构造出 n-1, n-3, .., 1, n, n-2, .., 2 ② n为奇数时,我们像①那样构造出n-1的排列,最后加上n就行了 B. Cove
2015-04-13 03:26:29 439
原创 bzoj3293 分金币
就是中位数的题。 我们令xi为第i-1个人给i的金币数(如果小于0就是i给i-1金币)。 那么每个人最后的金币数可以用方程表示为: a1 + x1 - x2 = p a2 + x2 - x3 = p . . an-1 + xn-1 - xn = p an + xn - x1 = p 化简为: x2 = a1 - p + x1 = x1 - C[1] x3 = a2 -
2015-03-16 23:58:38 646
原创 hdu1402 A * B Problem Plus
很裸的FFT。 原理到处都有(看算法导论就可以学懂了)。 #include using namespace std; typedef complex cpx; const int MAXN = 50000 * 3; const double PI = 3.1415926535897932384626433832795; void FFT(vector &A, bool inv) {
2015-03-16 23:56:25 409
原创 hdu4027 Can you answer these queries?
这个题乍一看没思路啊,但后来发现每个数小于2^63,开方至多6次就变成1了,然后就不用开方了,只有这么暴力了。 (似乎我的代码里有一些没用的东西= =) #include #include #include using namespace std; typedef long long LL; const int MAXN = 100000; int n; LL A[MAXN + 10];
2015-03-16 23:47:18 479
原创 hdu1542 Atlantis
求矩形面积的并,这个题应该是线段树刚刚出现在竞赛时要做的题。 这个题的主要思想就是扫描,我们将所有矩形竖直方向的两条线段,都拿出来排序,然后扫描用线段树维护覆盖的线段长度即可。 对于如上的矩形给所有竖直线段排序后就可以得到下面的图 我们可以观察到从一条线段到下一条线段之前竖直方向的覆盖长度a都不变,而这两条线段之间的距离为b,那么这两条线段之间的面积表示为a * b。 邻近
2015-03-16 23:09:55 505
原创 hdu3397 Sequence operation
一个很繁琐的线段树的题,对于一个树节点表示的区间 [L, R] 我们要维护以左端点为起点的连续最长的1,以右端点为结尾的连续最长的1,以及这个区间连续最长的1;因为这个题有反转操作,我们还要记录0的情况,其它的就很常规了。 反正要细心,错了就静态查错(主要是代码太丑,不好调试),然后就可以AC了。 #include #include using namespace std; const in
2015-03-16 23:01:08 388
原创 poj3667 Hotel
经典问题,就是线段树[L, R]上保存3个信息,分别表示以L开头最多连续的空格,R为结尾的最多连续空格,这段区间最大的连续空格。然后就可以写代码了。 (为什么我的线段树这么丑) #include using namespace std; const int MAXN = 50000; struct seg { int l, r; int a, b, Max; i
2015-03-16 22:55:59 346
原创 CF258E Little Elephant and Tree
注意到每个操作都是对子树上色,我们先dfs得到dfs序,那么子树u可以表示为区间 [dfn[u], dfn[u] + size[u]) 其中cnt[u]表示子树u的节点数,这样我们就将上色的操作转变成了线段树的区间覆盖。有了dfs序之后,我们就可以再dfs一遍,每到一个节点,就涂色(前提是这个节点有涂色操作),然后统计有多少节点上了色,那么上色数-1就是这个节点的答案。 代码很丑的.. #in
2015-03-16 22:42:49 467
原创 CF256E Lucky Arrays
在线段树上dp。我无论如何也是想不出来的。 我直接说思路吧。就是建一颗[1, n]的线段树,节点域为a[3][3],表示该节点表示的区间首尾分别为x, y时方案数为a[x][y]。叶子节点的a数组的值与于该点的值有关:叶子节点的值z为0时有a[i][j] = (i == j ? 1 : 0),否则只有a[z][z]=1其余为0。那么其它节点的维护可以用如下函数写出: void upda
2015-02-22 21:37:59 419
原创 CF85D Sum of Medians
操作数n void Update(int u) { seg &lch = Tree[u * 2], &rch = Tree[u * 2 + 1]; Tree[u].size = (lch.size + rch.size) % 5; for(int i = 0; i < 5; i++) Tree[u].a[i] = lch.a[i] + rch.a[(i - lch.
2015-02-21 23:43:15 409
原创 线性规划与网络流24题
1、飞行员配对方案问题 二分图最大匹配 2、太空飞行计划 最大权闭合图 3、最小路径覆盖问题 最小路径覆盖 4、魔术球问题 多种解法:二分、匈牙利算法、找规律都可以 5、圆桌问题 这个题很裸,直接连图
2015-02-14 17:38:36 498
原创 寒假水题集
2月1日 1、UVALive 4864 很水的数位dp 2、CF81D 随便构造(好像我用的那个构造本来是错的,但是AC了) 3、UVALive 5058 似乎涉及到拓扑序,组合数之类,但是要先构造一棵树 4、CF486E 正反两遍nlogn的LIS得到的信息 2月2日 1、CF
2015-02-14 16:16:25 462
原创 bzoj3507 [Cqoi2014]通配符匹配
我们可以看见n的范围很小,我们可以依次判断各个文件名是否匹配。 至于如何用含通配符的字符串(下文称“通配符串”)匹配文件名,我们可以按以下几步考虑: ①我们将字符串按'*'依次划分成多个子串s1, s2, s3, ..., sk,下文称这些子串为“通配符子串”(因为这些子串会出现通配符'?'),比如样例"*abc?e**e"将会分成"abc?e"和"e" ②得到的每个子串依次
2015-02-02 23:14:11 1576 1
原创 UVA11396 Claw Decomposition
二分图判定 题目大意: 给出一个简单无向图,每个点的度为3。判断能否将此图分解成若干爪的形式,使得每条边都只出现在唯一的爪中。(点可以多次出现在爪中) 解题思路: 可以将爪的中心点视为关键点,对于每个关键点只属于唯一的爪中,对于关键点周围的3个点均不可能成为其它爪的关键点(否则与题目不符),所以原图可以分解为关键点与非关键点,关键点与关键点之间没有边相连,同理非关键点之间也没有边,那么此题
2015-01-27 22:54:39 531
原创 UVALive2238 Fixed Partition Memory Management
这道题本来很水,但无奈官方数据出错,标程都wa了,让我白忙了2小时,有点难过55... 最后在UVA1006上才交过了= =! 算法思路是: 对于一个内存块x,在里面运行的程序的运行时间为t1, t2, t3, ..., tk,那么第i个程序的结束时间为 ri = t1+ t2 + ... + ti,对于所有在这个内存块运行的程序的结束时间总和为 r=k * t1 + (k - 1) *
2015-01-27 14:02:34 461
原创 UVALive3211 Now or later
2-SAT + 二分 作为第二道2-SAT没什么好说的很简单,相对LA3211已经显示出基本模型了 #include using namespace std; const int MAXN = 2000; struct TwoSAT { int n; vector G[MAXN * 2 + 10]; bool mark[MAXN * 2 + 10]; i
2015-01-25 22:59:14 398
原创 UVALive3713 Astronauts
作为我第一道2-SAT的题就是这么简单 套模版然后就可以连边了,最后AC #include using namespace std; const int MAXN = 100000; struct TwoSAT { int n; bool mark[MAXN * 2 + 10]; vector G[MAXN * 2 + 10]; int S[MAXN *
2015-01-25 22:55:26 388
原创 bzoj1014 [JSOI2008]火星人prefix
splay的区间操作(区间表示),Hash离散,二分答案 Hash值(代码中是RK的hash函数)是一个节点域,除此就没什么特别的了 #include using namespace std; inline int get_int() { char c; int res = 0; while(!isdigit(c = getchar())); for(res =
2015-01-25 17:18:25 463
原创 bzoj3505 [Cqoi2014]数三角形
gcd和一点小思维 最初我还想用组合+容斥原理来搞,但看见那个数据范围就算了 另一种做法就是题解了先用组合数算出选3个点的总情况,然后减去3点共线的情况 至于3点共线的情况我们用O(n^2)的时间枚举两端的点,然后算出在这两个点之间的点 其整点的个数可以用gcd来算(如下图) 如果视左上的黑点为(0, 0)右下黑点(6, -3) 那么这条直线上的整点可以表示为(2n, -n)
2015-01-25 17:07:33 1215
原创 bzoj3506 [Cqoi2014]排序机械臂
splay的区间操作(区间反转) 就是离散化那个地方有点小技巧 #include using namespace std; struct node { int key, size; int Min, sig; node *c[2]; node():key(0),size(0), Min(INT_MAX), sig(0) { c[0] = c[1] =
2015-01-25 16:40:37 589
原创 bzoj3504 [Cqoi2014]危桥
无向图最大流,加上超级源汇,以及神奇的判断 在处理a1的流会走到b2的情况时卡住了,果断看题解发现把b1和b2反一下再做一次最大流就行了(这是为什么呢,没看见证明= =) 先放在这里,等我想下再补充证明 #include using namespace std; struct edge { int u, v, cap; }; const int MAXN = 50; const
2015-01-25 16:20:33 501
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人