Climber.pI的OI之路

Through the darkest dark,may we see the light.

#

Problem List(2.6 ~ 3.19)

2.6

poj 3660[Floyd]
[题意]
给定n个点, m条有向边, 判断有多少个点的位置唯一确定.
[做法]
从对每个节点的度分析入手. 利用Floyd传递闭包, O(N^3)足矣, 统计所有 入度+出度 = 顶点数-1 的点的个数, 显然如果一个点x, 与其他n-1个点的关系确定, 那么这个点的位置可以确定.
*一开始从度的分析入手(这是对的, 但是要传递闭包), 之后认为是拓扑排序, 在这之后就没有思路了. 但事实上这时候不应该看题解, 至少应该进行30min的思考.
*传递闭包有O(N^2)的做法, 参见去年的shock, 大意是每增加一条边(x, y), 对于任意(a, x), 使得(a, y)连通; 对于y的处理同理.

*每周的训练时间大致是周一下午, 周三一节课.

2.8

poj 3661[DP]
比较奇怪的DP, 去年查阅各种题解后A了, 今年还是不会做 = =|||
[状态]f[i][j]表示第i秒后, 体力值为j时的可以到达的最大距离.
很自然的得到了第一个方程
f[i][j] = max{f[i-1][j-1] + d[i], f[i+j][0]}
很明显两个状态要求的规划方向矛盾.
于是自然的YY了一个错误的方程
f[i][j] = max{f[i+1][j+1] + d[i], f[i+j][0]}
但事实上应该这样考虑
f[i][j] = f[i-1][j-1] + d[i]
f[i][0] = max{f[i-1][0], f[i-j][j]} (i-j >= j && j <= m) => (j <= min(i/2, m))
即对不同的规划方向分别处理.
*本题的关键即对不同规划方向的处理, 其实想一想不见得想不出来

2.13

poj 3663[数学/二分/枚举], 1h
很简单的题目, 但是由于各种细节考虑不周, 连对拍在内写了1h = =|||
[1] 显然可以O(N^2)枚举, 然后随便排序一下, 就可以0.6s通过了.
[2] 我想到的一种很疼的O(N)做法
  (1) Cnt[n]表示1..n的值的个数, 可以利用前缀和得到
  (2) 对于每个L_i, 累加Cnt[S - L_i] - (2*L <= S), 需要讨论S - L_i >= Max{L_i} 和 S - L_I <= 0的情况
  (3) 显然每对数都被计算两次, 输出ans/2即可
[3] 官方题解的O(NlogN)做法
  (1) 排序
  (2) 对于每个Lower, 计算满足题目的最小Higher, 累加Higher - Lower即为答案

poj 3664[排序]
利用qsort对A[]间接排序, 然后利用O(K)的时间循环检查最大值即可, 复杂度O(NlogN)

poj 3665[模拟]
很像是数据结构题的小范围写法 = =|||
按照题目模拟即可.

2.20

poj 3662[最短路+二分]
[题意]
给定N个点, P条双向带权边, 其中K条边的权可以为0, 求最大边权的最小值.
[做法]
根据描述很容易想到二分, 注意到题目对前K条边的具体情况没有要求. 用f(M)表示最大边权为M时是否可行, 把边权大于M的边赋值为1, 小于M的边赋值为0, 求最短路即可.
*这里并不能使用BFS求最短路, BFS仅在无全图中可求最短路.
*注意二分的写法, 可以打出f(M)的值观察条件
*注意无解和0的区别

3.5
MAR12 Silver[未实现]
P1
[Brief]
在1000*1000棋盘上从(x, y)到(1, 1), 给定N个定点, 最少通过N个定点中的几个点.
[Solution]dij+heap, O(ElogV)
对每个点u, 如果其周围有定点v则 w(u, v) = 1, 否则w(u, v) = 0. 易知|V| <= 4*1000^2, 直接求(x, y) 到 (1, 1) 的单源最短路即可.
P2
不会做...
P3
同上 > <

3.12
MAR12 Bronze[我堕落了...]
P1: std将17拆分为16+1, 从而避免了进制转换.
P2
[Brief]
从(0, 0)开始, 仅在N个顶点可以转弯(90或180), 求有多少序列可以仅经过一次所有点, 并回到原点.
[Solution]
O(N!)生成序列, 直接利用坐标判断是否合法即可.
P3
[Brief]
给出一个序列(L <= 10^5), 每个字符可能是三个操作符F/L/R其中之一, FJ打错了一个字符, 试统计可能到达多少种不同的终点.
[Solution]
(1) 扫描序列, 记录每个点的位置, 可以得到任意两点之间的向量. 
(2) 枚举每个位置可能的错误字符, location(n-1) + (n -> dimension)即为答案. 
(3) 记录每个可行终点, 利用排序去重.
总复杂度O(N+N+NlogN) = O(NlogN).

3.15
MAR12 Silver
flowerpot[Heap/二分+RMQ]
[Brief]
给定N个坐标, 满足|y_j - y_i| >= D, 求|x_i - x_j|的最小值, 若不存在最小值则输出-1.
*题目真心看不懂, 看了样例才懂了.
[Solution]
[1] O(N^2)暴力枚举每个坐标
[2] O(NlogN)
  (1) 对x升序排序
  (2) 求出y的区间最大/小值
  (3) 二分|x_i - x_j|, 这里需要记录对于每个x_i, x_i+D的位置(可能不存在)
-> 这个思路非常麻烦, 不可行
[3] O(NlogN), 利用Heap
和我最初的想法一致.
  (1) 对x升序排序
  (2) 对于每个x_i, 找到最近的x_j, 满足|y_i - y_j| >= D
事实上(2)可以进一步强化为|max{y} - min{y}| >= D, 也即若区间[i, j]满足题意, 但|y_i - y_j|不满足题意, 则其中必有子区间满足|y_i - y_j| >= D
[译自官方题解]
我们首先对所有点的x进行排序, 然后利用一对竖直的扫描线, 从左至右遍历整个平面. 一对扫描线之间的点的y值, 利用一个能够快速查找最大/最小值的数据结构存储, 例如STL multiset(如我们在下文所使用), 或者一对堆. 每当最大和最小的y的差至少为D时, 我们检查此时是否得到目前位置的最优结果, 之后将左扫描线向前移动. 否则, 我们将右扫描线向前移动. 算法总的运行时间为O(NlogN).
*对(2)进行强化后, 可以避免大量冗余操作
*强化后, (2)可以直接使用Sparse Table在O(1)得到最值. 效率应略高于官方题解.

3.19
[利用qsort对结构体排序]
int cmp(const void *a, const void *b){
    point *A = (point*)a, *B = (point*)b;
    return (A->x > B->x) ? 1 : -1;
}
*A是一个指针, *A = (point*)a表示把无类型指针a转换为point型的指针
int cmp(const void *a, const void *b){
    int i = *(int*)a, j = *(int*)b;
return (i > j) ? 1 : -1;
}
i = *(int*)a表示先把无类型指针a转换为int型的指针, 然后利用*得到指针所对应的值

flowerpot[区间扫描+RMQ(Sparse Table)], 40min
(1) 对x升序排序(由于之后需要得到区间最值, 直接对结构体排序, 而非间接排序)
(2) sprase_table
*f[i][j] = max{f[i][j-1], f[i + 2^(j-1)][j-1]}, 初始化f[i][0] = P[i].y
(3) 区间扫描, 初始区间[i = 1, j = 1]
  i) 若区间[i, j]满足题意, 尝试更新答案, ++i
  ii) 若区间[i, j]不满足题意, ++j
  *对于操作i, 此时区间合法, 为了得到最短区间, 左指针右移.
  
landscape[DP, 编辑距离], 1h
[Brief]
给定一个长度为N(N<=100)的序列, 序列中的每个元素权重为a_i(Σa_i <= 1000), 对A_i加1需要付出代价X, 对a_i减1需要付出代价Y, 把1个单位从a_i移动到a_j需要代价(j-i)*Z, 求把序列a_i变换为序列b_i(Σb_i<=1000)的最小代价.
[Solution]
[1] 最初由N的范围猜测是DP, 用f[i][j]表示前i-1个元素已符合题意时, 第i个元素权重为j时的代价. 遂发现此时存在后效性, 无果而终. 进而猜测可能是网络流模型, 参看题解.
*和GDKOI 2012 Day1一样, 最初的想法是正确的, 略深入的想法是错误的, 但此时切换角度思考就能得到正确结果.
[2] 换一种角度, 我们考虑每个代价的位置序列A_i, 变换为B_i. 序列A_i和B_i单调不降. 考虑到题目中的三种操作, 套用"编辑距离"模型.
[状态] f[i][j]表示A_1..i和B_1..j符合题意时的最小代价
[方程] f[i][j] = min{f[i-1][j] + Y, f[i][j-1] + X, f[i-1][j-1] + Z*|A[i] - B[j]|}
[初值] f[i][0] = Y*i, f[0][j]= X*j
*对于确定大致方向的题目, 可以分别考虑题目中涉及的几个量, 进而得到解法.

posted @ 2012-03-19 18:49 Climber.pI 阅读(147) | 评论 (0)编辑 收藏

Problem List(1.25 ~ 2.1)

//GDKOI 2012之前涉及的题目, 由此可见寒假真的什么都没做

1.25

air[二分图最大匹配 -> 最大流], 1h
[建图]
(1) 在飞行员u和外籍飞行员v间增加有向边(u,v), 同时增加源S到u的边(S,u), 以及v到汇T的边(v,T).
(2) 考虑到n<=100, 利用邻接矩阵存储, 上文增加边容量为1, 其余为0, S到T的最大流即为答案.
(3) 直接利用map记录u和v的对应关系
*数据的方案似乎不是最小字典序, 此外题目中未涉及方案的顺序问题, 暂不考虑.

path[最小路径覆盖 -> 二分图最大匹配 -> 最大流], 1h
注意到在路径覆盖中, 每个点只能被覆盖一次. 
[建图]
将每个点拆分, 然后源S和汇T分别连边, 点间按照题目要求连边, 求最大流f即可.
显然如果要增加一个路径覆盖, 必须存在某点没有前驱(或后继), n-f即为所求.
[输出方案]
利用flow数组从1开始遍历, 用vis标记已访问点即可.

某题 by ftiasch
Given two sorted arrays A, B of size m and n respectively. Find the k-th smallest element in the union of A and B. You can assume that there are no duplicate elements.
http://www.leetcode.com/2011/01/find-k-th-smallest-element-in-union-of.html
[O(log(n+m))做法]
你假设求第k大嘛, 肯定是这边来前i个, 那边来前j个. 然后二分i, 就有j了. 然后check一下合法否.

1.27

poj 2976[分数规划 -> 参数搜索]
[定义]一般地, 求max{a(x)/b(x)}, a(x) b(x)是实值函数, 且b(x)>0.
特别地, 如果max{a(x)/b(x)} ∈ (0,1), 称为0/1分数规划
[解法]
不妨设lambda即为所求.
显然满足 a(x)/b(x) >= lambda (注意大于等于号)
整理可得 a(x) - b(x)*lambda >= 0
显然存在任意x值满足lambda即可, 比如在这种情况下可以求函数最大值, 若最大值不满足, 那么显然这个lambda不会得到满足.
设g(lambda) = max{a(x) - lambda*b(x)}
分析可知:
g(λ) > 0 <=> λ' < λ
g(λ) = 0 <=> λ' = λ
g(λ) < 0 <=> λ' > λ
转换为0/1分数规划后, lambda ∈ (0, 1), 可以二分lambda, 注意a(x)和b(x)的求法因题目而异.
*比如最优比率生成树问题
*可以利用qsort直接对double排序, 写法和int一致, 需要注意排序时return x > 0 ? 1 : -1;不要返回0
*对于浮点误差, EPS = 1e-8, 越小越好(时间代价?)

1.31

GDKOI 2010分析[未验证]
30 + 20 + 12 + 12 = 74
30 + 40 + 20 + 12 = 102
考虑到实际情况, 以及对拍时间, 似乎150+并非不可能.
Day1
[1]load
AC, 改变松弛条件的最短路, 可以使用Floyd
[2]goodjob
30%, 裸DFS
AC, 状压DP
[3]pizza
30%-50% 乱搞, 利用最大m段和或者分数规划
AC 利用周期数列的性质?不明.
[4]plan
30% 暴搜?
AC 费用流
Day2
[1]collection
数学题, 通过简单的变形得到函数, 可以利用三分法或者Cauthy不等式求解
[2]cook
10% 暴搜, 生成全排列
AC 4维DP
[3]table
50% BFS
AC 双向BFS
[4]push
30% 模拟
AC 利用扫描线思想, 对坐标排序[具体不明...]

GDKOI 2011分析[未验证]
30 + 20 + 8 + 12 = 70
24 + 20 + 12 + 12 = 68
考虑到考场上可能的问题, 大概能保证100.
Day1
[1]sewer
DFS/BFS/...随便模拟
*小数据验证
[2]park
50% 对于每个长方形, 枚举每棵树是否在其上, O(NM)
AC 通过某种操作把验证某个树在某个矩形上, 由O(N)降至O(logN), 比如平衡树
*小数据验证, 如果构造AC算法必须对拍
[3]mission
20% 模拟
AC T_T我不会
[4]move
30% BFS
AC A*/状压DP
*小数据验证
Day2
[1]weight
30% DFS, O(3^N)
AC 分成两堆, 分别进行DFS, 然后对于每个砝码组合m, 在另外一堆里找n, 使得m+n满足题意即可.
*两种思路对拍
[2]ponytail
50% 简单分析之后利用整除性和打表暴力
AC 进一步的分析, 利用欧拉函数求解
根据题意
s >= x + y ...(1)
1/x + 1/y = 1/z ...(2)
由(2)可得, x+y | xy ...(*)
设(x, y) = d
可得x = d * x1, y = d * y1
代入(*)可得 x1+y1 | dx1y1
易证x, y分别和x+y互质
令d = t(x1 + y1), 代入即得
s = x + y = t(x1 + y1)^2
令n = x1 + y1, 显然满足题意的n的个数为欧拉函数φ(n), 满足题意的t的个数为[S/n]
综上可得, Σφ(n)*[S/n]即为所求.
[3]bright
30% 最大流
AC T_T我不会
[4]eight
30% DFS
AC 状压DP
=> 导出结论, 主要复习暴搜, 其次复习基本算法, 如图论若干, ST等.

2.1
rqnoj 70 八数码难题[BFS+hash], 2h
BFS实现, 利用hash判重(简单的取余法)
*移动步骤考虑不周, 可以直接利用数组存储, 四个方向分别为±1或3; 需要注意±1, 即左右移动后, 0必须在同一行
*hash写错

双向广搜, 扩展完一边的该层节点, 再扩展另一边的一层节点, 直到两边状态相遇.
http://longxiaozhi.is-programmer.com/posts/24858.html
实现无能, 遂放弃.

posted @ 2012-03-19 18:48 Climber.pI 阅读(100) | 评论 (0)编辑 收藏

GDKOI 2012及其他

一周之前的此时, 我应该在广州的地铁上, 带着怅然若失.
41 + 58 = 99, 二等分数线102, 其实也没什么可说的, 寒假没干正事, 结局如此确是正常.
本来打算写点东西, 现在看最近几天完成这个难度有点大, 这个月抽时间写吧.

"心中随生一种风云际会但终将风流云散的感觉"

Day2结束的时候, 看着wx神牛的成绩单, 无比诧异, 虽然带着一大堆行李, 却也去复评了一吧. 反正没机会再以选手身份来了, 倒不如把流程都体验一遍.
这几天渐渐的开始筹划CMOp了, 其实也就半年而已, 我也不知道自己能走多远. 渐渐的回忆起了以前不长的MO生涯, 删了一下午文件, 删着删着又怅然若失了. 现在听轻音乐又和NOIp前一样, 又开始觉得一股绝望溢出胸口.

而我, 却不知道忧伤从何而来.

posted @ 2012-02-11 20:25 Climber.pI 阅读(257) | 评论 (0)编辑 收藏

Problem List(11.19 ~ 12.26)


11.19

poj 1258[Kruskal]
和training的那题一样, 注意有多组数据
*数组开错, 没有区分MAXn/MAXedge

11.21

poj 1944[DP], unAC
没看出来是DP.
网上有两种做法:
 (1) 三维DP
 (2) 两个二维DP

快速读入 by gXX
int getInt() {
 char ch = getchar();
 while (ch < '0' || ch > '9') ch = getchar();
 int ret = 0;
 while ('0' <= ch && ch <= '9') {
  ret = ret * 10 + ch - '0';
  ch = getchar();
 }
 return ret;
}
qc #20:
 getInt(), 0.06s
 fscanf(), 0.2s
 fstream, 0.35s
 
11.28

马走日问题[回溯], 1h
*lrp问了, 昨晚随便敲了一下, 发现想得乱七八糟, 果然要想清楚问题再敲.
求(1, 1)到(m, n)的路径数, 注意回溯边界即可.

NOIp2011P, 统计单词数[字符串], 1h
读入文章中的每个单词, 转换大小写后, 和已知目标单词比较. 记录相同单词数, 及每个单词的首字母在文章中位置即可.
*trick:
(1)文章中单词间可能存在多个空格, 因而需要读入每个字符
-> 需要注意的是, 需要删除pdf样例中多余的空格
(2) 文章中的单词长度可能远大于目标单词长度
*很像叉姐第一次模拟题的第一题

NOIp2011P, 瑞士轮[双关键字排序], 60, 40min
*样例说明很详细
需要注意双关键字排序和间接排序的区别:
(score[i] < score[j] || (score[i] == score[j] && i > j))
这里直接比较i和j, 而非id[i]和id[j].
*我觉得我这么废都能一等就是一个奇迹.. >_<

11.30

NOIp2011T, 选择客栈[数学], 2h
(1) 注意到各颜色间相互独立, 不妨单独处理
(2) 题目要求找到区间中存在任意满足条件点的区间个数, 即所有子区间的个数减去连续不满足条件的区间个数
*边界各种挂, 调试无能

12.5

NOIp2011P, 瑞士轮, 1h
*非常心不在焉
*注意静态查错 -> 如果出现循环, 大部分正确, 最后出现错误的情况, 极有可能是打错变量.
*注意数组的实际意义, 如存储标号还是值
(1) 以force[]为第一关键字降序, id[]为第二关键字升序排序
(2) 注意到过程中只有N个元素+1, 其余N个元素不变, 且对于变化或者不变的元素, score[]单调递减
故而对于每组选手(i, j), 利用队列A[]存储胜利选手, 队列B[]存储失败选手
(3) 按照双关键字合并队列A[]和B[]
(4) 将(2)(3)进行R轮, 输出id[Q]即可

NOIp2011T, 选择客栈, 1h
(1) 利用邻接表(数组实现), 按颜色存储客栈; 利用前缀和sum[i]表示1..i中cost_i <= p的客栈个数
(2) 对于每种颜色的每个区间预处理part[], 表示该区间是否符合条件
(3) 利用补集思想, 计算连续的不符合条件区间, C(2,N) - ∑C(2,N_i);
初始化pos = 1; 对于当前指针k, 若part[k] == 1, 则ans -= C(2, k-pos+1), pos = k+1; //pos记录当前第一个不符合条件区间的标号
*边界比较麻烦, 实现之前应该计算好
*尽可能分开不同步骤, 降低思维难度

12.12

NOIp 2011P, 表达式的值[表达式树], 1.5h, 80
*实际上50min就写完了, 查错查了很久
(1) 建树(左闭右开区间)
 1) 找到括号外第一个+或*(即结合性反方向在括号外第一个运算符, 利用p记录是否在括号中)
 2) 若不存在+, 令posO=posA
 3) 递归build_tree(L, posO), build_tree(posO+1, R)
    若不存在*, 则递归build_tree(L+1, R-1)
 *[优化] 每次过程执行前, 脱去所有括号, 需要记录括号位置; 如果直接判断端点, 可能会出现(*)+(*)的情况, 导致WA
(2) treedp(其实就是简单统计)
 1) op[i] == '*'
  f[i][0] = (f[i.l][0] + f[i.l][1])*(f[i.r][0] + f[i.r][1]) - f[i.l,1]*f[i.r,1]
  f[i][1] = f[i.l][1] * f[i.r][1]
 2) op[i] == '+'
  f[i][0] = f[i.l][0] * f[i.r][0]
  f[i][1] = (f[i.l][0] + f[i.l][1])*(f[i.r][0] + f[i.r][1]) - f[i.l,0]*f[i.r,0]
 *如果左子树或右子树不存在, 则f[i.k][0] = f[i.k][0] = 1(特判, 直接赋值引起错误)
*朴素的表达式树是O(N^2)的, 常数较小, 可以利用两个奇怪的栈做到O(N). by gXX

12.19

NOIp 2011T, 观光公交, 研究题解.[*待实现]
*真是每周一题我擦...
(1) 初步的分析包括不使用加速器时的时间计算, 以及对加速器对时间影响的简要分析. => 一个比较关键的结论是, 加速器对时间的影响一定是一个连续段
(2) clj题解给出了一种非常高效的O(M+NlgN)做法, 实质上利用堆处理了取最大值的问题.
(3) O(kN)的做法比较好理解, 实质是利用g(i)数组表示d[i]-1可以影响[i, g(i)]的时间值, 对于每个加速器找最大值即可. 看起来时间可能比较尴尬, 不过实测效果很好.

12.26

NOIp 2011T, 观光公交[贪心+递推], AC
[1] 10% 做法, O(N)
每个景点的最晚出发时间
time[i] = max{T_j} (A_j = i)
每个景点的到达时间
enter[i] = max{time(i-1), enter(i-1)} + D[i-1]
景点1..i的游客数为sum[i]
ans = Σ(enter[B[i]] - T_i) (1 <= i <= M)

[2] 20% 做法, O(N^2)
仅考虑一个加速器, 尝试将其用于任意两个连续景点间, 记录最小值.

[3] 60%做法, O(kN^2)
可用反证法证明, 当前加速器在最优位置时, 前一个加速器必然在最优位置. 符合贪心选择性质.
因而, 对于每个加速器, 重复20%做法即可, 非常易于编写.

[4] AC做法, O(kN)
分析易知, 若对景点i到景点i+1应用一个加速器, 景点i之前的距离不受影响, 景点i之后仅当enter[i]-1 >= time[i]有影响, 因而受影响的若干个景点必为一连续线段.
g[i]表示在景点i到景点i+1应用一个加速器, 连续段[i, g(i)]受到影响, 可得
[方程]g[i] = g[i+1] (enter[i] > time[i])
    i+1 (enter[i] <= time[i])
[边界]g[N-1] = g[N]
(1) 初始化数组
(2) 对于D[i] > 0的段, 计算max{sum[g[i]] - sum[i]}, 应用加速器
(3) 对于[i, min(g(i), N-2)]更新enter[]和g[]
(4) (2)(3)重复k次
*60分做法的只有50行, AC做法也不过70行. 60分做法只要对题意理解清楚不难实现, 10+min可以写完. AC做法发现了连续性质, 利用递推将寻找最优位置的耗时从O(N^2)变为O(N^2), 有一定思维难度, 但是和Day2P2的难度相差无几.

[5] AC做法, O(M + NlogN)
基本同上, 无需使用g[]数组, 对于每个路径一次应用多个加速器, 利用堆求得最大值.
未实现, 参考clj题解.

posted @ 2012-01-03 13:59 Climber.pI 阅读(147) | 评论 (0)编辑 收藏

Happy Ending

好在一等了.
390 = 100 + 60 + 20 + 100 + 100 + 10, 省排62, 市排2.
Day1 180, 省排152; Day2 210, 省排24.
主要是我AC了Day2P2, 那题全省的AC率只有10%左右.
和那天的密码一样, 真是Happy Ending.
-----------------------------------
但是, 身边的人的悲伤, 太多了

posted @ 2011-11-23 20:52 Climber.pI 阅读(162) | 评论 (0)编辑 收藏

NOIp 2011 随记

去年在纪中, 我看到成绩单直接傻了.
当年会写270, 结果DP写挂了, 数组开小, 应该30, 结果爆零;
第四题, 30min, floodfill没调出来
于是直接130, 所幸还有个三等
-------------------------------------
今年比去年淡定多了
Day0果断去逛纪中

Day1还是很紧张, 题目很简单, 30min想出算法, 题意抄了满满一页
被叉姐模拟赛的WA吓怕了, 第一题就开始对拍, 写完两个程序外加gen, 已经过了1h了
第二题写了四个版本的程序O(N^2) -> O(N^3) -> O(N^2) -> O(N^2)
一开始还看错题了, 还好查出来了.
担心时间不够, 没敢想O(N)的AC算法, 却用了10min敲了ST, 所幸敲对了
第三题果断写30分, 结果最后还是没调出来

Day2开始淡定了, 题目5min看完, 第一题瞬间想到AC算法, 二三题无思路
于是半个小时, 敲完了第一题, 看着旁边的人手足无措, 有些洋洋自得
接下来敲第二题的暴力敲了30min, 出去了一趟, 瞬间想到了二分+前缀和优化, 又是30+min, 敲了AC算法
纠结了一下二分, 然后开始看第三题
突然发现对拍器听了, 修正了一个边界问题, 和昨天相仿, 只剩下40+min了
很快的YY了一个40分的DP, 却对正确性和边界毫无把握
于是写了一个10分的, 然后想20分的时候, 突然找到bug, 修正了
交卷的时候, 瞬间想到20分写法, 但是没时间了

Day2的发挥还好, 看起来210. Day1看起来只有170, 不知道还会不会再出问题.
Ylen神牛貌似写了230 + 210, wx神牛可能500+, xh裸考看起来都和我成绩差不多....
看了WJMZBMR神牛的题解, 三题做法一样, 有些心安. 看了贴吧, 发现某题某种边界情况没有测试, 细想了一下好像没问题.
本来挺淡定的, 颓了一个下午又心慌了. 还有不少作业, 还是不能颓啊.

posted @ 2011-11-14 19:33 Climber.pI 阅读(357) | 评论 (0)编辑 收藏

Problem List(10.29 ~ 11.12)

10.29

WZOI第一次模拟赛, 2h -> 0
卡第一题, 现在头晕中. 思路错误, 很快的得到了题意, 对斐波那契数列取模. 然后用特征方程搞出了递推式, 然后发现n>=20后的情况, 尝试对无理数取模, 然后各种头晕.
*这是NOIp, 不是CMOp, 怎么会考这么蛋疼的东西. 找时间重写吧, 限时2.5h. -> 应该往周期数列的方向上想
*感觉现在需要系统复习, 又是瓶颈状态

10.30

调教Ubuntu in VMware, TeX中文无能

姜碧野论文<SPFA算法的优化及其应用>, 学习差分约束系统
*还有两种优化SLF和LLL, 真心觉得不如打dij+heap

butter, 复习SPFA.
*关于数据结构的整理
(1)邻接表 first/next/u/v/w/Cnt -> addEdge()
(2)SPFA d/q/inq
(3)初始化 first/d
*没有考虑双向边, 不可达的情况. 在敲代码之前应尽可能完善算法.

poj3259[DEC06, Gold, SPFA找负环]
(1) BFS做法
数组count[]记录每个点的入队次数, 由定义易知, 若count[i]>=N, 则图必然存在负环.(<算法之道>上有个很好的例子)
*标程直接按照Bellman-Ford的定义做, 复杂度O(NM). 网上的一次BFS的做法是错的, 比如两个强连通分量的情况:
1
6 4 2
1 2 2
1 3 2
2 3 2
4 5 2
5 6 10
6 4 10
*因而N次SPFA的效率O(kNM)可能不如裸的Bellman-Ford O(NM); 更好的做法是Tarjan+SPFA, 即只对每个强连通分量进行SPFA, O(N + kM) 
*优化: 
1) d[]可以初始化为0, 速度比(3)要快
2) 入队次数不超过2(M+N), 可能错误
(2) DFS做法, WC09姜碧野论文涉及, 实现无能.(网上的做法又是错的)
(3) Bellman-ford, O(VE)
三重循环, 对每条边更新V次, 效果好于(1)
*SPFA找负环, 利用vis标记每个点是否被访问过, 仅对当前未访问的点进行SPFA, 这样的话效率应该高于O(VE) //期望情况下

10.31

poj1201[差分约束系统], 25min, 1Y //参见WC06冯威论文
关键在于建模, 令d(i)表示0..i的整数个数, 可得
d(b) - d(a-1) >= c_i
d(i) - d(i-1) >= 0
d(i-1) - d(i) >= -1
w(a-1, b) = c_i
w(i-1, i) = 0
w(i, i-1) = -1
按照定义, 求整数个数最小值, 即求SPFA最长路.
*注意更新最小标号idS, 最大标号idE, 第二类边要对1..idE的情况赋值
*关键在于找出差分方程组
http://blog.csdn.net/kk303/article/details/6864199
*一般的解题步骤: (1)建模 (2)设计数据结构 (3)写出大致流程

po3169[差分约束系统], 35AC, 3WA
(1) 建模
题目中给出两种边(a, b) , d
对于第一种, (a, b) >= d
对于第二种, (a, b) <= d, 即(b, a) >= d
*SPFA求最短路, 还是最长路, 由不等号方向决定
(2) 讨论各种解的情况
1) 正常
2) -1, 存在负环
3) -2, 无法连通
*对于负环, 小范围Bellman-Ford(多进行一轮松弛操作), 大范围一次SPFA(count[i]>=N)
*各种字母打错, 变量打错 -> 对于点, MAXn; 对于边, MAXEdge;

东方幻想乡Stage2, P4, suika[分层图最短路+SPFA], 1h
(1) 建图
1) 点从奇时刻到偶时刻(U,U'), 从偶时刻到奇时刻(U',U)
*需要注意黑洞停留消耗体力s[U], 白洞不消耗
2) 边, 两种情况
A. 端点颜色&重量相异(正负号取决于题意)
奇时刻到偶时刻 (U, V') = w(U, V) ± delta
偶时刻到奇时刻 (U', V) = w(U, V) ± delta
B. 端点颜色相同/重量相同
奇时刻到偶时刻 (U, V') = w(U, V)
偶时刻到奇时刻 (U', V) = w(U, V)
(2) SPFA最短路
*注意读题(题意/算法流程/数据结构)
*Nettle标程的做法, 规定2*U为偶时刻点, 2*U-1为奇时刻点, SPFA起点由起点状态决定. 可以避免建图时的讨论.
*算法三依旧理解不能.

NOIp09, trade
(1) 传递闭包+枚举, 40
1) O(kN^3), 利用邻接矩阵更新连通性
2) O(N^2), 对每个点找最大旅费, max{w[i] - min{w[j]}} ((j,i) (1,j) (i,N)连通)即为答案
(2) 两次SPFA维护连通性+枚举, AC
1) 从起点1开始SPFA, d[i]表示(1,i)是否连通; 
A. 对于正环的处理
按照定义, count[i]>=N则不再入队.(这样70, 利用r<=2*N不再入队可以AC)
B. 记录遇到的最小价值Min{A[j]}
2) 从终点N开始SPFA, 将之前的边反向(添边时使用last和prev数组, 替代first和next数组), 维护连通性
3) 枚举min{A[i] - min{A[j}}, (j,i)连通, 1<=i<=N的最大值即为答案.
*题解给出了两种做法
(1) 求强连通分量缩点, 转化为DAG, 然后求解
(2) d[i] = min{d[i], d[j], a[j]}作为松弛操作, SPFA

SPFA专题结束, 明天开始Tarjan和dij+heap

11.1

agrinet[Kruskal], 20min, 复习Kruskal

11.2

Tyvj, Sept09, P2[Kruskal + 并查集]
需要理解Kruskal的过程, 做法如下:
(1) 间接排序(边集数组)
(2) 按照Kruskal, 从w[i]最小的边开始统计,并查集维护联通性
p[x] = y;//并集
num[y] += num[x];//统计每个集合的点的个数
maxe[y] = max{maxe[y], maxe[x], w[i]};//维护每个集合的最大边
ans += (C(2,num[x]+num[y]) - C(2,num[x]) - C(2,num[y]) - 1) * (maxe[y] + 1);//统计没有联通的边
*没有间接排序WA了一次,可以通过小数据检验(比如深度不同的树、链)
*各种卡long long, 可以计算最大值为10^6C(2,10^6)
-> long long的类型转换, long long类型的计算中, 数字必须标识ll, 否则会导致计算错误.(也就是说可能爆int范围的地方都要用long long)
-> [by gXX] 可以这么分析, (long long) = (int) * (int) / (int); 于是中间的寄存器会挂掉
*深度大于1的树的生成 by Ylen
和深度为1的树的做法相同, 然后记录叶节点, 对叶节点随机伸长

NOIp10, P3[并查集]
*需要明确并查集能干什么, 并查集可以合并, 但是不能隔开 -> 把分隔操作转化为合并操作
(1) 间接排序(边集数组)
(2) 利用sep[i]记录i的敌人, 对于(u,v)
i) sep[u]存在, 那么merge(v, sep[u]) //u的敌人们是朋友
ii) sep[u]不存在, 那么sep[u] = v//v是u的敌人
v同理, 遇到find(u) == find(v)的情况, 直接输出答案即可
*需要注意特判冲突的情况, 不妨用flag标记, 若没有输出答案, 则输出0

王晓东练习题, 序关系计数[DP]
f(i, j) = (j+1) * (f(i-1, j-1) + f(i-1, j))
f(i-1, j)很好解释, f(i-1, j-1)解释无能
[状态]f[i][j]表示i个数加j个小于号
*Covi给出一个结论, 禁止小于号加在一堆等号内部, 证明无能 -> 在zjy的提示下解决了
*注意到序列中已添加的数的值是不变的
i)f[i-1][j]的话, 已有的数被分成j+1组, 显然每组只能添加1个等号
ii)f[i-1][j-1]的话, 已有的数被分成j组, 因为要添加<号, 所以只有(j-1)+2=j+1个位置可以(即每组的边界)

Contest OPEN11 Silver, llang[并查集]
(1) 读入分别以 奶牛 和 语言 为关键字, 用邻接矩阵存储(这里必须用到vector)
(2) 合并说相同语言的牛, 得到m个集合, m-1即为最少数量
(3) 遍历N个点, 若该节点所在集合未被遍历, 则标记遍历并输出
*vector的用法: 非常适合稀疏图的邻接表的数组实现
(0) 声明变量: vector<int> A;
(1) 加入元素: A[i].push_back(elect);
(2) 获取某列元素个数: A[i].size();
(3) 获取某个具体元素: A[i][j] //0 <= j < A[i].size(), 注意范围

还有一道kruskal和两道tarjan以及dij+heap

11.3

NOIp07真题, 3h, 300
P1: 模拟, AC
P2: 字符串, AC
利用flag表示是否输出(仅标记), 然后Expand函数三重循环即可.
*考虑这种情况1-2-7, 以及A-B

P3: DP, 90(本地压四位后90)
[状态] f[k][i]表示当前行长度为k, 行首编号为i
[方程] f[k][i] = max{f[k-1][i+1] + A[i] * 2^(L-k+1), f[k-1][i] + A[i+k-1] * 2^(L-k+1)}
[初始化] f[1][1..N] = 2^L * A[i]
*变量打混, 务必静态查错
*高精度写挂
(1) 进位
(2) 输出0(去掉前导0的时候, 保证len>0)
*print可以特判len<0输出0
(3) 双目运算符必须const, 这是一个很好的习惯, 避免值发生不必要的改变; 
*返回的bign尽量新建.
*最大测试点, 本地0.9s, RQ0.4s, Tyvj0.0s

P4: Floyd+乱搞, 50minAC(计时赛无分数)
(1) Floyd求任意点最短路, 记录最大值(即直径)
(2) 对d(i, j)=直径的边, 求路径
(3) 对于每个直径, 求出它的所有路径, 然后对每个路径求其他点到此路径的最大值(dist操作, 某点到此路径的最小值)
*点的情况需要特判
*注意区分最大/最小值, 这题考的就是对于抽象模型的理解能力
*有线性时间做法

东方幻想乡Stage2, P3, 60栈崩溃

11.4 & 11.5

叉姐模拟赛, 140/300
P1: 字符串处理, 卡通配符含义, 30
(1) 读入, 可以利用数组+标记字符 或者 vector
    for (int i = 0; i < n; ++ i) {
        begin[i] = sumLen;
        scanf("%s", str + begin[i]); //给出字符串首指针
        len[i] = strlen(str + begin[i]);
        sumLen += len[i];
    }
*str记录字符串, begin记录起始位置, len记录长度
*vector必须手工转换, 不能直接利用scanf读入
(2) 标记*位置(初始化为strlen(p), 注意没有*的情况)
(3) 从起始位置扫描一次, 区间[0, pos)
从终止位置扫描一次, 区间(pos, len-1]

P2: 最大带权生成树, Kruskal变种. 写了一个生成子集, 40
[AC做法]
(1) 判断无解[邻接表 + BFS]
*注意变量名
(2) 边i的权值为w[A[i]] + w[B[i]], 根据度的定义容易得到.
之后套用Kruskal, 降序排序即可.
[40%做法]
(0) 判断无解
(1) 位运算生成子集(N <= 20) -> 亦可DFS生成C(N-1, M)集合
(2) BFS验证连通性
(3) 计算权值
*一开始看错范围, 认为必须用O(N)算法, 然后不考虑排序. 权值最大 -> 度最大, 贪心无能.

P3: 动态规划, AC
利用恒等式\sum{x_i * x_j} = 1/2(\sum{x_i}^2 - \sum{x_i ^ 2})
可以通过观察, 或者数学证明最值只在极值点取到.(60%算法, 直接枚举)
因而要求\sum{x_i * x_j}最小值, 即求\sum{x_i}^2的最小值
\sum{x_i}的最小值, 可以对所有数进行容量为\sum{A_i}/2的0/1背包, \sum{A_i}/2 - 2 * f[\sum{A_i}/2]即为答案.
*gXX给出了利用一次函数的证明方法, (待补)
*对于此类数据类型误导题目, 可以通过数学推导, 或者编程实验证明.
[标程做法] by ftiasch
(1) 讨论极值位置
固定x_1, x_2, ..., x_{n - 1} .  
f(x_n) = (x_1 + x_2 + ... + x_{n - 1}) * x_n + () ...  
这是个关于x_n的一次函数, 所以只有在端点处才会有极值.
x_1 * x_2 + (x_1 + x_2) * x_3 + (x_1 + x_2 + x_3) * x_4 + ...  
(2) DP
dp[i][j]表示前i个数, 在x_1 + x_2 + ... + x_i = j的情况下的答案, 转移就是枚举现在是弄个+a_i还是-a_i。  


NOIp06真题, 3h, 120 >_<
P1: 环状区间DP, 10
(1) 方程
f[i][j]表示合并第i颗珠子的头标记到第j颗珠子的尾标记的最大值
f[i][j] = max(f[i][k] + f[k][j] + A[i]*A[k]*A[j]) (i <= k <= j)
(2) 实现
改写方程
f[l][i]表示从i开始, 合并l颗珠子(指头标记)的最大值
f[l][i] = max(f[k][i] + f[l-k][i+k] + A[i]*A[i+k]*A[i+l]) (1 < k < l)
*注意下标; i的枚举范围是[1, 2n-1], 环状; -> 当成链做只有50
*和一般的区间模型最大的不同, 在于头尾标记, 事实上比较可行的方法是在草稿上按照要求画出珠子, 以检验下标;

P2: 简化版孩子背包 -> 分组背包, AC
*Nettle的某道模拟题和此题的命题思路如出一辙, 都有两种做法, 一种是直接套用更复杂的模型, 另一种是改变现有模型. 要充分挖掘问题性质.

P3: 模拟, 10
(1) 找空挡
从time[opt[k]][count[opt[k]]]开始
验证区间长度
++Time //这里类似字符串匹配
(2) 在空挡标记时间
(3) 更新完成时间, finish[opt[k]][count[opt[k]]] = Time + time[opt[k]][count[opt[k]]] - 1;
(4) 更新最后完成时间
*一定要在草稿纸上写出流程和关键语句

P4: 递推, 没时间, 6h
题目中第二次描述给了很关键的暗示(看了BYVoid的题解豁然开朗, 捶胸顿足中):
[状态] f[i][j]表示i为2^k进制数最高位为j
[方程] f[i][j] = \sum{f[i-1][m]} (j+1 <= m < 2^k)
ans = \sum{f(m, 0)} (3 <= m <= w/k + 1) + \sum{f(w/k + 1, i)} (1 <= i < 2^(w%k)-1)
*可以直接利用记忆化, calc[][]标记是否计算, int70, 高精90
*由于题目的范围很大, 考虑滚动数组(注意每次计算初始化), 递推计算f[][], 累加同时进位, 高精度压位, 大概第10个点1.35s. 去掉了运算符重载, 第10个点0.9s.
*这题属于典型卡常数, 赛场上, 能观察出方程并调出70分即可, 时间充裕可以考虑调试90分.
*注意运算符优先级(10)
*高精度调试技巧
(1) 初始化(初始化位置)
(2) 进位(模拟手算)
(3) const(防止修改不应修改的值)

rqnoj 341[SPFA], 40min
(1) 无向图看成有向图
(2) 漏打循环队列
(3) first[]初始化错位
*草稿纸很重要!!!

11.6

叉姐模拟赛, 210/300
P1: 2个trick, long long, 还有范围
P2: 0/1背包变形
预处理, 以c[i] - v[i]为关键字升序排序
P3: 二分图判定
*无向图, 考虑两条边
*描述歧义, 特判没写, 不说了, 浪费了2h

NOI 2001 食物链[并查集], WA
和之前的做法完全不同, 题目是环状依赖.
*尼玛今天写check.bat都不check..
[题解]http://winterlegend.blog.hexun.com/25409221_d.html

NOIp04 合并果子[小根堆, STL实现]
学习STL中的优先队列:
[声明] priority_queue<int, vector<int>, greater<int> > q;
*小根堆, greater; 大根堆, less;
[弹出队首] q.top(); q.pop();
[加入元素] q.push(k);

ftiasch, 2010114模拟赛
P1: NOIp10第三题, 判定二分图
P2: 找个兔子, 在不超过L的范围断开, 直接验证
P3: 把每个时刻的萝卜加入堆(当前时刻没有, 则添加下一时刻), 维护当前时刻最大值, 累加即可.
P4: 最小生成树 + 背包
对于一条路(i, j), 需要消耗D(i, j)个同类型的萝卜, 因而需要一次0/1背包.

NOIp04 合并果子[小根堆, 手写heap]
堆只维护队首元素最小值, 不对队中其他元素负责.
up() 直接上翻
down() 尽量取2*k+1(目的就是找到最小值), 然后下翻

11.7

Contest MAR11 packdel[dij+heap], 1h
(1) dij+heap元素出队时, 标记已计算(done[k])
(2) 手写可以用cmp函数比较, 注意A[k]与k的区别

叉姐模拟赛,
*手工修正了50%的数据..什么状况

NOIp10, 引水入城[BFS+贪心+分析]
*认真读题, 题目仅考虑最下面一行是否有水, 卡了40min
(1)无解, 30
对第一行进行floodfill即可, 可以BFS实现
(2)有解, M <= 10, 50, 25min
二进制生成子集, 然后利用floodfill填充, 并判定是否满足题意, 维护最小值即可
(3)有解, AC, 2.5h
[重要结论]有解当且仅当, 第一行某个城市流经最后一行城市的结果连续.(若不连续, 必然不满足题意)
因而可以将题目转化为最少线段覆盖问题.
利用邻接表维护当前点的线段(注意退化为点的情况), 贪心过程如下:
1) 从L = 1开始, 对于(L, R), 维护最大的R_Max
2) 更新L = R, R = R_Max+1(左闭右开区间)
3) 重复以上步骤, 直到R > M
*贪心问题, 以及和区间有关的问题不熟悉, 待阅<浅谈信息学中的区间问题>
*要在纸上写出关键条件和大致算法流程以及语句, 不要把时间浪费在调试上

待阅<浅谈信息学中的区间问题>
*阅毕, 涉及到了白书上三类区间问题

11.8

Tyvj1038[RMQ -> ST], 1.5h
ST算法(RMQ问题, 离线算法, O(NlogN)建表, O(1)查询)
[状态] f[i][j]表示从[i, i + 2^j - 1]的最值
[方程] f[i][j] = max{f[i][j-1], f[i + 2^(j-1)][j-1]} (以j为阶段; 1+(1<<j)<=N, 保证实际意义合法)
[查询] 对于区间[i, j], 令k = [log2(j-i+1)], 答案即为max{f[i][k], f[j - (1<<k) + 1][k]}
*不要相信样例的调试性, 写make, 或者打小数据手算

Tyvj1297[ST], 40min
*log_2打错, 不妨自己写函数

Tyvj国庆新赛制模拟赛, Day2P2, game[单调栈+ST], 1.5h
(1) 单调栈, 维护L[i], 表示A[L[i]..i-1] <= A[i]
while(A[L[i] - 1] < A[i])
L[i] = L[L[i] - 1];
(2)ST
*检查方程和查询的写法, 静态调试, 别盲目做
*认真读题

NOIp08, message[双进程DP],50min
[状态]f[k][i][j]表示从(1,1), 两人分别走到(i, k-i), (j, k-j)的最大值
[方程]f[k][i][j] = max{f[k-1][i][j], f[k-1][i-1][j], f[k-1][i][j-1], f[k-1][i-1][j-1]} + A[i][k-i] + A[j][k-j] (i != j)
[答案]max{f[M+N][M-1][M], f[M+N][M][M-1]}
*注意状态的实际意义
*注意不要随便用简化写法, 事实上简化写法是最可能出问题的地方

Tyvj国庆新赛制模拟赛, Day1P3, maze1[双进程DP], 1h
*注意读题, 每个格子可能有不只一个面包圈
方程和上一题一样, 说一下如何记录方案:
利用数组t1[k][i][j], t2[k][i][j]分别表示两个人走的途中可以吃到的最多的面包圈, 答案在其中取最大值即可. 标程把对每个格子面包圈的个数的计算加入了方程中, 从而避免了讨论.
*这两天做陈题发现问题, 由于对于题目残存的印象导致的读题问题非常多.

Tyvj国庆新赛制模拟赛, Day2P1, ship[计算几何], 15min
典型的卡读题的题目, 稳定的定义是, 正多边形的几何重心落在最高的柱子们构成的多边形中(不能在边界).
直接检查下标即可, 连续两最高柱子的下标只差小于(N+1)/2

Tyvj国庆新赛制模拟赛,Day2P3, maze2[二分+BFS]
*学习了白书上的二分查找上下界的方法, 并注意到是左闭右开区间.
-> 按照当时帖子的说法, 标程错误, 修正一处后仍然WA.

11.9

叉姐模拟赛Stage4, 50 + 40 + 0 >_<
P1: 高精度
裸的高精度. 自己写个30%算法跑一下可以发现, f[A][B] = A*B-1(好吧那个奇葩的递推式怎么YY出来的)
*三处写挂: (1)数组范围 (2)len的计算(乘法和加法不同, 要命的是还手工屏蔽了小数据) (3)进位(其实不需要特判)
*一句话总结高精度写法
[加法]更新位值, 累加, 进位, 退位
[乘法]更新位值(不同), 累乘, 进位, 退位
*注意的情况, 进位(比如10)
[背景]其实是有块a * b的巧克力, 你要把他掰成1 * 1的巧克力, 求要掰多少次

P2: 枚举
[关键结论]值最小的聚集点一定在某个点的x上, 某个点的y上(可以考虑证明一维的情况, 然后推广)
*昨晚的讨论不充分, 错误的认为值最小的聚集点一定和某个点重合, 且任意多点在某点聚集等价(事实上仅在两点的时候成立, 今天发现30%程序是错的)
然后枚举每个x,y, 计算每个点和他们的曼哈顿距离, 排序后累加前k个, 维护最小值.
复杂度大概是O(N^2 * NlogN)
*改写程序务必注意循环变量是否打错

P3: DP
*现场的时候NC了, 写了一个DFS, 大概能处理N <= 8的情况
(1) 50%做法
[状态]f[i][j][k]表示取到A[i], B[j], C[k]的最小值
[方程]f[i][j][k] = min{f[i-1][j][k] + A[i]*p, f[i][j-1][k] + B[j]*p, f[i][j][k-1] + C[k]*p} (p = i+j+k)
[初始化]f[0][0][0] = 0;
(2) 100%做法
[状态]f[i][j]表示取到A[i], B[j]的最小值
[方程]f[i][j] = min{f[i-1][j] + A[i]*p, f[i][j-1] + B[j]*p} (p = i+j)
[初始化]f[0][0] = 0;
[记录方案]按照f[i][j] == f[i-1][j] + A[i]*p倒推, 循环即可, 注意边界.
*直接记录t[i][j] = i的话, 需要注意i==j的情况, 这里应该按照方程的实际转移处理, 而这样的情况很多, 所以没必要使用;
*先对序列A,B进行一次DP, 得到A和B合并后的序列D, 然后对C,D进行DP, 即可得到结果
*想不出来的题目可以敲暴力观察, 或者画画图; 暴力程序一定要写, 一方面启发思路, 另一方面验证正确性.

叉姐模拟赛Stage3, 20 + 60 + 0 >_<
*从哪里跌倒要从哪里爬起来...
P1: 模拟, 求外表面积(不考虑内部表面积)
[1] 对每个立方体的边界染色, 然后从六个面逼近
*对于有洞的情况会挂, gXX表示不会, 原因不知.
[2] 正确做法
(1) 对每个立方体的边界染色, 维护最大坐标
(2) 从(0, 0, 0)开始BFS,
i, 已染色的点不标记已读(遇到的Cnt++, 但不入队)
ii, 未染色的点标记已读
*标程范围开小, 已经更新数据

P2: 枚举
考虑仅有三个数的情况:
操作前a, b, c 差分为(b-a, c-b)
操作后a, a+c-b, c差分为(c-b, b-a)
可以发现操作的实质就是交换差分.
不妨设d[i] = A[i+1] - A[i],
那么A[i] = A[1] + \sum{A[j]}(1 <= j < i)
即\sum{A[i]} = N*A[1] + \sum{d[i] * (N-i)}(1 <= i < N)
*注意范围会爆int, 要用long long; 注意下标;

P3: 查找中位数[数据已修正]
(1)60%做法
对每个区间复制一次, 然后qsort
(2)AC做法 by gXX, 实现无能
大意就是想把所有区间的中位数搞出来。其实可以用堆吧?
就是枚举一个左端点, 一个一个往里面加, 然后用两个堆来维护中位数。就是一个最大堆一个最小堆, 然后不断丢来丢去的过程。  
呃。大概就是相当于要维护第k大这样的吧。开一个最小堆, 里面只有k个元素, 而且是最大的k个, 然后其他的丢到最大堆里面。
然后当你k要增大的时候,就把最大堆的堆顶拿过来。要减小的话, 就把最小堆的堆顶丢过去。
就是这个意思, 此消彼长, 道法自然。

11.10

NOIp09 靶形数独[DFS+剪枝]
*手工指定搜索顺序, 1.5h调试无能
*题目中不考虑对角线, 手工顺序无效!!!
利用frist[][], second[][], grid[][]分别表示每个行/列/小九宫格的填数情况, countX[], countY[]统计一开始行列的填充情况.
(1) BFS生成score[][]
(2) 读入数独, 统计countX[], conutY[], 记录填充情况
(3) 对countX[], countY[]进行降序间接排序
(4) DFS, 状态DFS(x, y, sum)
1) x == N+1, 统计答案
2) y == N+1, 换行
3) (x, y)已填充, 更新sum
4) 枚举A[mapX[x]][mapY[y]], 所有涉及值的地方按照map_[]顺序
*[动机]不必要的枚举量, 优化搜索顺序
*90%的测试点在1s内, 1h内可以调试完

NOIp04 虫食算[DFS+剪枝], N h
*注意读题, 是N进制加法, 每个字母代表的数字不同
(1) 70分做法
DFS枚举序列1..N代表的数字, 利用used[]判断当前数字是否使用过
[剪枝]对于竖式上同一列的三个数a,b,c, 显然满足c - (a+b) < 2
*注意各种回溯细节
(2) 80分做法
对每一位进行枚举, 判重和可行性剪枝
*回溯只需一解的情况下, 要注意恢复修改值的时间
*进位要用delta记录, 可能出现多次进位的情况
*else和if的匹配错误, 注意花括号!!!!!!!!
*70分做法的剪枝用了没效果, 网上还有一个剪枝, 同一列三数知二的情况下, 看剩下那个数的两种情况能否使用, 可能可以AC

东方幻想乡Stage1P4[强连通分量, kosaraju实现], 40min
(1) 正向对每个点进行DFS, 搜索完该点后加盖时间戳
(2) 边反向, 按照时间戳逆序DFS, 标记根节点
*NOIp09第三题用了类似的边反向的做法

WZOIStage2 P2[SPFA], 20min
范围很大, 题解给出的AC做法是DAG的DP,事实上SPFA可以AC.

11.12

敲Day1P2三种版本, 实测ST+邻接表, N <= 30000; 裸的做法, N <= 15000

posted @ 2011-11-14 19:14 Climber.pI 阅读(386) | 评论 (0)编辑 收藏

Problem List (10.1 ~ 10.27)

10.1

tyvj迎国庆新赛制模拟赛, 140min, 预计260

excel[模拟], 50min, 预计AC
直接模拟, 需要用康托展开. 可以打表判断位数(利用等比数列求和).
*注意考虑R C的顺序

stock[判断有向图连通性], 30min, 预计60/100, O(N^2*T)
给出N个点, T条边, 判断至多添加多少条边图仍是DAG.
对于每条边(u,v), 利用DFS染色+邻接表判断(v,u)是否可达.

maze1[双进程DP+输出方案], 60min, 预计AC, O(N^3)
[状态] f[x1][y1][x2][y2]表示从(1,1)两人走到(x1,y2)和(x2,y2)可以得到的最多的面包圈.
       t[x1][y1][x2][y2]表示从(1,1)走到(x1, y1)某人可以得到的最多的面包圈(题目要求最小字典序)
  G[x_][y_]表示(x_,y_)是否有面包圈
*注意到(x1,y1)和(x2,y2)地位平等, 故只考虑其中一个即可.
f[x1][y1][x2][y2] = max{f[x1-1][y1][x2-1][y2], f[x1-1][y2][x2][y2-1], f[x1][y1-1][x2-1][y2], f[x1][y1-1][x2][y2-1]} + G[x1][y1] + G[x2][y2]
t[x1][y1][x2][y2] = max{t[x1-1][y1][x2-1][y2], t[x1-1][y2][x2][y2-1], t[x1][y1-1][x2-1][y2], t[x1][y1-1][x2][y2-1]} + G[x1][y1]

NOIp09 Hankson的趣味题[数论], 1.5h, O(50000N), AC
注意到最大公约数最小公倍数的性质就是
a = p1^a1*p2^a2…pn^an
a = p1^b1*p2^b2…pn^bn
gcd(a,b) = p1^min(a1,b1)*p2^min(a2,b2)…pn^min(an,bn)
lcm(a,b) = p1^max(a1,b1)*p2^max(a2,b2)…pn^max(an,bn)
这里去年就想到了, 然后去年实现无能. 下面对每个因子p进行讨论
(1)对于min{p_x, p_a0} = p_a1
  i)若p_a0 = p_a1, 那么p_x ∈ [p_a1, ∞)
 ii)若p_a0 > p_a1, 那么p_x = p_a1
(2)对于max{p_x, p_b0} = p_b1
  i)若p_b0 = p_b1, 那么p_x ∈ [0, p_b1]
 ii)若p_b0 < p_b1, 那么p_x = p_b1
利用筛法构造小于√(2e9)的素数表, 对a0, a1, b0, b1分解质因数, 然后分别讨论四种情况即可(乘法原理).
*需要注意存在大于√(2e9)的素因子的情况, 利用b0[0]和b1[0]记录即可, 需要注意b1|b0, ans*=2
*利用factor函数分解质因数时, 传递数组指针, 此时不能在函数内对数组赋初值, 原因不知.
-> size (int *) = 4, 即一个内存地址的大小, sizeof(char*) = 4. 因而只能利用循环赋值. by gXX
[另解]把b1分解质因数, 然后用质因数枚举b1的所有约数, 然后挨个求与a0的最大公约数和与b0的最小公倍数.

10.2

tyvj迎国庆新赛制模拟赛, 160min, 预计150 -> 60/110
60min时读题结束(大概开场25min才开始看题)

ship[杂题], 84min, 预计?
[题意]给定一个正n边形, 在每个顶点上放高度不同的柱子, 使得高度最高的柱子构成的多边形的重心落在多边形内.
1. 所有柱子同高显然符合条件
2. 高度最高的柱子构成正多边形同样符合条件, 即重心和正n边形重合
3. 重心不和正n边形重合且不在边界上, 判断无能
*需要注意的是2和3, 在看了coderspace的答疑之后才想到.

game[模拟_60/], 160min, 预计?
"他就要从自己从左边记下的数字和从右边记下的数字中分别选取一个数, 将大的减去小的并大声喊出来."
->O(N^2), 60
对于每个小朋友, 向左向右记录符合条件的最值. 如果两边同时记录了最值, 那么输出max{MaxL-MinR, MaxR-MinL}. 否则输出-1.
*这题读错很多次, 一开始的想法并不正确, 之后有认为是最长不下降子序列, 并复习了O(NlogN)做法. 但事实上符合条件的序列不是单调的. 需要在纸上抽象出条件.

maze2[二分+floodfill/], 120min, 预计AC
[题意]从(1,1)到(n,m)存在一条路, 使得途中的曼哈顿距离k最大.
对于每个k, 第一次floodfill表示c个面包圈附近所有曼哈顿距离d<=k的点. 然后从(1,1)进行第二次floodfill, 已标记的点不能通过, 若可以到的(m,n)则满足题意.
*需要注意可以从上下左右任意方向走, 只通过右下方向会忽略很多情况.(by coderspace)
*这题是gXX出的, gXX表示标准做法不是二分

tyvj迎国庆新赛制模拟赛[170/600] -> 各种问题亟待解决

10.17
[BYVoid Stage1] 3h + 2.5h, 位置值25%
写了2h, 前两题预计AC, 第三题满分算法需要递推式, 70%算法看不出来; 第四题类似OPEN11的第一题, 各种心理阴影. 第二题花了20min练习对拍.
[summary], 130 = 10 + 100 + 10 + 10;

P1: BFS染色看成DFS染色, 需要注意更新条件(G[kx][ky] > G[x][y]+1), 否则会超时 -> 涉及最短路径的问题显然是BFS, DFS会造成各种奇葩的问题
*事实上还是脑抽了, 标准做法O(MN), 将所有传染源加入队列, 直接BFS即可.

P2: 分组背包问题, 差点看成泛化物品. 数据很弱, 用来对拍的暴搜同样AC.
*O(ABN), 和标准做法一样, 而且利用了0/1背包的性质直接降维, 减少内存使用.

P3: 看了题解, 收获很多.
(1)从数学角度考虑, 70
不妨考虑题目的退化情况, 即不存在栈元素数量p的限制. 注意到1号元素比较特殊, 初始时1号元素必须先行进入b栈, 然后进入c栈. 故而可以划分为两个过程, 过程I在a元素进入c栈之前, 过程II在a元素进入c栈之后. 利用乘法原理f[n] = Σf[k]*f[n-k-1](0<=k<i). 当然这东西其实就是Catalan数.
*白书上给出了另一种推导方式, 利用凸多边形上的分割. 固定一三角形V1VkVn, 讨论其两侧的多边形的情况, 故而f[n] = Σf[k][n-k+1](k>=2), f[2]=f[3]=1. 也可以通过固定对角线的方式讨论, 注意到每条对角线被重复计算了2n-6次(凸n边形仅有n-3条对角线), f[n] = Σf[k]*f[n-k+2]*n/(2n-6). 与上式联立可知, f[n+1] = f[n]*(4n-6)/n.
*这里的推导方法和第二类stirling数的推导方式类似, 考虑一个特殊元素的动作, 然后划分问题(利用乘法原理).
加上栈元素数量的限制, f(i,j)表示i个元素在栈元素限制为j时的方法数, 可得f[n][p] = Σf[k][p-1]*f[n-k-1][p](0<=k<n), f[i][0] = 0(0<i<=n), f[0][j] = 1(0<=j<=n)
(2)从动态规划角度考虑, AC
考虑到题目中存在三个栈a\b\c, 设置状态为f(i,j,k)表示a栈中有i个元素, b栈中有j个元素, c栈中有k个元素的方法数, 注意到i+j+k=n, 故只用f(i,j)即可.
若a栈中有i个元素, b栈中有j个元素, 可能是a栈中的1个元素到b栈中, 亦可能是b栈中一个元素到c栈中, 故而方程为f[i][j] = f[i+1][j-1] + f[i][j+1], f[n][0] = 1, f(0,0)为所求. 这个方程应该同样适用于无栈元素限制的情况(即没有特别的限制).
*数学上的递推式的思考方式, 往往是固定或者讨论1个元素, 进而划分问题或者类似情况. 而DP的思考方式, 建立在状态的基础上, 注重状态间的转移, 进而找到方程.
*一个小技巧, a mod 2^p = a & (2^p-1); 直观上其实很容易理解, 转化为2进制看待, 取模即得到a二进制下得后p位, 和位运算与的目的是一样的.

P4: 需要抽象出最短路模型, SPFA即可.(注意此时的点数不超过p*p, 而不是p)
注意到题目中同种能量结界可以无损耗传送, 不妨将每个能量结界缩为一点, 于是可以得到一个新的图. 为了简化计算, 在第一行前增加起点, 在最后一行后增加终点. 求出从起点到终点的最小点权覆盖即为答案. 然后题解中给出了一种很神奇的构造, 将起点和终点外的点形成的边拆成两个边, 边权为边终点的点权, 起点和终点仅考虑单向. 利用邻接表实现, 可以利用一个bool型数组判重. 之后利用SPFA求最短路, h-d[p+1]即为答案, 小于0输出NO.
*关键在于1) 以能量结界为点抽象出图, 转化为最小点权覆盖.
2) 拆边赋权, 转化为最短路模型.

10.18

USACO Contest OPEN11 cornmaze(BFS), 2h
略复杂的BFS, 写了约30min, 调了1.5h. 主要卡在两个错误和STL的语法上.
按照题意, 从起点开始, 如果遇到装置直接跳, 遇到草地继续走, 遇到玉米就终止, 直接BFS即可. 注意到题目中的装置成对出现, 而且遇到装置必须走, 这和昨天的第四题不同. 可以利用map数组记录装置的对应关系.
*对于一对装置, 从A到B, 只需标记A已读, 无需标记B已读, 可能出现跳过来又跳回去更短的情况. 但是要使B入队, 并且更新B的距离, 而不是更新A的距离.
*利用x*n+y对坐标编码的时候, 充要条件是n>=m, 否则解码会出现错误. 因而可以利用x*(n*m)+y进行编码, 在不溢出int的情况下. 当时在白书上见到这种写法, n=m, 并且坐标从0开始.

10.19

Tyvj新赛制模拟赛 stock, unAC.

10.20

stock[传递闭包]
题意就是确保每条需要添加的边(x,y), (y,x)不连通, 且x!=y(即点上没有自环).
和wx神牛给出的做法一样, 维护一个N*N的矩阵表示连通性, 若加入边(x,y), 则更新x的前驱和与y的后继的集合(x,y分别在集合中)的边为连通.
*复习了对拍的写法, 昨天查错查了1h, 写了O(N^2*T)的写法:
 (1)更改了已连通点的情况
 (2)没有考虑x的前驱和y的后继直接连通的情况
 (3)没有考虑点的自环(make中人为避免了这种情况, 审题不清.)
*参照题解写O(NT), 更新连通情况时G[A[i]][B[j]]打成G[A[i]][B[i]], 对拍后发现.
*当时的DFS写法的问题, 修正后50:
 (1)没有考虑重边的情况, 因而对于每一条边都要重新加入, 数组必然会爆. 可以利用矩阵维护已添边, 这样的话复杂度应该为O(N^2*P).
 (2)next[]数组范围开小

[BYVoid Stage2] 1.5h, 完全不会. -> 眼高手低
以下是对于题意的简单判断, 看起来和去年差不多, 眼高手低:
P1: 模拟, 但是概率无能
P2: DP, 没想出方程
P3: DP + 多重背包?
P4: 极大强连通分量, Tarjan忘了, 裸的做法不会(注意到范围很小)
-> 题解显示方向判断基本正确, 基本思路都正确, 但是实现都卡在某些地方

P1:分为两个部分, 求概率和期望, 有1个trick.
对于概率可以分四个部分讨论:
 (1) 无事故 -> 按照题意, 乘以无事故概率分别计算即可
 (2) 同时事故 -> 平局, 把四个独立事件(故障)乘起来
 (3) 侏儒事故 -> 地精胜利, 地精无事故*侏儒事故概率  ->需要注意这里不需要考虑无事故获胜概率, 仔细读题
 (4) 地精事故 -> 侏儒胜利, 类似上文
*需要注意利用pow(sum,1/n)开n次方的时候, 必须边读入边计算, N = 1e6. 可以利用e^((1/n)*ln(a)) = a^(1/n)来计算.
*没有在分类基础上结合题意继续讨论, 导致理解偏差, 于是没想出来.

P2:我想的方程的状态是f(i,j)表示疲劳度为i, 行走距离为j, f(i,j)表示所需最小时间.
所以方程 f(i,j) = min{f(i-1, j+1), f(i+2, j+5), f(i+5, j+10)} + 1 (i ≠ p)
 f(p-10, j+10) + 10 (i = p)
以距离为阶段, 没有后效性, 看起来如果记忆化, f(0,0)是答案. 但min给初始化造成了一定的麻烦; 更重要的是, 这样的方程使用滚动数组较为麻烦, 会爆内存.
*事实上i == p的情况不会得到最优结果, 即干扰条件. 要避免疲劳度达到上限.
改进做法是这样, f(i,j)表示行走最大距离, i表示花费时间, j表示疲劳度, 可以得到方程:
f(i, j) = max{f(i-1, j+1)+1, f(i-1, j-2)+5, f(i-1, j-5)+10}
需要利用滚动数组降维, 即for(i = 1, k = 1; i <= S; i++, k = !k)
*需要指出方程不太严谨, 考虑S=1, P=1, 条件1的1+1>P, 所以需要特殊处理.
*太久没写DP了, 所以方程细节问题很多.

10.22
东方幻想乡Stage1, 2.5h, 215 -> 310, 位置值65%
*发现solution一个很好的用途, 比较命题人给出的题意, 锻炼从题目中抽取信息的能力.

P1: 模拟+分析, 20min, AC
(1) 计算整个序列的位移向量a
(2) T/len * a, T%len模拟
*个人觉得亦可正交分解, 统计不同方向向量个数(N S对称, W E对称), 做法同上.

P2: 二分高精除法, 1h, TLE原因不知
*[没有注意到范围] O(LlogANS), 题目中给的ANS<=2*1e9, 而我算的ANS是1e20000. 本来是20000*9, 范围错误后, 20000*20000, 显然TLE.
*按位除效率高于二分高精除 by qz神牛
*其实直接写单精度乘法即可
*题解中二分条件, left+1<right;left = mid;right = mid;
*INT_MAX的另一种写法, ~0U>>1, U表示无符号整数 by WJMZBMR

P3: DP+优化(单调队列\优先队列), 60
f[i]表示在i取得的最大冰冻指数值
f[i] = max{f[i-j] + A[i]}(L<=j<=R, 0<=i<=n+R)
利用prev[i]记录f[i]由f[i-j]推得, 递归即可记录方案.
*2个trick, 存在负数(初始化-INF), 可以越过终点(前驱必须在终点前) -> 注意数组大小为f[N+R], 否则溢出

P4: 强连通分量(Floyd传递闭包+并查集), 50
利用Floyd传递闭包, 对于每一点对(u,v), 若是双向连通则使用并查集合并集合{u},{v}. 统计元素数最多Max的集合, 从头开始扫面每个节点所属集合, 遇到所属集合元素数量为Max的点直接跳出. 扫描该集合即可输出方案.

10.23

toj 1169 广告印刷[单调队列]
NOI导刊(11.5)例题, 使得队列中元素大小和下标同时单调. TLE, 原因未知.

[东方幻想乡S1P2]iceroad, DP+单调队列, AC
维护区间[i-R, i-L]的最大值, 先检查队列中元素下标的合法性(即满足q[head]>=i-R), 然后插入元素f[i-L].
*越过终点的情况必须初始化A[], 否则会造成答案错误.
*按照std, 必须初始化为0, 否则最后两个点WA. -> 数组溢出, 必须初始化为-INF, 数据弱, wagner的std会挂
*对于大数据挂掉的情况, 很可能是由于数组溢出

[东方幻想乡S1P3]classroom, Floyd+并查集, 60
(1) 一个错误,如果存在边(v,u)会被删除.
G[v][u] = (type == 2) ? 1 : 0; -> 考虑之前存在边(u, v)
*缩略形式很可能是不等价的, 要考虑全面
(2) 记录集合元素个数的写法
path[y] = path[x];
tot[x] += tot[y];
可以这么解释, find(y)会指向x, 于是更新x的元素个数.
*想起了Tyvj9月月赛第二题

10.24
东方幻想乡Stage2, 2.5h, 200, 位置值82%
P1: 简化版最大子矩阵, AC.
给出了矩阵大小(R,C), 令s[i][j]表示Σs[1..i][1..j], 只需枚举[R,N, C,M]作为矩阵顶点计算大小即可.
s[i][j] = s[i][j-1] + s[i-1][j] - s[i-1][j-1] + A[i][j]
矩阵大小S = s[i][j] - s[i][j-C] - s[i-R][j] + s[i-R][j-C]

P2: 进制转换+同余, AC.
(1) 得到1..L位分别对于M取余的余数pow[i]
(2) O(L), 判断当前数是否整除
余数rem = Σs[L-i-1]*(A[i]-'A'), 利用传递性取余.
(3) O(L^2), 枚举任意两个数对(i,j), 交换后计算余数, 若整除直接输出结果
题目要求字典序最小, 指字符串[1..L], 需要注意下标 -> 这里浪费了20min, 多次手工模拟错误
交换的写法:
rem += M - ((s[i]-'A') * pow[L-i-1]) % M;//利用补数, 分别减去i,j原来的位值
rem += ((s[j]-'A') * pow[L-i-1]) % M //加上i,j新的位值
*Win7一个奇葩的性质, patchouli因为有关键词patch, 会默认以管理员身份运行, 于是调试无能.

P3: 似乎是计算几何, 只想到了旋转坐标系. -> 预处理[排序]+DP
(1) 利用点斜式得到结论 d = y - kx, 以d为关键字对点进行排序
(2) f[i]表示1..i点可以取到的最大值
f[i] = max{f[j] + Σvalue[i]*Σmul[i]/(j-i) (这里Σ的范围是[j-i+1, i])} (0<j<i)
*对于α=90°的情况, 由于π的精度不够, 可以不讨论. -> 对x排序即可, 实现的话可以直接交换坐标
*对于多点d相同的情况, 按solution写法应该讨论, 但是参照标程特判会WA, 原因未知?

P4: 图论题, 有条件的最短路问题.
*分层图最短路


10.27

东方幻想乡Stage3, 2.5h, 110, 位置值64%
*心不在焉, 多次看错题.
*需要思考看完整套题的意义, 目的是什么, 需要得到什么样的信息.

P1: 二分+模拟, 95
(1) 记录被破坏点下一个被破坏点的位置next[]
(2) 以0为下界, [N/K]+1为上界, 二分答案L -> L=0即未被地震破坏, 考虑不周
(3) 利用next[]对数轴染色, 限制次数为K, 若染色后仍发现破坏点则无解

P2: 概率, 15, O(NT) -> 正解是DP
每个时刻更新每个点的概率, 利用邻接表(矩阵实现). 不更新的充要条件是vis[v][u][k-1]=1.
用P[i][k]表示第i个点在第k时刻的概率, 初始化P[1][0] = 100.
*思路非常混乱, 一开始不更新的充要条件找错. 错误原因不知.
*不明白O(NT)的做法为什么会错, 标程用类似树形DP.

P3: 最小生成树+并查集维护连通性+枚举 -> 不用并查集
利用Kruskal构造最小生成树, 并查集记录连通情况, 利用邻接矩阵维护, 枚举每个度大于2的点不断按照定义更新答案.
*考虑到多边权重相等的情况, 可能需要多次计算.

P4: LCS? -> 搜索+剪枝

posted @ 2011-11-05 14:05 Climber.pI 阅读(200) | 评论 (0)编辑 收藏

NOI Linux+VMware 安装手记

之前用Sun Virtual Box装了新的NOI Linux,Ubuntu的版本新了好多,界面感觉不错。感觉阉割了非常多的东西,比如OpenOffice,昨天下的rpm安装无能。把涉及的几个问题整理一下,如下:
(1)如何让Ubuntu和Win7共享文件
VBox下没解决这个问题,之前用sudo居然不知道密码不会显示。于是转战VMware,然后网速不太给力,下了一个下午。晚上基本弄好。主要是权限问题,必须在terminal下运行VMtools才可以。
【基本参考这里】http://blog.sina.com.cn/s/blog_726684020100r1os.html
【以下转载】

step1.安装vmtools for linux:

选择VM >Reinstall VMware tools...

之后虚拟机中ubuntu桌面出现VMware Tools的光盘符号

在ubuntu里输入以下命令(使用root帐号)

mkdir  /mnt/cdrom
mount /dev/cdrom /mnt/cdrom

cd /mnt/cdrom

tar -zxvf VMwareTools-8.1.3-203739.tar.gz -C /tmp

cd /tmp/vmware-tools-distrib
./vmware-install.pl

然后一路回车,要等一段时间才能安装完毕。

查看安装后情况,使用以下命令:
lsmod

step2.设置共享目录: 选择VM>Settings>Options>Shared Folders

step3.在ubuntu中查看共享目录 
输入以下命令
cd /mnt/hgfs
ls
可以看到win7系统中共享的目录。


(2)如何打开MSOffice文件

可以去下载永中Office解压后,在terminal下载安装,进入目录后运行./setup,可以看到图形界面。注意主程序是精简版的,其他四个部分需要分别安装。

这里的版本是2010。永中Office对于图文并排的Word文档支持不佳。


(3)如何打开*.rar且显示中文

不要rar,在新立得中安装unrar unrar-free

*因为rar和7z是Win下的格式,因而需要手工处理。zip完全不存在这样的问题。

(4)Tex的安装
http://twntwn.info/blog/ajer001/archives/1728

這陣子開始玩 LaTeX,果真是一個可怕的東西。現在正在努力的撈,紀錄一下安裝、CJK 環境等等。

1. 安裝:

sudo apt-get install texlive dvipdfmx cjk-latex

這樣就可以了。如果還需要 IDE 介面:

sudo apt-get install texmaker

两个东西很大,400+M,要下一阵子。

1. 直接使用locale-gen
在终端输入命令:
sudo locale-gen zh_CN.GB18030
即可完成中文字符集的添加。完成后可以转到

/usr/lib/locale/,下面已经有一个zh_CN.gb18030文件夹;在超级终端输入命令:

gedit /var/lib/locales/supported.d/local,可以发现文件中多了一行:zh_CN.GB18030 GB18030。说明添加成功。



(5)让Texmaker支持中文
http://hi.baidu.com/huaerzaikai/blog/item/8cc478b5c227b1c237d3cabd.html

(6)一句话总结
不要用VMware Player的自动安装功能。
linux的命令行无比强大。

posted @ 2011-10-30 12:00 Climber.pI 阅读(2345) | 评论 (0)编辑 收藏

初赛散记

回家的一天多, 状态很颓, "勤能补拙是良训, 一分辛苦一分才", 我还是太懒了.
试室里熟人很多, 见了好多人, 和夏侯同桌. 题目很水, 于是被坑了, 相较于最近五年的真题, 完善程序的难度再创新低, 问题解决也水的可以, 于是分数下水涨船高, 加之名额减少. 形势急矣.
几乎是考出经验了, 所有准备非常充分的笔试, 大都会出现一些不由自主的看错, 解决的方式不外乎多看几遍. NOIp初赛的区分度主要来自完善和问题解决, 但是这两部分今年都成了水题, 阅读分值大, 丢不起.
反正肯定过了, 怨天尤人毫无意义.

可以反映出一些训练中存在的问题:
1. 如何查错 -> 反复
2. 写的大多是写过的陈题, 很少写新题
3. 太依赖第一印象 -> 批判性思维

这次初赛全卷初步写完还有几乎1h的时间, 但是接下来的1h却没有得到任何分数, 虽然查到了10分左右的错误但是并未改对. 越是简单题越要反复读题, 做的慢反而不会出问题. 如果定义一个概念叫做有效时间的话. 去年初赛的有效时间就是开场的几十分钟和最后的几十分钟, 今年初赛的有效时间就是第一小时, 去年复赛的有效时间只有1h, 前年复赛的有效时间是1.5h. 如何让剩下的时间变成有效时间, 亟待解决.
仔细想想, 我习惯开场先通读题目做出大致判断, 但是没有考虑第一反应错了会怎么办, 也就是说对大方向的质疑很少. 昨天第三题和第四题很可能都是由于第一印象导致分析出现偏差, 尤其是第四题, 开场认为大方向是图论, 于是孤立看待矩阵中的每个点, 认为第四题的矩阵是类似邻接表的东西, 一直朝这个方向想. 只要和题意南辕北辙, 剩下的就是浪费时间. 最后五分钟想到了正确思路, 枚举k=1,2,3..的答案, 然后找递推式, 这是正确思路之一. 亦可以直接观察. 于是知道的越多反而更容易理解错, 除非很熟练, 自行车理论进一步得到证实啊.

对于复赛也是一样的问题, 新赛制模拟赛暴露的主要问题也是写完程序后, 无法确定正确性. 我需要的不是计划, 而是切实可行的步骤. 初赛和复赛没什么关系, 历史已经证明了这点. 我需要coding, 每周30h, 充实的时候往往没有太多记忆, 记忆源于彷徨和不安. 
可以考虑每天写计划, 然后写总结, 时间不在多.
---------------------------------------------------------------------------
对于分数线的估计, 提高全场最高wx93, 普及最高87.5, 提高60+ 20余人, 普及60+ 15人. 按照往年形势估计, 分数线可能在60左右, 如果省里认为区分度有问题的话不排除降分的可能. lsm还是有可能过线的. 接了fsm的电话以后感觉好多了. 晚上和qj以及gXX神牛聊了一下天, 问了一些备考的问题和别的事情. 没有时间颓废, 即使是金中这样的学校, 仍然有和大部分人方向不一致, 何况高级. 零散的时间可以用来写水题和思考算法, 大块时间不能浪费, 还是要用来写模拟赛. 边缘内容很多, 比如线段树, 比如费用流.

于是这周空白的作业怎么办?

posted @ 2011-10-15 20:50 Climber.pI 阅读(236) | 评论 (0)编辑 收藏

仅列出标题
共8页: 1 2 3 4 5 6 7 8