其他分享
首页 > 其他分享> > Gym103098(2020-2021 Winter Petrozavodsk Camp, UPC contest)

Gym103098(2020-2021 Winter Petrozavodsk Camp, UPC contest)

作者:互联网

链接

I. Interesting Scoring Systems

J. Joyful Numbers

K. Königsberg Bridges

L. Long Grid Covering

签到题。

A. Adjacent Rooks

\(GF\) 大失败,\(dp\) 大胜利。

填排列一种很经典的 \(dp\) 是从小到大依次插入,这样能比较好处理相邻数之间的关系

所以设 \(f_{i,j,0/1}\) 表示到 \(i\) 有 \(j\) 个连续,\(i\) 和 \(i-1\) 是否相邻。

插入一个数分讨,可能使连续数 \(+1,-1\) 或不变。

B. Beautiful Permutation

打表构造?出题人坚持这是本场最难的题,严谨构造也不怎么看得懂。

直接推柿子可以发现:

\[\sum b \equiv \sum a- \sum i (mod \ \ 2) \\ \frac{n(n-1)}{2} \equiv n(n-1)(mod \ \ 2) \]

所以 \(n \% 4=2/3\) 都无解,然后打表剩下都有解。

\(n \% 4\) 提醒我们可以考虑 4 个分成一组或分成 4 组,钦定前 \(n/4\) 个倒序然后看表,看有没有比较顺的答案。

下面是在 \(n=16,17\) 找出的比较合理的答案

//15 14 13 12 3 11 10 9 8 6 5 4 2 1 0 7 
//16 15 14 13 4 12 11 10 9 7 6 5 3 2 1 0 8
if(n%4==0){
    for(int i=0;i<n/4;i++) a[++tot]=n-1-i;
    a[++tot]=n/4-1;
    for(int i=0;i<n/4;i++) a[++tot]=n-1-i-n/4;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/2-2-i;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/4-2-i;
    a[++tot]=n/2-1;
}
else{
    for(int i=0;i<n/4;i++) a[++tot]=n-1-i;
    a[++tot]=n/4;
    for(int i=0;i<n/4;i++) a[++tot]=n-n/4-1-i;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/2-1-i;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/4-1-i;
    a[++tot]=0; a[++tot]=n/2;
}

C. Cartesian MST

直接展开成 \(n*m\) 的网格,然后还是跑 \(kruskal\) ,每次加一条边相当于合并两行/两列,加的边数就是剩余列数/行数,直到最后缩到一个点。

复杂度 \(O((n+m)log(n+m))\)。

D. Display of Springs

回忆一下李超树的过程:对于每个节点找出中点最大的,然后标记永久化。

所以建树比较次数 \(O(nlogV)\) ,查询比较次数 \(O(logV)\)。

E. Even Intervals

\(5e4\) 可以离线还是 20s,莫队+权值线段树即可。

F. Friendship Circles

考虑要使圆包含 0 而不包含 \(x\) ,那么必须要满足圆心在 0 和 x 中垂线靠 0 这一侧。

所以直接半平面交,在交后的图形内任意一点做圆过 0 保证和其它点不会相交,所以只要看多少线构成这个交即可。

题解比较 nb,考虑圆反演:

首先如果有解那么肯定存在一个圆过两个点符合要求。对于 0 圆反演,那么这个圆就是一条直线,在圆内的靠外,圆外的靠内。

因为是个双射,所以我们可以通过圆反演之后的图形来做:如果有一个点可以,那么就是存在一条直线使得仅有这个点在直线外。

所以只有凸包上的点合法。

G. Game on a Tree

好像挺有意思的,留坑待填。

标签:12,Winter,所以,Gym103098,sum,contest,反演,比较,dp
来源: https://www.cnblogs.com/Forever-666/p/15473199.html