poj3320
链接
题意
一本书有P页,每一页都一个知识点,求去最少的连续页数覆盖所有的知识点。p<1e6
题解
先考虑一个暴力做法,枚举所有的方案,此做法复杂度,n^2然后我们尝试dp,
dp[i]代表页数[0:i]中以i结尾的,覆盖了所有的知识点的最大的页数起点
显然 起点j ---> dp[i] j<i
容易证明:dp[i]关于i单调不减
加速判断过程,可以map记录,也可以hash映射,
然后我惊讶的发现此做法竟然就是尺取法。
#include<bits/stdc++.h> #define ll long long using namespace std; void read(ll& x) { int f = 1; x = 0; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } x *= f; } void read(int& x) { int f = 1; x = 0; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } x *= f; } ///--------------head-----------------------------------------------------------------------------/// ///--------------head-----------------------------------------------------------------------------/// ///--------------head-----------------------------------------------------------------------------/// ///--------------head-----------------------------------------------------------------------------/// ///--------------head-----------------------------------------------------------------------------/// ///--------------head-----------------------------------------------------------------------------/// ///--------------head-----------------------------------------------------------------------------/// ///--------------head-----------------------------------------------------刚好五十行----------------///
//究极读入挂 inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int _read(){ char ch=nc();int sum=0; while(!(ch>='0'&&ch<='9'))ch=nc(); while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); return sum; }
通过四题
两签到
两中等
目前赛后补三题
1.求解不定方程ax+by=c使得p2*x2+p1*x+q2*y2+q1*y最小
拓展欧几里得算法
二次函数的极值暴算
2.有个人要从一条直线走到另一条平行线,中间有几个圆,在直线和圆上走不消耗体力,其他消耗体力的与路程正比
计算几何及最短路模型转化
3.括号匹配,一个序列有很多很多不同括号,问你任意区间括号是否匹配
有两种做法,第一是记录括号入栈后栈顶元素
第二是根据括号唯一匹配,维护每个区间是否封闭匹配,即维护区间匹配对象的最值
4.构造一个矩阵使得每一行每一列都包含了所有的数字(1-N)且对于所有的 1 ≤ i < j ≤ n, 有 Ai,j ≠ Aj,i。
通过已有矩阵来构造未知矩阵
5.现有N个数a1,a2,...,aN。对于每一个ak,求有多少个有序二元组(i,j)满足,其中P为一给定质数。
根据原根性质将乘法转化为加法,再转化为fft
通过三题
签到两题
中等一题
目前赛后未补
1.计算一个矩阵与另一个01矩阵的积的所有元素的异或和
矩阵分块加速乘法,每八个元素预处理一次,乘时O1查询,共计加速八倍
通过两题
签到两题
赛后补四题
1.马走日
日了狗了
2.树上包含每个点的连通点集的数量
树上dp,两次dfs,第一次维护节点子孙数,第二次维护其他方向子孙数
第二次维护注意坑爹的逆元不存在情况
3.修修和栋栋轮流取石子,每人每次需要从任意一堆石子中取走个,修修先手。无法操作的人失败。此外,如果一个人取完了一堆石子,他会立即获胜。
sg函数,设定a-b是不可到达的状态,并发现循环节且特判a=1即可
4.二分图是否存在,不存在找奇环
一次dfs,或者镜像并查集+dfs
通过五题
五个签到题
通过一题
一个中等题
赛后补一题
1.中有多少不同的数,这些不同的数字里面第k大的是多少。
证明一下什么时候是2*sqrt(n)什么时候是2*sqrt(n)-1就行
2.an=m0an-1+m1an-2+c
蒙哥马利快速模乘 或者运气好的O1快速乘法
通过三题
三个找规律的题搞了半天
还用上了rmq二分。。。
通过三题
一签到
一中等找规律
一个模拟
1.记住log2的值,就可以做了
2.魔方展开