又是一年省选时,昨天比赛了一天,比较累,但是结局还好。
比赛的成绩wyfenger第一,我第二,认识的人中进入省队的还有 省实验中学的3个(王梦迪(初三),王宇飞,常跃如),郑外的陈科。
结果出来前比较忐忑,因为毕竟这可能是OI生涯的结尾,不过即使可以参加Noi,也只剩下3个月了。
前两题很简单,简直是NOIP普及组水平,以至于刚开始看到第2题还以为是最小费用最大流,但问题是没有搞到200的人很多,也许河南真的是没有多少人好好学Oi吧!至于第三题,是和牛棚的灯一摸一样原题!(比赛前我还看到了这题,但是没有写)其实 我已经写出 Gauss-Jordan消元法,但是没有考虑多解的情况,检查了半天不对,所以最后还是写了个暴力,总共230
下午的比赛比上午难一些,第一个问题可以用线段树Ac,但是形式不太一样,不过不是很难想,想了10分钟,加之看到第二题像是个恶心的搜索……所以就决心搞第一题,写了1h,调试+对拍了1.5h(手动对拍),最后还好100分,否则就很悲剧了,(无力吐槽这题的数据,最裸的暴力算法就可以搞到60分)
而第二题其实可以用最短路做,甚至也有模拟Ac的办法,而我在第一题上花了大部分时间,最后仅仅交了个骗分(输出-1能得30……)
总共130
去年省选比今年质量高多了,难度也大多了。。
今后恐怕就不能用win8了,
第一
还有大约5天就到期了
第二,Noi是在Linux下的,所以只能乖乖的用Ubuntu了。
时间已经很少了,水平还差得很远。
又是一年省选时,这是最后一次省选了。
接下来一个星期就复习已学算法吧。。
(只搞下划线的)
1 搜索(...)
2 动态规划
2.1 普通数据结构的动态规划 (按方式)
2.2 记忆化搜索(树形动态规划) (按方式)
2.3 实现博弈问题的求解类型 (按类型)
2.4 状态压缩 (按类型)
3 构造模拟
4 离散数学
4.1 图论
4.1.1 短路径问题
4.1.1.1 单源最短路 MC
4.1.1.1.1 迪杰斯特拉
4.1.1.1.2 有负权回路 Bellman-ford 或 SPFA
4.1.1.2 每个顶点的最短路
4.1.1.2.1 类似传递闭包的floyd算法
4.1.1.3 次短路径
4.1.2 拓扑排序算法
4.1.2.1 DFS求序
4.1.2.2 每次删去没有入度的点
4.1.3 生成树
4.1.3.1 最小生成树
4.1.3.1.1 Prim
4.1.3.1.2 Kruscal
4.1.3.2 次小生成树
4.1.4 连通性
4.1.4.1 强连通分支
4.1.4.2 割,桥算法
4.1.5 网络流
4.1.5.1 最大流流算法:
4.1.5.1.1 福德福克森
4.1.5.1.2 压入与重标号
4.1.5.1.3 Dinic
4.1.5.2 最大流的变种
4.1.5.2.1 有容量下限的网络流
4.1.5.2.2 可行流
4.1.5.2.3 二分图匹配
4.1.5.2.3.1 二分图匹配算法
4.1.5.2.3.1.1 匈牙利算法
4.1.5.2.4 对平面图求最大流(转化为求最短路问题)
4.1.6 回路 通路
4.1.6.1 欧拉回路 通路
4.1.6.1.1 普通的套圈算法
4.1.6.1.2 混合图的算法 NL
4.1.6.2 哈密顿回路 通路
4.1.6.2.1 算法(NP) NL
4.2 组合数学
4.2.1 计数
4.2.1.1 乘法/加法 原理
4.2.1.2 组合计数
4.2.1.2.1 排列组合
4.2.1.2.1.1 有重复的排列与组合,将物体放进盒子里的计数问题
4.2.1.3 数列
4.2.1.3.1 递推关系
4.2.1.3.1.1 求解递推关系
4.2.1.3.2 数列极限求和
4.2.1.4 容斥原理
4.2.1.5 矩阵运算
4.2.1.6 自动机
4.2.1.6.1 有限自动机
4.3 序的应用(见2005国际集训队队员龙凡论文
4.4 数据结构
4.4.1 基本数据结构,Stack,Queue,HASH
4.4.2 树
4.4.2.1 各种平衡树 RBT,SBT,Splay,AVL,Treep
4.4.2.2 线段树
4.4.2.3 堆
4.4.2.3.1 二项堆 斐波那契堆
4.4.2.3.2 Trie
4.4.2.3.3 后缀树
4.4.3 并查集
5 线性代数
5.1 向量
5.2 矩阵
5.2.1 行列式
5.2.1.1 基尔霍夫矩阵(求行列式值)
6 数论
6.1 素数
6.1.1 质因数分解
6.1.2 检查质数
6.1.2.1 筛法
6.1.2.2 O(N0.5)检查
6.2 用高斯消元法求解线性方程组
6.3 二分快速幂
6.4 同余模方程
7 计算几何
7.1 线段,点的位置关系
7.1.1 检查线段是否相交
7.1.2 凸包
7.1.2.1 寻找点集S的凸包算法
7.1.2.2 ???
7.1.3 最小圆覆盖
8 字符串
8.1 字符串匹配
8.1.1 KMP算法
8.1.2 RP算法
8.1.3 O(L|∑|)的字符串匹配自动机
8.1.4 AC自动机
8.1.5 后缀自动机
8.1.6 ???
9 其他
9.1 分块算法(O(n0.5))
问题大意是 给定一个无向图,求最小的Q使得标记Q个点后其它所有点都可以到达这Q个点中的某个点 , 以及方案数。
对于每个联通块:
的
总是想得很复杂,其实很简单。
用O(n2)或者O(nlogn)的时间复杂度统计出fi即以i开始的最长上升序列是多少
因为字典序的缘故,暴力找最优解
假设某次询问是a,给定的数列是{Ai}
对于第一个位置,为了使字典序最小,我们一定选最早的i,使得fi1>=a
对于第二个位置,Ai2一定 且fi1>=a-1所以接着向后找第一个满足着两个条件的位置
……
这一段的代码:
for(int i=1;i<=M;i++){ int j,a,b,pr; fin>>a; b=0; A[pr=0]=-1; for(j=1;j<=N;j++) if(f[j]>=a && A[j]>A[pr]){ Ans[++b]=j; a--; if(!a) break; pr=j; } if(b<a){ fout<<"Impossible\n"; continue; } for(j=1;j<=b;j++) fout<<A[Ans[j]]<<" "; fout<<endl; }
调Splay太恐怖了,虽然不难,但是为什么bug这么多。。。这里记一下原则性问题吧。。。
类名叫SplayTree
int v,size;//分别是键值,子树大小, bool pl;//place 表示该节点在父节点的哪个位置 ST *pr,*suc[2],*Nil;//分别表示前驱,两个后继,和Nil节点的位置
/*由于SpayTree太长了,一下所写为ST*/ void mt();//maintain 即维护Splay,保证信息的正确性 void ini();//初始化,将所有的前驱后继都改成Nil void trans(ST *tar,bool place);//将该子树移动到tar的place边(place=0表示左子树,反之右子树) void rotate();//旋转,一个函数搞定左旋/右旋 void Splay();//核心操作,即将某节点提到根 ST *find_v(int fv)//找到fv所在的位置,找不到返回它应该在的位置的根(按照数字值查询) void insert(int iv/*也可以是 ST*p */);//插入iv到相应位置 void find_s(int pos);//按照size找第pos小的元素,也就是如果要求第pos小的元素是哪个,就可以用这个函数在O(lgn)的时间复杂度内完成 ST *fmin/*或fmax*/();//找到最小值所在的位置(返回指针) void merge(ST *obj);//将obj所在的Splay合并到该节点所在的Splay...
void trans(ST *tar,bool place){//ST::移形换位 pl=place; pr=tar; tar->suc[pl]=this; } void rotate(){//旋转 bool ppl=pl; ST fprev=*pr; suc[!pl]->trans(pr,pl);//移动子树 pr->trans(this,!pl);//移动原前驱 trans(fprev.pr,fprev.pl);//移动该节点 suc[!ppl]->mt(); mt(); } void Splay(){//Splay操作 while(pr!=Nil){ if(pl==pr->pl && pr->pr!=Nil) pr->rotate(); rotate(); } }
今天早上。。出于某种不可抗拒的原因,没心情写题,所以正好小记以下(我是按分类记录,不是按日期记录):
几周前写的"NOI 郁闷的出纳员"最后3组一直TLE,不明原因,但真正让我费解的是读入问题
明天安装Noi Linux再看看吧。
先声明一下下述的变量
N为总天数,
A[i]表示第i个数字,
f[i]和g[i]的定义见下文
Max=max(f[i])1<=i<=N
第一问就是个最简单的最长下降序列,f[i]表示当前包含第i个数字的最长下降序列,
第二问稍复杂,我的分析:
我的代码(因为答案可能很大,所以用了高精度,并重载了"+"运算