9.week1
就直接不管时间顺序了吧
由于开学了,所以说做的题目不算多,虽然说主要是人比较菜
Maximum Subarray
这个还是挺板的\(DP\),直接分层最大子段和就行了.
注意越界问题!
还有统计答案方面的问题,你理解第二位应该是有多少位是生效的魔法,因为还可以把其他的魔法放在后面,所以说 \(DP\) 里面长这样:
void Dp(){
F(i,0,n)F(j,0,k)f[i][j]=INT_MIN;
f[0][0]=0;
F(i,1,n){
f[i][0]=max({f[i-1][0]+a[i],0ll});
if(i<=n-k)ans=max(ans,f[i][0]);
F(j,1,min(i,k)){
f[i][j]=max({f[i-1][j]+a[i],f[i-1][j-1]+a[i]+2*x,0ll});
if(i<=n-k+j)ans=max(ans,f[i][j]);
}
}
}
还是挺好理解的.
Same Count One
这个贪心思路很简单啊,不说了.
顺着贪心模拟就做完了....
Santa's Bot
概率模拟题.
我简单写一下概率的公式?
\(siz[x]是x集合的大小,num[y]是y出现的集合个数\)
就这了.
Doremy's Number Line
我的目标是让\(k染上p_1\),也就是说,我要让\(k<a_1||k<max\{有颜色的位置,a_i\}+b_i\)
那么我们可以先分个类:
1.当\(k<a_1\)直接成功
2.当\(k>a_i+b_i\)直接无解
3.非两者,那么就是别人先染个色然后再是\(a_1\)
那么我们就有了一个贪心策略,就是优先处理\(a_i+b_i\)大的,视这个染色为让\(k\)减小一个\(b_i\)
问我为什么代码不是这个?
因为没有调出来也没有看懂题解的牛马代码
这里有另外一个思路:

理解了吗?
没有的话就之后再理解吧!
(喵了个喵 Ⅳ)[https://www.luogu.com.cn/problem/P9575]
\(Ad\_hoc\),不愧是你.
首先,如果\(n\)为偶数,明显可以直接\(gcd(1,x)\)来让权值全变成1
然后如果\(n为奇数且a_i为奇数\)就会无解(这个是给了一档数据,良心啊)
这个提示我们分奇偶讨论\(a_i\)
考虑\(gcd\)的性质,x为奇数\(gcd(x,a_i)\)之后肯定还是奇数(不存在偶因子)
那么这必然导致不能均分,就解释了特殊分为什么要存在偶数了.
既然x一定是偶数,那么之后就是
题解时间了

如果还没有完全懂就自己手搓一个例子就知道这个为什么能变成\(1/2\)序列了.
GT考试
很巧妙的题目.
我们先考虑dp.
可以发现这每加入一位就是在求一位kmp,一旦匹配成功了就挂了.
dp状态就很明显了,就是现在是第几位,匹配成功多少位.
你可以预处理一个\(g\)数组来表达失配的转移.
就是$ g[i] [j]$ 表式从成功\(i\)长度到成功\(j\)长度可能的方案数
那么dp的转移是:
我去,这不是我们矩阵快速幂的题吗.
是的,这里可以直接换成矩阵形式,然后就结束了.
SAM-Toy Cars
很明显的贪心策略:让下次出现尽可能晚的先踢出队列
问题是怎么实现呢?
首先 , \(priority\_queue\) 并不支持随着全局函数的改变而改变堆里的相对位置.
所以说我们遇见了更新下次出现位置的情况,直接不管这个应该被踢出去的玩具,直接新加入一个格子放置这个玩具的下一个以及下下次出现的位置作为键值.
这样就结束了.
Domino
这个题目要观察一下性质.
我们手推的时候发现,对于一个\(2*2的格子,我们有2种放法吗,对于2*3,有3种,2*4有5种\)
是斐波那契.
为什么呢?
因为对于\(x的方案数可以由x-1+一个竖着转移来也能从x-2+两个横着的转移来(为了防止重复就不要再考虑两个竖着的了,这很明显)\)
然后我们要做的就是怎么样用斐波那契来最小组成所问的数了.
实际上dfs就行,因为斐波那契是指数级的,所以说如果可以消减那就是指数级的消减,否则就是无解.
咳咳,实测可以被卡,而且很好卡.只要让一个小斐波那契项出现次数很多我就挂了.
所以说还是要点优化:能除的一次除完.
就这了.
PATULJCI
板中板莫队,虽然说复杂度有点问题但是暴力莫队小常数可过
ARTUR
一个简单的计算几何+拓扑排序.
由于线段的数目很少,所以说你直接\(n^2\)建边就行.
问题是怎么判断遮挡.
注意这里已经保证了线段不交,这个很重要,很能简化问题.
int check(Node a,Node b){
int f=1;
if(a.x1>b.x1){f=-f;swap(a,b);}
if(a.x2<b.x1)return 0;
double K,B,tmp;
K=1.0*(a.y1-a.y2)/(a.x1-a.x2+eps);
B=(double)a.y1-K*a.x1;
tmp=K*b.x1+B;
if(tmp>b.y1)return f;
return -f;
}
接下来一步一步解释这个函数
首先是钦定\(a\)为左端点最前的线段.
如果\(a\)的右端点比\(b\)的左端点小,说明两者没有遮挡关系
否则你输出\(a\)的直线解析式然后带入\(b\)的左端点,如果说交点纵坐标比左端点的纵坐标大说明\(b\)对\(a\)遮挡
否则就是\(a\)对\(b\)遮挡.
你在考虑为什么是左端点而不是右端点.
因为这个线段保证不交,你画画图应该就懂了.
这样就结束了.
抛硬币
这个其实挺难的,需要对期望有很高的理解 (其实不高,就是我菜)

然后就是矩阵快速幂了.

浙公网安备 33010602011771号