Link
似乎是白书某个角落的一道思考题??
Solution
把区间离散化成2n个点
连边
S->1 <K,0>
2n->T <K,0>
i->i+1 <inf,0>
l[i]->r[i] <1,w[i]>
然后跑最大费用最大流。
因为一条增广路互不相交,所以可以尽情走,走出K条就完成了任务。
似乎是白书某个角落的一道思考题??
把区间离散化成2n个点
连边
S->1 <K,0>
2n->T <K,0>
i->i+1 <inf,0>
l[i]->r[i] <1,w[i]>
然后跑最大费用最大流。
因为一条增广路互不相交,所以可以尽情走,走出K条就完成了任务。
默认每天都碎觉,每长度为K的区间,可以把天转化成歘饭。。
修改一个点i,可以影响的区间的右端点的区间为[i,i+K−1]。
现在问题转化成有n−K+1点和n个区间,选择一个区间会产生相应获利,在每个点有[l,r]个区间覆盖着的前提下,获利尽量大。
建图
1
2
3
4S'->S <r,0>
S->1..k <1,0>
i->i+1 <r-l,0>
i->i+k <1,s[i]-e[i]>
对于i≥K,一个i->i+1的剖面,流量是r。把不改变的天数限制在[0,r-l],那么改变的天数就满足了限制。
对于i<K,?
1 | #include <cstdio> |
真⋅对计数一窍不通。
同样的题,人家写20行就搞定,我写120行依然出问题。
分类。 可以分成(a+b+c)+3d或者(a+d)+(b+c)+2e
第一种情况,枚举c,枚举d,维护一个数组找a+b=d−c的方案数
第二种情况,有a<b<c<d,a<b=c<d,a=b<c=d,a=b=c=d四种。要分别处理,并且添加一个限制(比如限定当前选择的是最大的)确保不重复。
1 | #include <cstdio> |
被faebdc的shadow坑惨了。在考场上才发现自己的3D计算几何知识基本为0。
已知点P=(x,y,z),把它沿着转动θ∘(从与向量相对的角度看过去,点是逆时针旋转的) 首先可以给出绕三个轴的旋转矩阵
Rx(θ)=⎣⎡1000cosθsinθ0−sinθcosθ⎦⎤Ry(θ)=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤Ry有些不同,因为Ry的变化中z等价成了二维的x轴,x被等价成了y轴
Rz(θ)=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤对于这三个特殊的旋转轴我们已经有了解决方案了,那么对于任意的轴要怎么办呢?我们可以将这个旋转分解: 将整个坐标轴旋转,使得旋转轴和z轴重合 再将点P绕z轴旋转θ角 再将整个坐标轴旋转回原位
算了直接上结论。。Miskcoo
⎣⎡cosθ+x2(1−cosθ)yx(1−cosθ)+zsinθzx(1−cosθ)−ysinθxy(1−cosθ)−zsinθcosθ+y2(1−cosθ)zy(1−cosθ)+xsinθxz(1−cosθ)+ysinθyz(1−cosθ)−xsinθcosθ+z2(1−cosθ)⎦⎤还是很优美的。
设平面的法向量为,平面上有一点P。有直线。
设交点为C,则
解得
当的时候,显然交点不存在。
这种法线的操作对于二维的线线相交依然适用,比面积法或者体积法显然得多,好记得多,而且数值稳定性并没有损失。
附上一道练手题目:Shadow
这道题目存在更简洁的做法,但是为了强行套模板,我选择了一种非常难受的转化:把坐标系强行转化成地面是坐标平面,转化成把(0,0,0),B,C构成的三角形转到xOy面上。详见代码,实在是恶心得不想多说。
写完1A好评。
1 | #include <cstdio> |
显然可以暴力DP。对小范围打表找规律可以得结论。 然后套Wallis公式 (2n−1)!!(2n)!!∼√πn Ans≈2n+1√πn
1 | #include "lucida" |
在树上画一画,可以发现路径覆盖的充分必要条件。 二维条件,转化成寻找覆盖一个点的权值第K大矩阵的问题。 用整体二分实现
1 | #include "lucida" |
先不管颜色的限制 形式化条件:(len[x]为x到根节点的距离) Ans=pos∑len[u]+len[pos]−len[lca(pos,u)] 可以把len[u]和len[pos]都提出来,答案就变成了计算pos∑len[lca(pos,u)] 也就是u,pos到根节点路径的交集。这个可以通过先把每个点到根节点的路径都覆盖一遍,查询时候只需要统计出∑v[e]coverCnt[e]即可。可以通过线段树实现。其中标记永久化的处理非常有意思。 套上了颜色的限制,就仿照序列主席树的做法,把点按照颜色排序,顺序依次覆盖。 空间上界是O(nlog2n)的,但是似乎跑不满。 时间是O(nlog2n),常数小,跑得非常快。
1 | #include "lucida" |
这个做法比较显然,保留分治结构,用vector记录按照颜色排序之后的前缀和。查询时二分查找。 时间O(nlog2n),空间O(nlogn)。然而常数非常大
1 | #include "lucida" |
想了一种可持久化可并堆的做法,感觉空间要炸 再仔细想想: 1≤K≤20MDZZ!!
1 | #include "lucida" |
非常神奇的思路。 每个集合Bk的元素一定是≤k的数字。这些数字,是几个集合求交的得到的。一切集合追溯到本源,都来源于虚无(∅)。如果把每个集合抽象成到∅的路径,每个集合的构造过程就是几条路径的并集,加上一个新点。这是一个树结构,然后就可以通过LCA实现求交,通过DFS序实现求并集的大小。
集合交:路径交 集合并:路径并
1 | #include "lucida" |
对[1..n]这个答案序列分块!!为什么我总是想把树分块。。。 想到这,接着就比较好说了。 修改一个点对块的影响,是使得它在块内的祖先的权值都相应变化。块内的祖先个数,可以O(n√n)地预处理出来。 这样整块的统计是O(√n)的,那么零碎部分的也尽量O(√n),那就要求每个点的求值是O(1)的。显然常见套路树状数组做不到。 那么再用dfs序分块替代树状数组。同样支持区间修改,询问变成O(1),修改O(√n)。总复杂度就是O(n√n)了。
1 | #include "lucida" |