训练日记 2.10 - 4.7
2013-11-13 20:02
316 查看
训练日记 2.10 - 4.7
于泰州10日
JSOI冬令营结束了,成绩排在全省第12.加上一些参加全国冬令营没有来的神牛(14个),大约是第26名.
这次冬令营,前几天的训练发挥的不是很好,但是后2天的考试倒不错.扬中的王思宇前几天不错,但是最后一天发挥失常.
由于将下雪,本定于11日结束提前到10日下午.
/*
这次冬令营收获很大,主要有以下几点:
1.认识到了心态的重要性,要以平和的心态面对考试
2.学习了骗分技巧,主要是随机化算法,模拟退火等
3.学会了对拍,这是个比较保险的方法,但不知道王老师为什么说它非常不保险...
4.认识了余翔神牛,与我同一届.水平很高,要向他学习,做<算法艺术>上的题目,相信水平会有所提升.
*/
还麻烦姑妈来接我,其实到奶奶家坐22路车就行了...
当天看了SPOJ 26 33 两道题,一题是求最长公共子序列,还要输出解的所有不同方案,至今没有解决.另一题求凸包,要求逆时针输出,定点最少.其实只要把结果中三点一线的情况处理即可.
11日
这天主要是写作业.由于在姑妈家,效率很高.
12日
还是写作业.下午父亲回来了,一起去洗了把澡.
13日
白天写作业,晚上看了一会儿春晚,好像没什么意思.还参加了COCI(克罗地亚信息学奥赛).前三题都是水题,第三题稍有难度,需要分解质因数.
后三题难度就大了,只做了最后一题,仅得13分,杯具了.
/*
这几天有不少体会:
1.学习效率比较高,作业正确率高.写的英语中考真题基本上能保证扣分在2分左右(除去听力,作文).
2.作息比较有规律,继续保持.
*/
14日
早上写作业,中午去奶奶家拜年.下午睡了1.5h,晚上继续去奶奶家吃饭.22:45时写下了以上几天的日记.
今天整理了一些OI真题和测试数据COCI,CNOI.
于扬州
15日
上午写作业,中午去奶奶家吃饭.下午坐车回扬州.晚上看了<孔子>,还不错.
16日
上午写了2份语文中考卷,下午去了外婆家,写了一份语文中考卷.
晚上看了CCTV10的Evolve,不错,讲了生物的进化.
做了POJ 1062 昂贵的聘礼,用Dijkstra,对题意没能理解,出题的人不厚道,样例不能反映问题.
下了用GDB调试的决心.
中午想研究SAP的递归写法,但是没坚持下去.
前几天效率都比较高,今天时间利用率比较低,有待提高.
/*
作文,背诵要抓紧了.
*/
24号就开学了,还有短短的一周,要好好利用.
24日
写了POJ3368,用了ST算法,细节很多,CE n次,POJ不支持log2...囧
26日
今天做了JSOI2008的maxnumber,看到了一个非常巧妙的方法.
这个题目有3种方法
1.线段树,典型的RMQ,考场上最合适了.不用动脑筋
2.单调队列+二分,有点意思,但二分的细节比较多.
3.单调队列+类并查集,用并查集,将一块连续的值合并,可以用路径压缩优化,效果不错.
*4.ST算法,wsy想到的.要稍微修改,保存的区间向前
虽然方法3十分巧妙,但是不是很容易想到的.
竞赛时不如就用RMQ,省去了思维的时间,而且不超时.
27日
今天想做HNOI2008的玩具装箱,写个O(n lg n)的二分算法,但是自己对拍总是不对.....囧啊
下午终于AC了,一开始查找出栈元素时可以不二分,参考了oimaster poet的代码,终于过了...
但是二分细节有待研究.
晚上做了NOI2009诗人小G,AC的不明不白,有几个细节不清楚...
3月3日
这几天基本上早上起得比较早,5:30左右.
今天做了一题"星球大战",很郁闷,由于我提交代码前改了一个细节,没有测样例,结果WA了...
而且我的邻接表缓冲池没有乘以2,又RE一次...
这几天做题严重没感觉...今天做了一下"反质数",就是要求一定范围内约数最多而且同时最小的数.
经常打错变量名...
3月4日
今天做了USACO土地购买,还是很囧的.
首先这是一道DP+凸单调优化的题目,我用的是O(n lg n)的算法.
这题的排序很重要,其次是一个单调栈的处理,要保证处理过后长度递增而宽度递减.
我在这里没有处理好,因为我每次之考虑排序后相邻的元素之间的判断,
比如(1, 4)(2, 3)(2, 5)这种数据就不能把第一个元素删除.
正确的方法是用单调栈解决.
今天DP部分写得较好,没有出错.主要是预处理比较囧.
3月5日
今天做了BOI2007的Sound,要求的是一个序列中所有长度为m且子段最值差不超过c的开始位置.
由于长度n可以达到1000000,只有O(n)的算法才符合要求.
这个问题恰好满足一个经典模型:
/*
特殊的RMQ:
给定序列和所有区间,离线求最值.
区间满足一个很重要的性质:
任意 1 <= i < j <= n,都有l[i] <= l[j], r[i] <= r[j].
也就是说所有区间的起点是单调非降的,终点也是.
*/
这个模型可以用DP+单调队列优化在O(n)时间内解决.
遗憾的是,我做这题的时候,最后忘记了无解则输出NONE,WA了一次...
今天还在试管里搞了点硫酸铜晶体,蓝色针状,就像水晶洞,很漂亮.
要点是蓝矾要适量,多了就太密,不便于观察,少了不会结晶.
用酒精灯加热到沸腾,不用搅拌蓝矾就会溶解,然后用用冷水降温,就可以结晶了.
3月6日
今天首次电解了水.使用的是某个直流电源,9V.后来氯化钠加多了,结果电解出来了氢气,氯气.
电解水的时候只有氢气,没有氧气.估计是电极问题.
3月9日
这几天学校又开始...作业堆积了...
今天学习了求强联通分量的tarjan算法,效果不错.
做了[HAOI2007]受欢迎的牛,就是求联通分量的树根的原有节点数目.
这类题的显著特征是关系的传递性,可以通过缩点解决.
今天的一大"突破"是把DP的凸包优化看懂了,还得感谢oimaster的帮助.
明天把几条经典的DP写一下!
10:30结束记录,写作业了.
3月10日
今天写了"土地购买"的线性算法,用的是凸包优化,比较成功.
但是一开时用单调队列除去无用元素时出问题了:
//bug while (len > 0 && d[i].y > d[len].y)
while (len > 0 && d[i].y >= d[len].y)
这就导致了后面可能有被0除的运算,因此WA了一次,以后要注意.
由于凸包在第一象限,直接用斜率就可以维护,不用叉积.
3月11日
今天写了"[HNOI2008]玩具装箱",数学推导上出了问题,重新推了一次就对了.
解决这题有一些技巧:
1.数学变换时尽量让凸包在第一象限,直线斜率不要为inf
2.数学推导时使用换元法
总之O(n)效果还是不错的.
至此,我用了半个月的时间理解了1D/1D动态规划的优化,包括四边形不等式,凸包优化等.
对于二分查找,单调队列的理解加深了.
下面将研究图论,有以下目标:
1.费用流 OK
2.强联通分量
3.高效最大流 OK
4.KMP算法 !!
5.高斯消元 OK
6.矩阵乘法 !!
7.二分图 OK
8.Tarjan !!
9.上下界网络流 !!
3月18日
这几天作业实在太多,没办法.
主要研究了一下胡伯涛的<最小割>,写得很详细,ORZ
今天做了一题"方格取数",求二分图最大权独立集,用的是SAP,大概45min解决,1A.
这几天在学校过的还是比较顺的,下面就是把一模考试搞好.
4.12就省选了,只有16个名额,冬令营10个神牛没来我都12了,估计危险.
但是通过一段时间的努力还是有希望的,尽力吧.
最囧的是分数规划,好像比较难理解.
中考只剩几十天了,考扬中问题不大,关键是要能进地招班.
初三前两次考试一次39,一次27,都在地招班分数线以上,
如果中考能这样发挥,应该是理想的.
但是后面一次由于心态问题发挥严重失常,排到192了,杯具.
希望一模能考好一点.
3月20日
今天晚上重新做了NOI2007最大获利,写的是SAP,大概15min AC,但是发现了一个地方:
/*-------------------------------------------------------------
在SAP算法中,应该在每次找到可行路径后,跟新当前弧,不然会超时.
pre[d] = v;
if (aug > l->c)
aug = l->c;
se[d] = l;
ne[v] = l; //非常重要!!!!
v = d;
--------------------------------------------------------------*/
Tarjan算法需要复习了!!
3月28日
好几天没写日记了,这周忙着应是,下周一一模了,杯具.
一模以后就冲刺吧!
3月29日
离线BST可以通过离散化+二分转化成为线段树.
3月31日
一模结束.物理100,化学100,数学146,语文129,政治,历史,英语
如果后面三门没问题这次应该有全年级前10了.
/*
描述线段,矩形的2种方式:
1.数字对应界点
----+-----+-----+------+----+-----+-----+
0 1 2 3 4 5 6
2.数字对应区间
----+-----+-----+------+----+-----+-----+
0 1 2 3 4 5 6
*/
今天做了JSOI2010冬令营的一题,要离散化再用极大化思想.
我自作聪明地以为只要求left(悬线向左移动的最大距离),不用求right.但是这种情况就错了:
-----#####---|
-----#####---|
-----#####---|
-----#####---|
-------|-----|
-------|-----|
-------|-----|
悬 悬
线 线
1 2
像这样,如果只求left,那么悬线2代表的意义就是右边的那个矩形,但是实际上面积最大的是下面那个.
求出悬线1的left和right才是正道.
倪泽堃神牛的单调队列法写出来是错的,不知道为什么.
4月1日
1.
今天上午解决了JSOI冬令营的"得分高手",就是要求一个很窄的矩阵中取数,
要求3个连续的同一行或3个连续的同一列菜可以取.不是每一个格子上都有数.
用状态压缩DP解决了.
2.
上午学习了高斯消元,还需要巩固.
3.
/*
下午问了下成绩,语文129,数学146,
英语150,物理100,化学100,
政治48,历史48,体育30, 总分751.
年级最高752分,全年级第3名,也算破了上次第4名的记录了.
物理,化学,英语满分,是这次比较好的地方.
但是历史最后一题错了,把问题想得太复杂,不然全年级第一了.
数学一道填空题曾经做过,这次却做错了,要引起注意.
*/
4.
做了CEOI2008的order,用SAP超时了.
把邻接表换成矩阵,快了许多,AC.
/*--------------------------------------------------
||启示:并不是所有的图都是邻接表快,稠密图邻接矩阵反而快.
\*--------------------------------------------------
5.
--#|-#####---
--#|-#####---
---|-#####---
---|-#####---
---|-|------- <--------"图"
---|-|-------
---|-|-------
悬 悬
线 线
1 2
今天又发现了我的极大化矩形算法的一个错误,昨天做那条要离散化的题目居然没发现,还AC了...
不能用
if (h[i][j] <= h[i][j - 1])
left[i][j] = left[i][j - 1] + 1;
//Wrong!!!!
而要求出当前点左边第一个障碍点,然后
if (g[i - 1][j])
left[i][j] = min(left[i - 1][j], gl[i][j]);
else
left[i][j] = gl[i][j];
反例如图,悬线2向左移动的距离不等于悬线1向左移动的距离+1.
6.
晚上做了一题,给出0-1矩阵,可以交换任意两行或两列.现在要求在有限步内使主对角线上全是1.
其实就是二分图匹配.只要保证每行每列有且仅有一个1,再通过行交换一定能满足要求.
7.
还做了一条费用流,比较窘.题目的数据规模打错了,结果我狂WA.数组开大10就倍AC了...
4月2日
1.
早上做了JSOI以前的一条省选题"北欧滑雪",DP.采用线段树优化,1A.
这题中要维护2个独立的区间最大值,可以写2个线段树.
但是我玩了点小聪明,一个线段树解决问题.
技巧是每次操作线段树的时候把那个记录每个节点最小值的数组也传递下去.
即
int getmax(int *d, int t, int l, int r, int rl, int rr);
void fix ( int *d, int t, int l, int r, int p, int a);
|
|
int *d :记录每个节点最小值的数组
还有一个技巧:
#define LC (t << 1), l, m
#define RC ((t << 1) + 1), m + 1, r
然后...
if (rr <= m)
return getmax(d, LC, rl, rr);
从某神牛学来的....
2.
今天上午很郁闷,调试NOI09PVZ很久没过.最后终于找到原因:
比如:
s---->1---->2---->t
^ |
| |
+-----+
1和2形成了一个环,如果直接在这个图上面拓扑排序,连汇点也会被删除...
所以不能怕麻烦,要先建图,toposort后在建网络.
3.
学习了KM算法.
但是不会用,以后直接上费用流......
4.
做了骑士共存问题,由于偷懒,狂WA.
用稍微麻烦的方法重写,AC.
5.
做了魔术球问题
/*
问题描述:
假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,4的球。
(1)每次只能在某根柱子的最上面放球。
(1)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。
试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可
放11 个球。
*/
经典的最小路径覆盖,二分图.
//*****************************************************************
有一个技巧:
for (int i = 1; i <= ans; i++) {
if(matched[i])
continue;
memset(vis, 0, sizeof(vis));
if (find(i))
match++, matched[i] = true;
}
每次放入一个球,不必从头开始匹配,可以利用上一次的结果.
但要注意的是,如果一个点已经被匹配,那么match(这个点)仍然为true,
但是匹配数没有增加,所以要记录是否被匹配.
//*****************************************************************
6.
做了[SCOI2007]蜥蜴
/*
在一个r行c列的网格地图中有一些高度不同的石柱,
一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。
每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,
即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。
石柱都不稳定,每次当蜥蜴跳跃时,
所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),
如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。
任何时刻不能有两只蜥蜴在同一个石柱上。
*/
这题一看就知道是网络流,写了个dfs的垃圾算法,代码长度最短,时间效率倒数.
/*
int dfs(int v, int aug) {
if (vis[v])
return 0;
int t;
vis[v] = true;
if (v == n)
return aug;
for (int i = 1; i <= n; i++)
if (g[v][i])
if (t = dfs(i, min(aug, g[v][i]))) {
g[v][i] -= t;
g[i][v] += t;
return t;
}
return 0;
}
int MaxFlow() {
int t;
int re = 0;
memset(vis, 0, sizeof(vis));
while (t = dfs(1, inf)) {
re += t;
memset(vis, 0, sizeof(vis));
}
return re;
}
*/
4月3日
1.
上午写了2题,WA
2.
晚上写了 [SCOI2005]互不侵犯King
状态压缩DP,简单.
4月4日
1.
终于解决了AHOI2009维护序列,线段树.
/*
有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式:
(1)把数列中的一段数全部乘一个值;
(2)把数列中的一段数全部加一个值;
(3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。
*/
解决的方法很巧妙,如果每次递推下去,那么每次维护时O(n)的.一种方法是先把要处理的堆积下来,要用的时候再处理,平均O(log n)了.
但是,我犯了一个错误,检查了很长时间.
if (mul[t] != 1 || add[t] != 0) {
update(Left, mul[t], add[t]);
update(Right, mul[t], add[t]);
mul[t] = 1; add[t] = 0;
}
if (mul[t] != 1 || add[t] != 0) {
update(Left, a, b); //Wrong!
update(Right, a, b);//Wrong!
mul[t] = 1; add[t] = 0;
}
悲剧
2.
重写上个代码,约25minAC,效果不错.
看来编码技巧是很重要的.
宏定义,以及oimaster的线段树,使程序简单了许多.
3.
做了[ZJOI2007]仓库建设
24天没写这类题目,居然忘得差不多了.
结果整了2h...
还有一点,当数据比较大时,维护凸包要用叉积,不能用斜率,不然精度会有问题.
4.
[ZJOI2009]狼和羊的故事
最小割.
30min AC
犯了一个弱智错误:
l1->anti == l2; // X
|
|
l1->anti = l2; // OK
囧...
5.
做了Help Jimmy O(n log n)的算法.
采用oimaster的思想,由于每一个点有多个前驱,但只有一个后继,
所以倒过来做,从下往上推,线段树要写一个区间覆盖.
模仿了前面(1)(2)的线段树(当然不是照着写的),1AC.
4月5日
1.
做了[ZJOI2010]network 网络扩容
就是求最大流,和一次费用流,45min,2次AC.
求费用流的时候可以直接在最大流残留网络上增广.
为了限制增加的流量,可以附加一个新的汇,将老的汇和新汇之间连一条容量为需要扩大的有向边.
memcpy(ne, de, sizeof(de));
这句话漏了囧
还把m打成n了囧
第一次PE了,囧啊啊啊啊啊
应该是
ans1 ans2
我打的却是
ans1
ans2
囧啊啊
以后要注意了,省选的时候遇到这种问题就爆0了囧
2.
看了[浅谈补集转化思想在统计问题中的应用]
ORZ
写的不错,有2例题:
1.单色三角形问题{把单色三角形计数转化为多色三角形计数}
2.海战游戏{把符合规则的计数转化为不符合规则的计数}
其实平时做题的时候经常用到这个思想,比如最大权闭合图[最大获利,PVZ]等
再次ORZ
3.
今天很不顺
4月6日
1.
做了JSOI2009的题.
day1就1题会做,160+
day2也一样,100+
...
16人的话"理论上"能进
day2最后一题比较囧
2.
晚上做了一条
状态压缩DP,用2*1和2*2-1*1(L型)填充n*m矩阵,输出纠结了好久.1hAC.
3.
做了一条数学题
在n*n棋盘上放k个Rook(车),求方案.
囧,数学太差,组合计数都不会.
ans = C(n, k) * C(n, k) * k!
4.
做了一条
状态压缩DP,在n*n棋盘上放King,二了:
/*
if ((q || (q << 1) || (q >> 1)) & p)
//Wrong!!!
if ((q | (q << 1) | (q >> 1)) & p)
//Right
怎么能犯这种错误......谨记谨记
*/
SGU ID 040185
4月7日
1.
早上不顺
2.
下午做了几条状态压缩DP
再次犯昨天错误4
3.
练习Treap,写了 POJ2761 Feed the dogs
即起点,终点都单调不降的区间询问k-th,Treap解决.
1.5h 1A
4.
学习了bat对拍技术,ORZ佳佳
5.
写堆居然错了!!!!!!!!!!!!!
//BUG!!!!!!!!!!!!!!!!!!
if (d[i] > d[lc(i)] && d[i] > d[rc(i)])
break;
这句话漏了!!!!!!!!!!!!!!!!!!!
调试了3h,囧,幸好现在发现了!!!!!
谨记!!!!